aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/AST/ByteCode/Compiler.cpp
diff options
context:
space:
mode:
authorTimm Baeder <tbaeder@redhat.com>2025-07-23 05:28:37 +0200
committerGitHub <noreply@github.com>2025-07-23 05:28:37 +0200
commit01b47eb86c991f88d3117f494ebd1826fd3ab41e (patch)
tree707102933bbe62bf4184616d03c1f6b90ceb4876 /clang/lib/AST/ByteCode/Compiler.cpp
parenteb0c863c447bf2ad4d35cfde39925a655c060fa5 (diff)
downloadllvm-01b47eb86c991f88d3117f494ebd1826fd3ab41e.zip
llvm-01b47eb86c991f88d3117f494ebd1826fd3ab41e.tar.gz
llvm-01b47eb86c991f88d3117f494ebd1826fd3ab41e.tar.bz2
[clang][bytecode] Only implicitly start lifetime of trivially-default-constructible union members (#149835)
See https://github.com/llvm/llvm-project/commit/faee39baa87e43f4b746dd77e479268391163658
Diffstat (limited to 'clang/lib/AST/ByteCode/Compiler.cpp')
-rw-r--r--clang/lib/AST/ByteCode/Compiler.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 07efd6f8..e760055 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -25,11 +25,18 @@ using APSInt = llvm::APSInt;
namespace clang {
namespace interp {
+static bool hasTrivialDefaultCtorParent(const FieldDecl *FD) {
+ assert(FD);
+ assert(FD->getParent()->isUnion());
+ const auto *CXXRD = dyn_cast<CXXRecordDecl>(FD->getParent());
+ return !CXXRD || CXXRD->hasTrivialDefaultConstructor();
+}
+
static bool refersToUnion(const Expr *E) {
for (;;) {
if (const auto *ME = dyn_cast<MemberExpr>(E)) {
if (const auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
- FD && FD->getParent()->isUnion())
+ FD && FD->getParent()->isUnion() && hasTrivialDefaultCtorParent(FD))
return true;
E = ME->getBase();
continue;