[clang] [clang][bytecode] Don't check anonymous union in memcpy op (PR #191783)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 13 02:58:06 PDT 2026
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/191783
It's fine if they are uninitialized.
>From 5e7ce6c719cfb07107932bd146ec149ab618bb38 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Mon, 13 Apr 2026 11:48:27 +0200
Subject: [PATCH] [clang][bytecode] Don't check anonymous union in memcpy op
---
clang/lib/AST/ByteCode/Interp.h | 6 ++++--
clang/test/AST/ByteCode/cxx11.cpp | 12 +++++++++++-
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index 2ba223010d4ad3..39d30edd5cf02d 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -2428,8 +2428,10 @@ inline bool Memcpy(InterpState &S, CodePtr OpPC) {
const Pointer &Src = S.Stk.pop<Pointer>();
Pointer &Dest = S.Stk.peek<Pointer>();
- if (!CheckLoad(S, OpPC, Src))
- return false;
+ if ((!Src.getRecord() || !Src.getRecord()->isAnonymousUnion())) {
+ if (!CheckLoad(S, OpPC, Src))
+ return false;
+ }
return DoMemcpy(S, OpPC, Src, Dest);
}
diff --git a/clang/test/AST/ByteCode/cxx11.cpp b/clang/test/AST/ByteCode/cxx11.cpp
index 91c828abd87a9e..668228e2dc1669 100644
--- a/clang/test/AST/ByteCode/cxx11.cpp
+++ b/clang/test/AST/ByteCode/cxx11.cpp
@@ -345,6 +345,16 @@ namespace ReadMutableInCopyCtor {
// both-note {{in call to 'G(g1)'}}
}
+namespace ReadAnonUnionInCopyCtor {
+ struct G {
+ struct X {};
+ union U { X a; };
+ union {X a; };
+ };
+ constexpr G g1 = {};
+ constexpr G g2 = g1;
+}
+
namespace GH150709 {
struct C { };
struct D : C {
@@ -353,7 +363,7 @@ namespace GH150709 {
struct E : C { };
struct F : D { };
struct G : E { };
-
+
constexpr C c1, c2[2];
constexpr D d1, d2[2];
constexpr E e1, e2[2];
More information about the cfe-commits
mailing list