Generate the correct results for the comma expression. Fixes PR3123.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60334 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2008-12-01 06:44:05 +00:00
Родитель d26527708b
Коммит 4fdfb0965b
1 изменённых файлов: 10 добавлений и 7 удалений

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

@ -513,14 +513,17 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
if (E->getOpcode() == BinaryOperator::Comma) {
// Evaluate the side that actually matters; this needs to be
// handled specially because calling Visit() on the LHS can
// have strange results when it doesn't have an integral type.
if (!Visit(E->getRHS()))
return false;
if (Info.ShortCircuit)
if (!Info.ShortCircuit) {
// If we can't evaluate the LHS, it must be because it has
// side effects.
if (!E->getLHS()->isEvaluatable(Info.Ctx))
Info.EvalResult.HasSideEffects = true;
return Extension(E->getOperatorLoc(), diag::note_comma_in_ice, E);
}
return true;
}
@ -1202,8 +1205,8 @@ bool Expr::Evaluate(APValue &Result, ASTContext &Ctx, bool *isEvaluated) const {
/// isEvaluatable - Call Evaluate to see if this expression can be constant
/// folded, but discard the result.
bool Expr::isEvaluatable(ASTContext &Ctx) const {
APValue V;
return Evaluate(V, Ctx);
EvalResult Result;
return Evaluate(Result, Ctx) && !Result.HasSideEffects;
}
APSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {