зеркало из https://github.com/microsoft/clang.git
When IRgen refers to a function declaration that is not a definition,
and we later find the definition, make sure that we add the definition (not the declaration) to the list of deferred definitions to emit. Fixes PR8864. Thanks to Nick Lewycky for testing this patch out git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125157 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
5f022d8269
Коммит
a29bf41b8f
|
@ -857,10 +857,10 @@ CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
|
|||
if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
|
||||
if (FD->isImplicit() && !ForVTable) {
|
||||
assert(FD->isUsed() && "Sema didn't mark implicit function as used!");
|
||||
DeferredDeclsToEmit.push_back(D);
|
||||
DeferredDeclsToEmit.push_back(D.getWithDecl(FD));
|
||||
break;
|
||||
} else if (FD->isThisDeclarationADefinition()) {
|
||||
DeferredDeclsToEmit.push_back(D);
|
||||
DeferredDeclsToEmit.push_back(D.getWithDecl(FD));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -81,6 +81,12 @@ public:
|
|||
GD.Value.setFromOpaqueValue(P);
|
||||
return GD;
|
||||
}
|
||||
|
||||
GlobalDecl getWithDecl(const Decl *D) {
|
||||
GlobalDecl Result(*this);
|
||||
Result.Value.setPointer(D);
|
||||
return Result;
|
||||
}
|
||||
};
|
||||
|
||||
} // end namespace CodeGen
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
// RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s
|
||||
// PR8864
|
||||
|
||||
struct Foo {
|
||||
friend bool TryFoo(Foo *f2) { return TryFoo(0, f2); }
|
||||
|
||||
// CHECK: define{{.*}}Z6TryFooP3Foo
|
||||
// CHECK-NOT: ret
|
||||
// CHECK: call{{.*}}Z6TryFooiP3Foo
|
||||
// CHECK: ret
|
||||
|
||||
friend bool TryFoo(int, Foo *f3);
|
||||
};
|
||||
bool TryFoo(Foo *f5);
|
||||
int main(void) {
|
||||
Foo f;
|
||||
TryFoo(&f);
|
||||
}
|
Загрузка…
Ссылка в новой задаче