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:
Rafael Espindola 2013-03-12 15:22:39 +00:00
parent 01271c6022
commit b22b91c3e4
2 changed files with 14 additions and 5 deletions

View File

@ -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();

View File

@ -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;
}