From cf51a8ac3f94882650768b04accff6fc1a4c4b52 Mon Sep 17 00:00:00 2001 From: Enea Zaffanella Date: Thu, 16 May 2013 11:27:56 +0000 Subject: [PATCH] Let CodeGenFunction::EmitVarDecl query the semantic storage class info. Added testcase corresponding to PR15991. llvm-svn: 181998 --- clang/lib/CodeGen/CGDecl.cpp | 20 ++++++++----------- .../test/CodeGenCXX/anonymous-namespaces.cpp | 9 +++++++++ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index 3ce6dec6a53c..eb2b0e7e0105 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -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, diff --git a/clang/test/CodeGenCXX/anonymous-namespaces.cpp b/clang/test/CodeGenCXX/anonymous-namespaces.cpp index 32e17a35ff2d..e9d1921adaaf 100644 --- a/clang/test/CodeGenCXX/anonymous-namespaces.cpp +++ b/clang/test/CodeGenCXX/anonymous-namespaces.cpp @@ -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