Switch CodeGen's "is this variable declaration a definition?" logic
over to VarDecl::isThisDeclarationADefinition(), which handles variables declared with linkage specifications better (among other things). CMake 2.9 (from CVS) now builds with clang++ and is somewhat functional. llvm-svn: 95486
This commit is contained in:
parent
2c4de4c31e
commit
61f6db54e1
|
@ -627,20 +627,7 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) {
|
||||||
const VarDecl *VD = cast<VarDecl>(Global);
|
const VarDecl *VD = cast<VarDecl>(Global);
|
||||||
assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
|
assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
|
||||||
|
|
||||||
if (getLangOptions().CPlusPlus && !VD->getInit()) {
|
if (VD->isThisDeclarationADefinition() != VarDecl::Definition)
|
||||||
// In C++, if this is marked "extern", defer code generation.
|
|
||||||
if (VD->getStorageClass() == VarDecl::Extern || VD->isExternC())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// If this is a declaration of an explicit specialization of a static
|
|
||||||
// data member in a class template, don't emit it.
|
|
||||||
if (VD->isStaticDataMember() &&
|
|
||||||
VD->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// In C, if this isn't a definition, defer code generation.
|
|
||||||
if (!getLangOptions().CPlusPlus && !VD->getInit())
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
|
||||||
|
|
||||||
|
struct X { };
|
||||||
|
|
||||||
|
// CHECK: @x1 = global %struct.X zeroinitializer
|
||||||
|
// CHECK: @x4 = global %struct.X zeroinitializer
|
||||||
|
// CHECK: @x2 = external global %struct.X
|
||||||
|
// CHECK: @x3 = external global %struct.X
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
|
||||||
|
X x1;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" X x2;
|
||||||
|
|
||||||
|
extern X x3;
|
||||||
|
|
||||||
|
X x4;
|
||||||
|
|
||||||
|
X& get(int i) {
|
||||||
|
if (i == 1)
|
||||||
|
return x1;
|
||||||
|
else if (i == 2)
|
||||||
|
return x2;
|
||||||
|
else if (i == 3)
|
||||||
|
return x3;
|
||||||
|
else
|
||||||
|
return x4;
|
||||||
|
}
|
Loading…
Reference in New Issue