зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
6d6370ee10
Коммит
a7dedf7004
|
@ -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;
|
||||
}
|
Загрузка…
Ссылка в новой задаче