diff options
| -rw-r--r-- | clang/lib/CodeGen/CGDeclCXX.cpp | 4 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/PR28216.cpp | 19 |
2 files changed, 23 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index 89d142e44b4..8f8ffe66b6a 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -323,6 +323,10 @@ 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) diff --git a/clang/test/CodeGenCXX/PR28216.cpp b/clang/test/CodeGenCXX/PR28216.cpp new file mode 100644 index 00000000000..6262c87de20 --- /dev/null +++ b/clang/test/CodeGenCXX/PR28216.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 %s -triple i686-pc-win32 -fms-extensions -emit-llvm -o - | FileCheck %s + +template <typename> +struct __declspec(dllimport) S { + S(); +}; + +template <typename T> +struct __declspec(dllimport) U { + static S<T> u; +}; + +template <typename T> +S<T> U<T>::u; + +template S<int> U<int>::u; +// CHECK-NOT: define internal void @"\01??__Eu@?$U@H@@2U?$S@H@@A@YAXXZ"( + +S<int> &i = U<int>::u; |

