From a7dedf7004e8ac3f947d6817370b2778fa648c2b Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Mon, 6 Sep 2010 00:10:32 +0000 Subject: [PATCH] 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 --- lib/AST/ExprConstant.cpp | 5 ++++- test/CodeGen/fold-const-declref.c | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/fold-const-declref.c diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 175fd85a24..7347f5a43e 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -1008,8 +1008,11 @@ bool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) { VD->setEvaluatingValue(); - if (Visit(const_cast(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; } diff --git a/test/CodeGen/fold-const-declref.c b/test/CodeGen/fold-const-declref.c new file mode 100644 index 0000000000..5a7ba8e26a --- /dev/null +++ b/test/CodeGen/fold-const-declref.c @@ -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; +} -- 2.50.1