]> granicus.if.org Git - clang/commitdiff
Fix invalid evaluation of _Complex float (real & imaginary parts had
authorDaniel Dunbar <daniel@zuster.org>
Sat, 24 Jan 2009 19:08:01 +0000 (19:08 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 24 Jan 2009 19:08:01 +0000 (19:08 +0000)
mismatched semantics).
 - Enforce this in APValue.

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

include/clang/AST/APValue.h
lib/AST/ExprConstant.cpp
test/Sema/const-eval.c

index d88757de1a3d58c26e368bb42796781e2b1d68cd..5d5abfe011d4f648469f432d86800ff7f5ebccfc 100644 (file)
@@ -188,11 +188,15 @@ public:
       ((Vec*)(void*)Data)->Elts[i] = E[i];
   }
   void setComplexInt(const APSInt &R, const APSInt &I) {
+    assert(R.getBitWidth() == I.getBitWidth() && 
+           "Invalid complex int (type mismatch).");
     assert(isComplexInt() && "Invalid accessor");
     ((ComplexAPSInt*)(void*)Data)->Real = R;
     ((ComplexAPSInt*)(void*)Data)->Imag = I;
   }
   void setComplexFloat(const APFloat &R, const APFloat &I) {
+    assert(&R.getSemantics() == &I.getSemantics() && 
+           "Invalid complex float (type mismatch).");
     assert(isComplexFloat() && "Invalid accessor");
     ((ComplexAPFloat*)(void*)Data)->Real = R;
     ((ComplexAPFloat*)(void*)Data)->Imag = I;
index f45bd787b569b6b41733b0335fd766f150afaff7..16c6e89c32931d1b7285c3e86e4548cb87077a57 100644 (file)
@@ -1194,7 +1194,8 @@ public:
     if (!EvaluateFloat(E->getSubExpr(), Result, Info))
       return APValue();
     
-    return APValue(APFloat(0.0), Result);
+    return APValue(APFloat(Result.getSemantics(), APFloat::fcZero), 
+                   Result);
   }
 
   APValue VisitCastExpr(CastExpr *E) {
@@ -1206,7 +1207,8 @@ public:
       if (!EvaluateFloat(SubExpr, Result, Info))
         return APValue();
       
-      return APValue(Result, APFloat(0.0));
+      return APValue(Result, 
+                     APFloat(Result.getSemantics(), APFloat::fcZero));
     }
 
     // FIXME: Handle more casts.
@@ -1221,6 +1223,10 @@ public:
 static bool EvaluateComplexFloat(const Expr *E, APValue &Result, EvalInfo &Info)
 {
   Result = ComplexFloatExprEvaluator(Info).Visit(const_cast<Expr*>(E));
+  if (Result.isComplexFloat())
+    assert(&Result.getComplexFloatReal().getSemantics() == 
+           &Result.getComplexFloatImag().getSemantics() && 
+           "Invalid complex evaluation.");
   return Result.isComplexFloat();
 }
 
index e3d63ca94fb3808dffc20a366b21ac83819391de..71f76228d1b925c8a3124fa2fa63e8e1f6f01fda 100644 (file)
@@ -26,3 +26,6 @@ void f()
   int a;
   EVAL_EXPR(15, (_Bool)&a); // expected-error {{fields must have a constant size}}
 }
+
+// FIXME: Turn into EVAL_EXPR test once we have more folding.
+_Complex float g16 = (1.0f + 1.0fi);