@@ -5997,6 +5997,23 @@ bool Compiler<Emitter>::checkLiteralType(const Expr *E) {
59975997 return this ->emitCheckLiteralType (E->getType ().getTypePtr (), E);
59985998}
59995999
6000+ static bool initNeedsOverridenLoc (const CXXCtorInitializer *Init) {
6001+ const Expr *InitExpr = Init->getInit ();
6002+
6003+ if (!Init->isWritten () && !Init->isInClassMemberInitializer () &&
6004+ !isa<CXXConstructExpr>(InitExpr))
6005+ return true ;
6006+
6007+ if (const auto *CE = dyn_cast<CXXConstructExpr>(InitExpr)) {
6008+ const CXXConstructorDecl *Ctor = CE->getConstructor ();
6009+ if (Ctor->isDefaulted () && Ctor->isCopyOrMoveConstructor () &&
6010+ Ctor->isTrivial ())
6011+ return true ;
6012+ }
6013+
6014+ return false ;
6015+ }
6016+
60006017template <class Emitter >
60016018bool Compiler<Emitter>::compileConstructor(const CXXConstructorDecl *Ctor) {
60026019 assert (!ReturnType);
@@ -6071,10 +6088,7 @@ bool Compiler<Emitter>::compileConstructor(const CXXConstructorDecl *Ctor) {
60716088 const Record::Field *F = R->getField (Member);
60726089
60736090 LocOverrideScope<Emitter> LOS (this , SourceInfo{},
6074- !Init->isWritten () &&
6075- !Init->isInClassMemberInitializer () &&
6076- (!isa<CXXConstructExpr>(InitExpr) ||
6077- Member->isAnonymousStructOrUnion ()));
6091+ initNeedsOverridenLoc (Init));
60786092 if (!emitFieldInitializer (F, F->Offset , InitExpr, IsUnion))
60796093 return false ;
60806094 } else if (const Type *Base = Init->getBaseClass ()) {
@@ -6104,10 +6118,7 @@ bool Compiler<Emitter>::compileConstructor(const CXXConstructorDecl *Ctor) {
61046118 return false ;
61056119 } else if (const IndirectFieldDecl *IFD = Init->getIndirectMember ()) {
61066120 LocOverrideScope<Emitter> LOS (this , SourceInfo{},
6107- !Init->isWritten () &&
6108- !Init->isInClassMemberInitializer () &&
6109- !isa<CXXConstructExpr>(InitExpr));
6110-
6121+ initNeedsOverridenLoc (Init));
61116122 assert (IFD->getChainingSize () >= 2 );
61126123
61136124 unsigned NestedFieldOffset = 0 ;
0 commit comments