]> granicus.if.org Git - clang/commitdiff
The FP constant evaluator was missing a few cases of unary operators that return...
authorJohn McCall <rjmccall@apple.com>
Fri, 7 May 2010 22:08:54 +0000 (22:08 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 7 May 2010 22:08:54 +0000 (22:08 +0000)
but whose operand isn't a float:  specifically, __real__ and __imag__.  Instead
of filtering these out, just implement them.

Fixes <rdar://problem/7958272>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103307 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp
test/CodeGen/complex.c

index 30eaae14d71816e43dda8050b966c7cb62344619..e53804c86ddb714f55728b72c973839740278cfa 100644 (file)
@@ -1703,9 +1703,11 @@ public:
     { return Visit(E->getChosenSubExpr(Info.Ctx)); }
   bool VisitUnaryExtension(const UnaryOperator *E)
     { return Visit(E->getSubExpr()); }
+  bool VisitUnaryReal(const UnaryOperator *E);
+  bool VisitUnaryImag(const UnaryOperator *E);
 
-  // FIXME: Missing: __real__/__imag__, array subscript of vector,
-  //                 member of vector, ImplicitValueInitExpr
+  // FIXME: Missing: array subscript of vector, member of vector,
+  //                 ImplicitValueInitExpr
 };
 } // end anonymous namespace
 
@@ -1791,6 +1793,22 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
   }
 }
 
+bool FloatExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
+  ComplexValue CV;
+  if (!EvaluateComplex(E->getSubExpr(), CV, Info))
+    return false;
+  Result = CV.FloatReal;
+  return true;
+}
+
+bool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
+  ComplexValue CV;
+  if (!EvaluateComplex(E->getSubExpr(), CV, Info))
+    return false;
+  Result = CV.FloatImag;
+  return true;
+}
+
 bool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
   if (E->getOpcode() == UnaryOperator::Deref)
     return false;
index ca606109f8b22d26b63f9b3c4def4afe6c6483e8..055383ebbbe2807e3ee828f29cdf0bc297ec7b42 100644 (file)
@@ -89,3 +89,7 @@ void t6() {
   --ci1;
 }
 
+// <rdar://problem/7958272>
+double t7(double _Complex c) {
+  return __builtin_fabs(__real__(c));
+}