]> granicus.if.org Git - clang/commitdiff
[CodeGen] Treat imported static local variables as declarations
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 11 Jul 2016 04:28:21 +0000 (04:28 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 11 Jul 2016 04:28:21 +0000 (04:28 +0000)
Imported variables cannot really be definitions for the purposes of
IR generation.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@275040 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDeclCXX.cpp
lib/CodeGen/CodeGenModule.cpp
test/CodeGenCXX/dllimport.cpp

index 8f8ffe66b6ada2323883531f0c54e5a0f4080564..89d142e44b49e5ba4d53f7a4efdd58f6213c9992 100644 (file)
@@ -323,10 +323,6 @@ CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D,
        D->hasAttr<CUDASharedAttr>()))
     return;
 
-  // DLL imported variables will be initialized by the export side.
-  if (D->hasAttr<DLLImportAttr>())
-    return;
-
   // Check if we've already initialized this decl.
   auto I = DelayedCXXInitPosition.find(D);
   if (I != DelayedCXXInitPosition.end() && I->second == ~0U)
index 55b13b4b21bcd485b2aa96bb94b93a32b2fb05c9..0161cfb611ca0b44fa022e29637a0eefcb231957 100644 (file)
@@ -2851,6 +2851,10 @@ static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
 }
 
 void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
+  auto DK = VD->isThisDeclarationADefinition();
+  if (DK == VarDecl::Definition && VD->hasAttr<DLLImportAttr>())
+    return;
+
   TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind();
   // If we have a definition, this might be a deferred decl. If the
   // instantiation is explicit, make sure we emit it at the end.
index 629c2b6c8badf4ff13f487b7737f73181ddb0643..aff240f28769ae143f5b3c39863982c08efb494e 100644 (file)
@@ -676,7 +676,7 @@ namespace ClassTemplateStaticDef {
     static int x;
   };
   template <typename T> int S<T>::x;
-  // MSC-DAG: @"\01?x@?$S@H@ClassTemplateStaticDef@@2HA" = available_externally dllimport global i32 0
+  // MSC-DAG: @"\01?x@?$S@H@ClassTemplateStaticDef@@2HA" = external dllimport global i32
   int f() { return S<int>::x; }
 
   // Partial class template specialization static field:
@@ -685,7 +685,7 @@ namespace ClassTemplateStaticDef {
     static int x;
   };
   template <typename A> int T<A*>::x;
-  // GNU-DAG: @_ZN22ClassTemplateStaticDef1TIPvE1xE = available_externally dllimport global i32 0
+  // GNU-DAG: @_ZN22ClassTemplateStaticDef1TIPvE1xE = external dllimport global i32
   int g() { return T<void*>::x; }
 }