]> granicus.if.org Git - clang/commitdiff
Add very limited support for evaluating complex floats.
authorAnders Carlsson <andersca@mac.com>
Sun, 16 Nov 2008 20:27:53 +0000 (20:27 +0000)
committerAnders Carlsson <andersca@mac.com>
Sun, 16 Nov 2008 20:27:53 +0000 (20:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59425 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp

index 0ffbf581a2c1901824b02a4a5a8ee6da52f58098..86f7a2181e0e08a02e979ecc4fb88c4d3c4e3248 100644 (file)
@@ -67,6 +67,8 @@ static bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info);
 static bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info);
 static bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
 static bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
+static bool EvaluateComplexFloat(const Expr *E, APValue &Result, 
+                                 EvalInfo &Info);
 
 //===----------------------------------------------------------------------===//
 // Misc utilities
@@ -1051,6 +1053,46 @@ bool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
   return true;
 }
 
+//===----------------------------------------------------------------------===//
+// Complex Float Evaluation
+//===----------------------------------------------------------------------===//
+
+namespace {
+class VISIBILITY_HIDDEN ComplexFloatExprEvaluator
+  : public StmtVisitor<ComplexFloatExprEvaluator, APValue> {
+  EvalInfo &Info;
+  
+public:
+  ComplexFloatExprEvaluator(EvalInfo &info) : Info(info) {}
+  
+  //===--------------------------------------------------------------------===//
+  //                            Visitor Methods
+  //===--------------------------------------------------------------------===//
+
+  APValue VisitStmt(Stmt *S) {
+    assert(0 && "This should be called on complex floats");
+    return APValue();
+  }
+    
+  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
+
+  APValue VisitImaginaryLiteral(ImaginaryLiteral *E) {
+    APFloat Result(0.0);
+    if (!EvaluateFloat(E->getSubExpr(), Result, Info))
+      return APValue();
+    
+    return APValue(APFloat(0.0), Result);
+  }
+
+};
+} // end anonymous namespace
+
+static bool EvaluateComplexFloat(const Expr *E, APValue &Result, EvalInfo &Info)
+{
+  Result = ComplexFloatExprEvaluator(Info).Visit(const_cast<Expr*>(E));
+  return Result.isComplexFloat();
+}
+
 //===----------------------------------------------------------------------===//
 // Top level TryEvaluate.
 //===----------------------------------------------------------------------===//
@@ -1077,7 +1119,10 @@ bool Expr::tryEvaluate(APValue &Result, ASTContext &Ctx) const {
       Result = APValue(f);
       return true;
     }
-  }
+  } else if (getType()->isComplexType()) {
+    if (EvaluateComplexFloat(this, Result, Info))
+      return true;
+  }    
       
   return false;
 }