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.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113128 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2010-09-06 00:10:32 +00:00
Родитель 6d6370ee10
Коммит a7dedf7004
2 изменённых файлов: 13 добавлений и 1 удалений

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -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;
}