diff options
author | Hans Wennborg <hans@hanshq.net> | 2014-06-18 01:21:33 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2014-06-18 01:21:33 +0000 |
commit | a0ca209303aec31f81154367482d1351f77e8c6d (patch) | |
tree | 0d636fa9bfff0ac125c9fcc6d46be9ba0e336492 | |
parent | 5799e291e14a71a12e12b3106f550b28b0beabb6 (diff) | |
download | bcm5719-llvm-a0ca209303aec31f81154367482d1351f77e8c6d.tar.gz bcm5719-llvm-a0ca209303aec31f81154367482d1351f77e8c6d.zip |
Fix bug in code for avoiding dynamic initialization of dllimport globals
When instantiating dllimport variables with dynamic initializers, don't
bail out of Sema::InstantiateVariableInitializer without calling
PopExpressionEvaluationContext().
This was causing a stale object to stay on the ExprEvalContexts stack,
causing subsequent calls to getCurrentMangleNumberContext() to fail,
resulting in incorrect numbering of static locals (and probably other
broken things).
llvm-svn: 211137
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 1 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp | 18 |
2 files changed, 18 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index bce2fd552e3..29a10d0daac 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -3688,7 +3688,6 @@ void Sema::InstantiateVariableInitializer( if (Var->hasAttr<DLLImportAttr>() && InitExpr && !InitExpr->isConstantInitializer(getASTContext(), false)) { // Do not dynamically initialize dllimport variables. - return; } else if (InitExpr) { bool DirectInit = OldVar->isDirectInit(); AddInitializerToDecl(Var, InitExpr, DirectInit, TypeMayContainAuto); diff --git a/clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp b/clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp index b353d0c9c2c..a3127c79372 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-static-initializers.cpp @@ -189,6 +189,23 @@ inline void switch_test2() { switch (1) default: static int x = f(); } +namespace DynamicDLLImportInitVSMangling { + // Failing to pop the ExprEvalContexts when instantiating a dllimport var with + // dynamic initializer would cause subsequent static local numberings to be + // incorrect. + struct NonPOD { NonPOD(); }; + template <typename T> struct A { static NonPOD x; }; + template <typename T> NonPOD A<T>::x; + template struct __declspec(dllimport) A<int>; + + inline int switch_test3() { + // CHECK-LABEL: define linkonce_odr i32 @"\01?switch_test3@DynamicDLLImportInitVSMangling@@YAHXZ" + static int local; + // CHECK: @"\01?local@?1??switch_test3@DynamicDLLImportInitVSMangling@@YAHXZ@4HA" + return local++; + } +} + void force_usage() { UnreachableStatic(); getS(); @@ -197,6 +214,7 @@ void force_usage() { (void)&T::enum_in_struct; switch_test(1); switch_test2(); + DynamicDLLImportInitVSMangling::switch_test3(); } // CHECK: define linkonce_odr void @"\01??__Efoo@?$B@H@@2VA@@A@YAXXZ"() |