[clang] bcedb36 - [clang][bytecode] Support composite arrays in memcpy op (#132775)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 24 23:17:13 PDT 2025
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}} \
More information about the cfe-commits
mailing list