diff options
author | Hans Wennborg <hans@hanshq.net> | 2014-06-10 00:55:51 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2014-06-10 00:55:51 +0000 |
commit | 91ebe6eb04827a56aa975cdc899d940af0a3ad3a (patch) | |
tree | 8eb5dd46be638ecc7d61e9706e993e753edc7fb8 /clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | |
parent | b2e4edb5c83cbe3a3eb0cde751e52c786d8f9525 (diff) | |
download | bcm5719-llvm-91ebe6eb04827a56aa975cdc899d940af0a3ad3a.tar.gz bcm5719-llvm-91ebe6eb04827a56aa975cdc899d940af0a3ad3a.zip |
Improve checking for dynamic initializers of dllimport fields in template instantiation
We would previously assert if the initializer was dependent. I also think that
checking isConstantInitializer is more correct here than checkInitIsICE.
llvm-svn: 210505
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiateDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 2fa28a33a10..bce2fd552e3 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -3671,12 +3671,6 @@ void Sema::InstantiateVariableInitializer( // We already have an initializer in the class. return; - if (Var->hasAttr<DLLImportAttr>() && - !(OldVar->getInit() && OldVar->checkInitIsICE())) { - // Do not dynamically initialize dllimport variables. - return; - } - if (OldVar->getInit()) { if (Var->isStaticDataMember() && !OldVar->isOutOfLine()) PushExpressionEvaluationContext(Sema::ConstantEvaluated, OldVar); @@ -3689,9 +3683,15 @@ void Sema::InstantiateVariableInitializer( OldVar->getInitStyle() == VarDecl::CallInit); if (!Init.isInvalid()) { bool TypeMayContainAuto = true; - if (Init.get()) { + Expr *InitExpr = Init.get(); + + 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, Init.get(), DirectInit, TypeMayContainAuto); + AddInitializerToDecl(Var, InitExpr, DirectInit, TypeMayContainAuto); } else ActOnUninitializedDecl(Var, TypeMayContainAuto); } else { |