[cfe-commits] r65525 - /cfe/trunk/lib/AST/ExprConstant.cpp

Eli Friedman eli.friedman at gmail.com
Thu Feb 26 02:19:42 PST 2009


Author: efriedma
Date: Thu Feb 26 04:19:36 2009
New Revision: 65525

URL: http://llvm.org/viewvc/llvm-project?rev=65525&view=rev
Log:
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.


Modified:
    cfe/trunk/lib/AST/ExprConstant.cpp

Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=65525&r1=65524&r2=65525&view=diff

==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Thu Feb 26 04:19:36 2009
@@ -42,12 +42,8 @@
   /// 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 @@
   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 @@
   }
 
   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 @@
     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 @@
     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)





More information about the cfe-commits mailing list