]> granicus.if.org Git - clang/commitdiff
Finish up handling all permutations of "complex int" (in Sema::UsualArithmeticConvers...
authorSteve Naroff <snaroff@apple.com>
Tue, 15 Jan 2008 22:21:49 +0000 (22:21 +0000)
committerSteve Naroff <snaroff@apple.com>
Tue, 15 Jan 2008 22:21:49 +0000 (22:21 +0000)
A FIXME remains to verify the conversion rules are consistent with GCC.

Thanks to Eli for the new/improved test case...

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

Sema/SemaExpr.cpp
test/Sema/complex-int.c

index c5a9bff5fe81dde90f082feb18ec8a54a1fa03e0..f8053a4fbe8d84ddf3c4247ed1dd3cf9bb8514bd 100644 (file)
@@ -927,6 +927,7 @@ Expr *Sema::UsualUnaryConversions(Expr *&Expr) {
 /// binary operators (C99 6.3.1.8). If both operands aren't arithmetic, this
 /// routine returns the first non-arithmetic type found. The client is 
 /// responsible for emitting appropriate error diagnostics.
+/// FIXME: verify the conversion rules for "complex int" are consistent with GCC.
 QualType Sema::UsualArithmeticConversions(Expr *&lhsExpr, Expr *&rhsExpr,
                                           bool isCompAssign) {
   if (!isCompAssign) {
@@ -952,11 +953,13 @@ QualType Sema::UsualArithmeticConversions(Expr *&lhsExpr, Expr *&rhsExpr,
   // Handle complex types first (C99 6.3.1.8p1).
   if (lhs->isComplexType() || rhs->isComplexType()) {
     // if we have an integer operand, the result is the complex type.
-    if (rhs->isIntegerType()) { // convert the rhs to the lhs complex type.
+    if (rhs->isIntegerType() || rhs->isComplexIntegerType()) { 
+         // convert the rhs to the lhs complex type.
       if (!isCompAssign) promoteExprToType(rhsExpr, lhs);
       return lhs;
     }
-    if (lhs->isIntegerType()) { // convert the lhs to the rhs complex type.
+    if (lhs->isIntegerType() || lhs->isComplexIntegerType()) { 
+         // convert the lhs to the rhs complex type.
       if (!isCompAssign) promoteExprToType(lhsExpr, rhs);
       return rhs;
     }
@@ -1000,11 +1003,13 @@ QualType Sema::UsualArithmeticConversions(Expr *&lhsExpr, Expr *&rhsExpr,
   // Now handle "real" floating types (i.e. float, double, long double).
   if (lhs->isRealFloatingType() || rhs->isRealFloatingType()) {
     // if we have an integer operand, the result is the real floating type.
-    if (rhs->isIntegerType()) { // convert rhs to the lhs floating point type.
+    if (rhs->isIntegerType() || rhs->isComplexIntegerType()) { 
+         // convert rhs to the lhs floating point type.
       if (!isCompAssign) promoteExprToType(rhsExpr, lhs);
       return lhs;
     }
-    if (lhs->isIntegerType()) { // convert lhs to the rhs floating point type.
+    if (lhs->isIntegerType() || lhs->isComplexIntegerType()) { 
+         // convert lhs to the rhs floating point type.
       if (!isCompAssign) promoteExprToType(lhsExpr, rhs);
       return rhs;
     }
@@ -1024,7 +1029,6 @@ QualType Sema::UsualArithmeticConversions(Expr *&lhsExpr, Expr *&rhsExpr,
   }
   if (lhs->isComplexIntegerType() || rhs->isComplexIntegerType()) {
     // Handle GCC complex int extension.
-    // FIXME: need to verify these conversion rules are consistent with GCC.
     const ComplexType *lhsComplexInt = lhs->getAsComplexIntegerType();
        const ComplexType *rhsComplexInt = rhs->getAsComplexIntegerType();
 
index 1e2f8cf4ed237be9a5336f622cb5febf6cdde630..d7244d113bbf545de02dcd3cde9be8f6e92516ea 100644 (file)
@@ -21,3 +21,23 @@ switch (arr) { // expected-error{{statement requires expression of integer type
 }
 }
 
+void Tester() {
+__complex short a1;
+__complex int a2;
+__complex float a3;
+__complex double a4;
+short a5;
+int a6;
+float a7;
+double a8;
+#define TestPair(m,n) int x##m##n = a##m+a##n;
+#define TestPairs(m) TestPair(m,1) TestPair(m,2) \
+                    TestPair(m,3) TestPair(m,4) \
+                    TestPair(m,5) TestPair(m,6) \
+                    TestPair(m,7) TestPair(m,8)
+TestPairs(1); TestPairs(2);
+TestPairs(3); TestPairs(4);
+TestPairs(5); TestPairs(6);
+TestPairs(7); TestPairs(8);
+}
+