summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprConstant.cpp
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2014-06-25 22:19:48 +0000
committerHans Wennborg <hans@hanshq.net>2014-06-25 22:19:48 +0000
commit82dd877e8a4fe1cbab27be2b067fe7724a07a875 (patch)
treec0583393230e9037ebcac23a151c94417ea49892 /clang/lib/AST/ExprConstant.cpp
parentc010ddb73db9a3a89ff65fb2a653daeae3744d86 (diff)
downloadbcm5719-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.cpp13
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;
}
}
OpenPOWER on IntegriCloud