]> granicus.if.org Git - clang/commitdiff
Some minor improvements to Evaluate.
authorEli Friedman <eli.friedman@gmail.com>
Fri, 27 Feb 2009 04:45:43 +0000 (04:45 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 27 Feb 2009 04:45:43 +0000 (04:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65613 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp

index 5cfc6e6ab31ef1153f04863480c563f8c89a81ac..4f55f8d76426575541d5026eb81465f623201184 100644 (file)
@@ -636,16 +636,24 @@ public:
     return Success(0, E);
   }
 
+  bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
+    return Success(0, E);
+  }
+
   bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
     return Success(E->EvaluateTrait(), E);
   }
 
+  bool VisitChooseExpr(const ChooseExpr *E);
+  bool VisitUnaryReal(const UnaryOperator *E) {
+    return Visit(E->getSubExpr());
+  }
+  bool VisitUnaryImag(const UnaryOperator *E);
+
 private:
   unsigned GetAlignOfExpr(const Expr *E);
   unsigned GetAlignOfType(QualType T);
-  // FIXME: Missing: __real__/__imag__, array subscript of vector,
-  //                 member of vector, __builtin_choose_expr,
-  //                 ImplicitValueInitExpr
+  // FIXME: Missing: array subscript of vector, member of vector
 };
 } // end anonymous namespace
 
@@ -1170,6 +1178,18 @@ bool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
   return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E);
 }
 
+bool IntExprEvaluator::VisitChooseExpr(const ChooseExpr *E) {
+  Expr* EvalExpr = E->isConditionTrue(Info.Ctx) ? E->getLHS() : E->getRHS();
+
+  return Visit(EvalExpr);
+}
+
+bool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
+  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
+    Info.EvalResult.HasSideEffects = true;
+  return Success(0, E);
+}
+
 //===----------------------------------------------------------------------===//
 // Float Evaluation
 //===----------------------------------------------------------------------===//