]> granicus.if.org Git - clang/commitdiff
Support '~' for complex conjugation. This is a GCC extension.
authorSteve Naroff <snaroff@apple.com>
Thu, 23 Aug 2007 22:06:40 +0000 (22:06 +0000)
committerSteve Naroff <snaroff@apple.com>
Thu, 23 Aug 2007 22:06:40 +0000 (22:06 +0000)
This following now compiles without error...

_Complex unsigned X, Y;
_Complex double x, y;
void test2(int c) {
  X = ~Y;
  x = ~y;
}

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

Sema/SemaExpr.cpp

index f6d00070c4aba1068e52620ff5170c50329c9189..03f5d7f8978bb868513049bfe5db972454a0a7e5 100644 (file)
@@ -1256,7 +1256,8 @@ QualType Sema::CheckIncrementDecrementOperand(Expr *op, SourceLocation OpLoc) {
   QualType resType = op->getType();
   assert(!resType.isNull() && "no type for increment/decrement expression");
 
-  // C99 6.5.2.4p1
+  // C99 6.5.2.4p1: C99 does not support ++/-- on complex types.
+  // We allow complex as a GCC extension.
   if (const PointerType *pt = dyn_cast<PointerType>(resType)) {
     if (!pt->getPointeeType()->isObjectType()) { // C99 6.5.2.4p2, 6.5.6p2
       Diag(OpLoc, diag::err_typecheck_arithmetic_incomplete_type,
@@ -1264,7 +1265,6 @@ QualType Sema::CheckIncrementDecrementOperand(Expr *op, SourceLocation OpLoc) {
       return QualType();
     }
   } else if (!resType->isRealType() && !resType->isComplexType()) { 
-    // Allowing Complex is a GCC extension.
     Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement,
          resType.getAsString(), op->getSourceRange());
     return QualType(); 
@@ -1555,7 +1555,9 @@ Action::ExprResult Sema::ParseUnaryOp(SourceLocation OpLoc, tok::TokenKind Op,
   case UnaryOperator::Not: // bitwise complement
     UsualUnaryConversions(Input);
     resultType = Input->getType();
-    if (!resultType->isIntegerType())  // C99 6.5.3.3p1
+    // C99 6.5.3.3p1. C99 does not support '~' for complex conjugation.
+    // We allow complex as a GCC extension.
+    if (!resultType->isIntegerType() && !resultType->isComplexType())
       return Diag(OpLoc, diag::err_typecheck_unary_expr,
                   resultType.getAsString());
     break;