[clang] [Sema] Instantiate destructors for initialized anonymous union fields (PR #128866)
Eli Friedman via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 27 10:01:43 PST 2025
================
@@ -5451,10 +5451,23 @@ bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors,
NumInitializers * sizeof(CXXCtorInitializer*));
Constructor->setCtorInitializers(baseOrMemberInitializers);
+ SourceLocation Location = Constructor->getLocation();
+
+ for (CXXCtorInitializer *Initializer : Info.AllToInit) {
+ FieldDecl *Field = Initializer->getAnyMember();
+ if (!Field)
+ continue;
+
+ RecordDecl *FieldRecordDecl = Field->getParent();
+ if (!FieldRecordDecl->isUnion() ||
----------------
efriedma-quic wrote:
I think this isn't quite right. Consider:
```
template <class T> struct VSX {
~VSX() { static_assert(sizeof(T) != 4, ""); }
};
struct VS {
union {
struct {
VSX<int> _Tail;
};
};
~VS() { }
VS(short);
};
VS::VS(short) : _Tail() { }
```
Also consider:
```
template <class T> struct VSX {
~VSX() { static_assert(sizeof(T) != 4, ""); }
};
union VS {
VSX<int> _Tail;
~VS() { }
VS(short);
};
VS::VS(short) : _Tail() { }
```
https://github.com/llvm/llvm-project/pull/128866
More information about the cfe-commits
mailing list