PR7242: Make sure to use a different context for evaluating constant

initializers, so the result of the evaluation doesn't leak through
inconsistently.  Also, don't evaluate references to variables with
initializers with side-effects.

llvm-svn: 113128
This commit is contained in:
Eli Friedman
2010-09-06 00:10:32 +00:00
parent ee8df8f167
commit 0b1fbd1394
2 changed files with 13 additions and 1 deletions

View File

@@ -1008,8 +1008,11 @@ bool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) {
VD->setEvaluatingValue();
if (Visit(const_cast<Expr*>(Init))) {
Expr::EvalResult EResult;
if (Init->Evaluate(EResult, Info.Ctx) && !EResult.HasSideEffects &&
EResult.Val.isInt()) {
// Cache the evaluated value in the variable declaration.
Result = EResult.Val;
VD->setEvaluatedValue(Result);
return true;
}

View File

@@ -0,0 +1,9 @@
// RUN: %clang_cc1 -verify -emit-llvm-only
// PR7242: Check that this doesn't crash.
int main(void)
{
int __negative = 1;
const int __max = __negative && 0 ;
__max / 0;
}