forked from OSchip/llvm-project
[modules] Remove IRGen special case for emitting implicit special members if
they're somehow missing a body. Looks like this was left behind when the loop was generalized, and it's not been problematic before because without modules, a used, implicit special member function declaration must be a definition. This was resulting in us trying to emit a constructor declaration rather than a definition, and producing a constructor missing its member initializers. llvm-svn: 214473
This commit is contained in:
parent
264da422b9
commit
46bb581a03
|
@ -711,7 +711,9 @@ void CodeGenFunction::EmitConstructorBody(FunctionArgList &Args) {
|
|||
return;
|
||||
}
|
||||
|
||||
Stmt *Body = Ctor->getBody();
|
||||
const FunctionDecl *Definition = 0;
|
||||
Stmt *Body = Ctor->getBody(Definition);
|
||||
assert(Definition == Ctor && "emitting wrong constructor body");
|
||||
|
||||
// Enter the function-try-block before the constructor prologue if
|
||||
// applicable.
|
||||
|
|
|
@ -1510,26 +1510,18 @@ CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName,
|
|||
// this will be unnecessary.
|
||||
//
|
||||
// We also don't emit a definition for a function if it's going to be an
|
||||
// entry
|
||||
// in a vtable, unless it's already marked as used.
|
||||
// entry in a vtable, unless it's already marked as used.
|
||||
} else if (getLangOpts().CPlusPlus && D) {
|
||||
// Look for a declaration that's lexically in a record.
|
||||
const auto *FD = cast<FunctionDecl>(D);
|
||||
FD = FD->getMostRecentDecl();
|
||||
do {
|
||||
for (const auto *FD = cast<FunctionDecl>(D)->getMostRecentDecl(); FD;
|
||||
FD = FD->getPreviousDecl()) {
|
||||
if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
|
||||
if (FD->isImplicit() && !ForVTable) {
|
||||
assert(FD->isUsed() &&
|
||||
"Sema didn't mark implicit function as used!");
|
||||
addDeferredDeclToEmit(F, GD.getWithDecl(FD));
|
||||
break;
|
||||
} else if (FD->doesThisDeclarationHaveABody()) {
|
||||
if (FD->doesThisDeclarationHaveABody()) {
|
||||
addDeferredDeclToEmit(F, GD.getWithDecl(FD));
|
||||
break;
|
||||
}
|
||||
}
|
||||
FD = FD->getPreviousDecl();
|
||||
} while (FD);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3241,6 +3241,8 @@ void ASTDeclReader::UpdateDecl(Decl *D, ModuleFile &ModuleFile,
|
|||
case UPD_CXX_ADDED_IMPLICIT_MEMBER: {
|
||||
Decl *MD = Reader.ReadDecl(ModuleFile, Record, Idx);
|
||||
assert(MD && "couldn't read decl from update record");
|
||||
// FIXME: We should call addHiddenDecl instead, to add the member
|
||||
// to its DeclContext.
|
||||
cast<CXXRecordDecl>(D)->addedMember(MD);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace ImplicitSpecialMembers {
|
|||
// CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1BC2EOS0_(
|
||||
// CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_(
|
||||
// CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1BC2ERKS0_(
|
||||
// FIXME CHECK-NOT: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_(
|
||||
// CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_(
|
||||
|
||||
extern B b1;
|
||||
B b2(b1);
|
||||
|
|
Loading…
Reference in New Issue