]> granicus.if.org Git - clang/commitdiff
Constant expression evaluation: factor out handling of ignored values.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 24 Oct 2011 18:44:57 +0000 (18:44 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 24 Oct 2011 18:44:57 +0000 (18:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142835 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp

index 3bf9eb516f7f8214a2a4c86264d1ff49a7839809..e681e915442c939f7cf320c3ed8870fc55a7545b 100644 (file)
@@ -493,6 +493,12 @@ public:
     return DerivedValueInitialization(E);
   }
 
+  /// Visit a value which is evaluated, but whose value is ignored.
+  void VisitIgnoredValue(const Expr *E) {
+    APValue Scratch;
+    if (!Evaluate(Scratch, Info, E))
+      Info.EvalStatus.HasSideEffects = true;
+  }
 };
 
 }
@@ -1010,9 +1016,7 @@ VectorExprEvaluator::ValueInitialization(const Expr *E) {
 }
 
 bool VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
-  APValue Scratch;
-  if (!Evaluate(Scratch, Info, E->getSubExpr()))
-    Info.EvalStatus.HasSideEffects = true;
+  VisitIgnoredValue(E->getSubExpr());
   return ValueInitialization(E);
 }
 
@@ -1408,16 +1412,8 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
 
 bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
   if (E->getOpcode() == BO_Comma) {
-    if (!Visit(E->getRHS()))
-      return false;
-
-    // If we can't evaluate the LHS, it might have side effects;
-    // conservatively mark it.
-    APValue Scratch;
-    if (!Evaluate(Scratch, Info, E->getLHS()))
-      Info.EvalStatus.HasSideEffects = true;
-
-    return true;
+    VisitIgnoredValue(E->getLHS());
+    return Visit(E->getRHS());
   }
 
   if (E->isLogicalOp()) {
@@ -2007,9 +2003,7 @@ bool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
     return Success(LV.getComplexIntImag(), E);
   }
 
-  APValue Scratch;
-  if (!Evaluate(Scratch, Info, E->getSubExpr()))
-    Info.EvalStatus.HasSideEffects = true;
+  VisitIgnoredValue(E->getSubExpr());
   return Success(0, E);
 }
 
@@ -2183,9 +2177,7 @@ bool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
     return true;
   }
 
-  APValue Scratch;
-  if (!Evaluate(Scratch, Info, E->getSubExpr()))
-    Info.EvalStatus.HasSideEffects = true;
+  VisitIgnoredValue(E->getSubExpr());
   const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType());
   Result = llvm::APFloat::getZero(Sem);
   return true;
@@ -2210,16 +2202,8 @@ bool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
 
 bool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
   if (E->getOpcode() == BO_Comma) {
-    if (!EvaluateFloat(E->getRHS(), Result, Info))
-      return false;
-
-    // If we can't evaluate the LHS, it might have side effects;
-    // conservatively mark it.
-    APValue Scratch;
-    if (!Evaluate(Scratch, Info, E->getLHS()))
-      Info.EvalStatus.HasSideEffects = true;
-
-    return true;
+    VisitIgnoredValue(E->getLHS());
+    return Visit(E->getRHS());
   }
 
   // We can't evaluate pointer-to-member operations.
@@ -2495,16 +2479,8 @@ bool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) {
 
 bool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
   if (E->getOpcode() == BO_Comma) {
-    if (!Visit(E->getRHS()))
-      return false;
-
-    // If we can't evaluate the LHS, it might have side effects;
-    // conservatively mark it.
-    APValue Scratch;
-    if (!Evaluate(Scratch, Info, E->getLHS()))
-      Info.EvalStatus.HasSideEffects = true;
-
-    return true;
+    VisitIgnoredValue(E->getLHS());
+    return Visit(E->getRHS());
   }
   if (!Visit(E->getLHS()))
     return false;