diff options
author | Hans Wennborg <hans@hanshq.net> | 2014-06-25 22:19:48 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2014-06-25 22:19:48 +0000 |
commit | 82dd877e8a4fe1cbab27be2b067fe7724a07a875 (patch) | |
tree | c0583393230e9037ebcac23a151c94417ea49892 /clang/lib/AST/ExprConstant.cpp | |
parent | c010ddb73db9a3a89ff65fb2a653daeae3744d86 (diff) | |
download | bcm5719-llvm-82dd877e8a4fe1cbab27be2b067fe7724a07a875.tar.gz bcm5719-llvm-82dd877e8a4fe1cbab27be2b067fe7724a07a875.zip |
Don't allow dllimport variables in constant initializers
This is a follow-up to David's r211677. For the following code,
we would end up referring to 'foo' in the initializer for 'arr',
and then fail to link, because 'foo' is dllimport and needs to be
accessed through the __imp_?foo.
__declspec(dllimport) extern const char foo[];
const char* f() {
static const char* const arr[] = { foo };
return arr[0];
}
Differential Revision: http://reviews.llvm.org/D4299
llvm-svn: 211736
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 5897f2c4856..2803310c325 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -1275,13 +1275,8 @@ static bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, if (Var->getTLSKind()) return false; - // Check if this is a dllimport variable. Fail evaluation if we care - // about side effects; a dllimport variable rarely acts like a constant - // except in places like template arguments. It never acts like a - // constant in C. - if ((!Info.getLangOpts().CPlusPlus || - !Info.keepEvaluatingAfterSideEffect()) && - Var->hasAttr<DLLImportAttr>()) + // A dllimport variable never acts like a constant. + if (Var->hasAttr<DLLImportAttr>()) return false; } if (const auto *FD = dyn_cast<const FunctionDecl>(VD)) { @@ -1295,9 +1290,7 @@ static bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, // The C language has no notion of ODR; furthermore, it has no notion of // dynamic initialization. This means that we are permitted to // perform initialization with the address of the thunk. - if (Info.getLangOpts().CPlusPlus && - !Info.keepEvaluatingAfterSideEffect() && - FD->hasAttr<DLLImportAttr>()) + if (Info.getLangOpts().CPlusPlus && FD->hasAttr<DLLImportAttr>()) return false; } } |