Correctly compute linkage of decls forward declared extern C.
This fixes a crash in namespace { struct X {}; } extern "C" X test2_b; X test2_b before we would assign different linkages to each of the test2_b decls. llvm-svn: 176869
This commit is contained in:
parent
01271c6022
commit
b22b91c3e4
|
@ -620,8 +620,7 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D,
|
|||
//
|
||||
// Note that we don't want to make the variable non-external
|
||||
// because of this, but unique-external linkage suits us.
|
||||
if (Context.getLangOpts().CPlusPlus &&
|
||||
!Var->getDeclContext()->isExternCContext()) {
|
||||
if (Context.getLangOpts().CPlusPlus && !isInExternCContext(Var)) {
|
||||
LinkageInfo TypeLV = Var->getType()->getLinkageAndVisibility();
|
||||
if (TypeLV.getLinkage() != ExternalLinkage)
|
||||
return LinkageInfo::uniqueExternal();
|
||||
|
|
|
@ -20,9 +20,19 @@ namespace test1 {
|
|||
struct X {};
|
||||
}
|
||||
extern "C" {
|
||||
// CHECK: @b = global
|
||||
X b = X();
|
||||
// CHECK: @test1_b = global
|
||||
X test1_b = X();
|
||||
}
|
||||
void *use = &b;
|
||||
void *use = &test1_b;
|
||||
// CHECK: @_ZN5test13useE = global
|
||||
}
|
||||
|
||||
namespace test2 {
|
||||
namespace {
|
||||
struct X {};
|
||||
}
|
||||
|
||||
// CHECK: @test2_b = global
|
||||
extern "C" X test2_b;
|
||||
X test2_b;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue