[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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user