aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/ExprConstant.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-02-26 10:19:36 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-02-26 10:19:36 +0000
commit33ef1456a19779fb15c51aea362bd9c7cb4087f3 (patch)
tree0708d0dc9a0ac536f2b5aff0bb0e27e9bf5e271c /lib/AST/ExprConstant.cpp
parente28d7195aad595154130ac8d03cc6c6513ece1bf (diff)
Remove short-circuit evaluation and the extension warnings. I'm
pretty sure we want to keep constant expression verification outside of Evaluate. Because of that, the short-circuit evaluation doesn't generally make sense, and the comma warning doesn't make sense in its current form. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65525 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ExprConstant.cpp')
-rw-r--r--lib/AST/ExprConstant.cpp49
1 files changed, 6 insertions, 43 deletions
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index 65a107bb23..6899b61703 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -42,12 +42,8 @@ struct EvalInfo {
/// EvalResult - Contains information about the evaluation.
Expr::EvalResult &EvalResult;
- /// ShortCircuit - will be greater than zero if the current subexpression has
- /// will not be evaluated because it's short-circuited (according to C rules).
- unsigned ShortCircuit;
-
EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult) : Ctx(ctx),
- EvalResult(evalresult), ShortCircuit(0) {}
+ EvalResult(evalresult) {}
};
@@ -559,13 +555,6 @@ public:
IntExprEvaluator(EvalInfo &info, APValue &result)
: Info(info), Result(result) {}
- bool Extension(SourceLocation L, diag::kind D, const Expr *E) {
- Info.EvalResult.DiagLoc = L;
- Info.EvalResult.Diag = D;
- Info.EvalResult.DiagExpr = E;
- return true; // still a constant.
- }
-
bool Success(const llvm::APSInt &SI, const Expr *E) {
assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
assert(SI.isSigned() == E->getType()->isSignedIntegerType() &&
@@ -592,18 +581,7 @@ public:
}
bool Error(SourceLocation L, diag::kind D, const Expr *E) {
- // If this is in an unevaluated portion of the subexpression, ignore the
- // error.
- if (Info.ShortCircuit) {
- // If error is ignored because the value isn't evaluated, get the real
- // type at least to prevent errors downstream.
- return Success(0, E);
- }
-
// Take the first error.
-
- // FIXME: This is wrong if we happen to have already emitted an
- // extension diagnostic; in that case we should report this error.
if (Info.EvalResult.Diag == 0) {
Info.EvalResult.DiagLoc = L;
Info.EvalResult.Diag = D;
@@ -792,14 +770,10 @@ bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
if (!Visit(E->getRHS()))
return false;
- 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);
- }
+ // If we can't evaluate the LHS, it might have side effects;
+ // conservatively mark it.
+ if (!E->getLHS()->isEvaluatable(Info.Ctx))
+ Info.EvalResult.HasSideEffects = true;
return true;
}
@@ -812,19 +786,8 @@ bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) {
// We were able to evaluate the LHS, see if we can get away with not
// evaluating the RHS: 0 && X -> 0, 1 || X -> 1
- if (lhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
- !lhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
- Info.ShortCircuit++;
- bool rhsEvaluated = HandleConversionToBool(E->getRHS(), rhsResult, Info);
- Info.ShortCircuit--;
-
- // FIXME: Return an extension warning saying that the RHS could not be
- // evaluated.
- // if (!rhsEvaluated) ...
- (void) rhsEvaluated;
-
+ if (lhsResult == (E->getOpcode() == BinaryOperator::LOr))
return Success(lhsResult, E);
- }
if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
if (E->getOpcode() == BinaryOperator::LOr)