@@ -25,41 +25,6 @@ using APSInt = llvm::APSInt;
2525namespace clang {
2626namespace interp {
2727
28- static bool hasTrivialDefaultCtorParent (const FieldDecl *FD) {
29- assert (FD);
30- assert (FD->getParent ()->isUnion ());
31- const auto *CXXRD = dyn_cast<CXXRecordDecl>(FD->getParent ());
32- return !CXXRD || CXXRD->hasTrivialDefaultConstructor ();
33- }
34-
35- static bool refersToUnion (const Expr *E) {
36- for (;;) {
37- if (const auto *ME = dyn_cast<MemberExpr>(E)) {
38- if (const auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl ());
39- FD && FD->getParent ()->isUnion () && hasTrivialDefaultCtorParent (FD))
40- return true ;
41- E = ME->getBase ();
42- continue ;
43- }
44-
45- if (const auto *ASE = dyn_cast<ArraySubscriptExpr>(E)) {
46- E = ASE->getBase ()->IgnoreImplicit ();
47- continue ;
48- }
49-
50- if (const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
51- ICE && (ICE->getCastKind () == CK_NoOp ||
52- ICE->getCastKind () == CK_DerivedToBase ||
53- ICE->getCastKind () == CK_UncheckedDerivedToBase)) {
54- E = ICE->getSubExpr ();
55- continue ;
56- }
57-
58- break ;
59- }
60- return false ;
61- }
62-
6328static std::optional<bool > getBoolValue (const Expr *E) {
6429 if (const auto *CE = dyn_cast_if_present<ConstantExpr>(E);
6530 CE && CE->hasAPValueResult () &&
@@ -5408,6 +5373,53 @@ bool Compiler<Emitter>::maybeEmitDeferredVarInit(const VarDecl *VD) {
54085373 return true ;
54095374}
54105375
5376+ static bool hasTrivialDefaultCtorParent (const FieldDecl *FD) {
5377+ assert (FD);
5378+ assert (FD->getParent ()->isUnion ());
5379+ const auto *CXXRD = dyn_cast<CXXRecordDecl>(FD->getParent ());
5380+ return !CXXRD || CXXRD->hasTrivialDefaultConstructor ();
5381+ }
5382+
5383+ template <class Emitter > bool Compiler<Emitter>::refersToUnion(const Expr *E) {
5384+ for (;;) {
5385+ if (const auto *ME = dyn_cast<MemberExpr>(E)) {
5386+ if (const auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl ());
5387+ FD && FD->getParent ()->isUnion () && hasTrivialDefaultCtorParent (FD))
5388+ return true ;
5389+ E = ME->getBase ();
5390+ continue ;
5391+ }
5392+
5393+ if (const auto *ASE = dyn_cast<ArraySubscriptExpr>(E)) {
5394+ E = ASE->getBase ()->IgnoreImplicit ();
5395+ continue ;
5396+ }
5397+
5398+ if (const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
5399+ ICE && (ICE->getCastKind () == CK_NoOp ||
5400+ ICE->getCastKind () == CK_DerivedToBase ||
5401+ ICE->getCastKind () == CK_UncheckedDerivedToBase)) {
5402+ E = ICE->getSubExpr ();
5403+ continue ;
5404+ }
5405+
5406+ if (const auto *This = dyn_cast<CXXThisExpr>(E)) {
5407+ const auto *ThisRecord =
5408+ This->getType ()->getPointeeType ()->getAsRecordDecl ();
5409+ if (!ThisRecord->isUnion ())
5410+ return false ;
5411+ // Otherwise, always activate if we're in the ctor.
5412+ if (const auto *Ctor =
5413+ dyn_cast_if_present<CXXConstructorDecl>(CompilingFunction))
5414+ return Ctor->getParent () == ThisRecord;
5415+ return false ;
5416+ }
5417+
5418+ break ;
5419+ }
5420+ return false ;
5421+ }
5422+
54115423template <class Emitter >
54125424bool Compiler<Emitter>::visitDeclStmt(const DeclStmt *DS,
54135425 bool EvaluateConditionDecl) {
@@ -5940,16 +5952,15 @@ bool Compiler<Emitter>::compileConstructor(const CXXConstructorDecl *Ctor) {
59405952 return false ;
59415953
59425954 if (OptPrimType T = this ->classify (InitExpr)) {
5955+ if (Activate && !this ->emitActivateThisField (FieldOffset, InitExpr))
5956+ return false ;
5957+
59435958 if (!this ->visit (InitExpr))
59445959 return false ;
59455960
59465961 bool BitField = F->isBitField ();
5947- if (BitField && Activate)
5948- return this ->emitInitThisBitFieldActivate (*T, F, FieldOffset, InitExpr);
59495962 if (BitField)
59505963 return this ->emitInitThisBitField (*T, F, FieldOffset, InitExpr);
5951- if (Activate)
5952- return this ->emitInitThisFieldActivate (*T, FieldOffset, InitExpr);
59535964 return this ->emitInitThisField (*T, FieldOffset, InitExpr);
59545965 }
59555966 // Non-primitive case. Get a pointer to the field-to-initialize
0 commit comments