Let CodeGenFunction::EmitVarDecl query the semantic storage class info.

Added testcase corresponding to PR15991.

llvm-svn: 181998
This commit is contained in:
Enea Zaffanella 2013-05-16 11:27:56 +00:00
parent ec04c0dba0
commit cf51a8ac3f
2 changed files with 17 additions and 12 deletions

View File

@ -114,12 +114,7 @@ void CodeGenFunction::EmitDecl(const Decl &D) {
/// EmitVarDecl - This method handles emission of any variable declaration
/// inside a function, including static vars etc.
void CodeGenFunction::EmitVarDecl(const VarDecl &D) {
switch (D.getStorageClass()) {
case SC_None:
case SC_Auto:
case SC_Register:
return EmitAutoVarDecl(D);
case SC_Static: {
if (D.isStaticLocal()) {
llvm::GlobalValue::LinkageTypes Linkage =
llvm::GlobalValue::InternalLinkage;
@ -134,15 +129,16 @@ void CodeGenFunction::EmitVarDecl(const VarDecl &D) {
return EmitStaticVarDecl(D, Linkage);
}
case SC_Extern:
case SC_PrivateExtern:
if (D.hasExternalStorage())
// Don't emit it now, allow it to be emitted lazily on its first use.
return;
case SC_OpenCLWorkGroupLocal:
return CGM.getOpenCLRuntime().EmitWorkGroupLocalVarDecl(*this, D);
}
llvm_unreachable("Unknown storage class");
if (D.getStorageClass() == SC_OpenCLWorkGroupLocal)
return CGM.getOpenCLRuntime().EmitWorkGroupLocalVarDecl(*this, D);
assert(D.hasLocalStorage());
return EmitAutoVarDecl(D);
}
static std::string GetStaticDeclName(CodeGenFunction &CGF, const VarDecl &D,

View File

@ -66,3 +66,12 @@ namespace test2 {
// CHECK-2: define internal void @_ZN5test21A1BINS_12_GLOBAL__N_11CEE3fooEv()
}
namespace {
int bar() {
extern int a;
return a;
}
} // namespace