Author: Timm Baeder Date: 2025-03-25T07:17:10+01:00 New Revision: bcedb368e317332d99dbdde617ebc35140b10de3
URL: https://github.com/llvm/llvm-project/commit/bcedb368e317332d99dbdde617ebc35140b10de3 DIFF: https://github.com/llvm/llvm-project/commit/bcedb368e317332d99dbdde617ebc35140b10de3.diff LOG: [clang][bytecode] Support composite arrays in memcpy op (#132775) See the attached test case. Added: Modified: clang/lib/AST/ByteCode/InterpBuiltin.cpp clang/test/AST/ByteCode/c.c Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 285ea7151a9cf..d7de4c09e2614 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -2769,6 +2769,18 @@ static bool copyComposite(InterpState &S, CodePtr OpPC, const Pointer &Src, return true; } + if (DestDesc->isCompositeArray()) { + assert(SrcDesc->isCompositeArray()); + assert(SrcDesc->getNumElems() == DestDesc->getNumElems()); + for (unsigned I = 0, N = DestDesc->getNumElems(); I != N; ++I) { + const Pointer &SrcElem = Src.atIndex(I).narrow(); + Pointer DestElem = Dest.atIndex(I).narrow(); + if (!copyComposite(S, OpPC, SrcElem, DestElem, Activate)) + return false; + } + return true; + } + if (DestDesc->isRecord()) return copyRecord(S, OpPC, Src, Dest, Activate); return Invalid(S, OpPC); diff --git a/clang/test/AST/ByteCode/c.c b/clang/test/AST/ByteCode/c.c index 7cb7f96049f2d..fe47f9cab1c9f 100644 --- a/clang/test/AST/ByteCode/c.c +++ b/clang/test/AST/ByteCode/c.c @@ -203,6 +203,16 @@ const struct StrA sc = *sb; _Static_assert(sc.a == 12, ""); // pedantic-ref-warning {{GNU extension}} \ // pedantic-expected-warning {{GNU extension}} +struct ComplexS { + int a; + float b; + struct StrA sa[2]; +}; +const struct ComplexS CS = {12, 23.0f, {{1}, {2}}}; +const struct ComplexS CS2 = CS; +_Static_assert(CS2.sa[0].a == 1, ""); // pedantic-ref-warning {{GNU extension}} \ + // pedantic-expected-warning {{GNU extension}} + _Static_assert(((void*)0 + 1) != (void*)0, ""); // pedantic-expected-warning {{arithmetic on a pointer to void is a GNU extension}} \ // pedantic-expected-warning {{not an integer constant expression}} \ // pedantic-expected-note {{cannot perform pointer arithmetic on null pointer}} \ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits