[cfe-commits] r46022 - in /cfe/trunk: Sema/SemaExpr.cpp test/Sema/complex-int.c
Steve Naroff
snaroff at apple.com
Tue Jan 15 14:21:49 PST 2008
Author: snaroff
Date: Tue Jan 15 16:21:49 2008
New Revision: 46022
URL: http://llvm.org/viewvc/llvm-project?rev=46022&view=rev
Log:
Finish up handling all permutations of "complex int" (in Sema::UsualArithmeticConversions()).
A FIXME remains to verify the conversion rules are consistent with GCC.
Thanks to Eli for the new/improved test case...
Modified:
cfe/trunk/Sema/SemaExpr.cpp
cfe/trunk/test/Sema/complex-int.c
Modified: cfe/trunk/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaExpr.cpp?rev=46022&r1=46021&r2=46022&view=diff
==============================================================================
--- cfe/trunk/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/Sema/SemaExpr.cpp Tue Jan 15 16:21:49 2008
@@ -927,6 +927,7 @@
/// 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 @@
// 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 @@
// 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 @@
}
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();
Modified: cfe/trunk/test/Sema/complex-int.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/complex-int.c?rev=46022&r1=46021&r2=46022&view=diff
==============================================================================
--- cfe/trunk/test/Sema/complex-int.c (original)
+++ cfe/trunk/test/Sema/complex-int.c Tue Jan 15 16:21:49 2008
@@ -21,3 +21,23 @@
}
}
+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);
+}
+
More information about the cfe-commits
mailing list