[cfe-commits] r62924 - in /cfe/trunk: include/clang/AST/APValue.h lib/AST/ExprConstant.cpp test/Sema/const-eval.c

Daniel Dunbar daniel at zuster.org
Sat Jan 24 11:08:01 PST 2009


Author: ddunbar
Date: Sat Jan 24 13:08:01 2009
New Revision: 62924

URL: http://llvm.org/viewvc/llvm-project?rev=62924&view=rev
Log:
Fix invalid evaluation of _Complex float (real & imaginary parts had
mismatched semantics).
 - Enforce this in APValue.

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

Modified: cfe/trunk/include/clang/AST/APValue.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/APValue.h?rev=62924&r1=62923&r2=62924&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/APValue.h (original)
+++ cfe/trunk/include/clang/AST/APValue.h Sat Jan 24 13:08:01 2009
@@ -188,11 +188,15 @@
       ((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;

Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=62924&r1=62923&r2=62924&view=diff

==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Sat Jan 24 13:08:01 2009
@@ -1194,7 +1194,8 @@
     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 @@
       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 @@
 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();
 }
 

Modified: cfe/trunk/test/Sema/const-eval.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/const-eval.c?rev=62924&r1=62923&r2=62924&view=diff

==============================================================================
--- cfe/trunk/test/Sema/const-eval.c (original)
+++ cfe/trunk/test/Sema/const-eval.c Sat Jan 24 13:08:01 2009
@@ -26,3 +26,6 @@
   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);





More information about the cfe-commits mailing list