]> granicus.if.org Git - clang/commitdiff
Make sure we get extension diagnostics for GCC's complex extensions.
authorSteve Naroff <snaroff@apple.com>
Fri, 24 Aug 2007 17:20:07 +0000 (17:20 +0000)
committerSteve Naroff <snaroff@apple.com>
Fri, 24 Aug 2007 17:20:07 +0000 (17:20 +0000)
Now we emit the following when -pedantic-errors is enabled...

[dylan:~/llvm/tools/clang] admin% ../../Debug/bin/clang complex.c -pedantic-errors
complex.c:4:3: error: ISO C does not support '++'/'--' on complex integer types
  ++x;
  ^ ~
complex.c:9:7: error: ISO C does not support '~' for complex conjugation
  X = ~Y;
      ^
complex.c:10:7: error: ISO C does not support '~' for complex conjugation
  x = ~y;
      ^

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

Sema/SemaExpr.cpp
include/clang/Basic/DiagnosticKinds.def

index 03f5d7f8978bb868513049bfe5db972454a0a7e5..9efd229cc0bba230374652d3e771f2e20fbdeff6 100644 (file)
@@ -1256,18 +1256,23 @@ 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 does not support ++/-- on complex types.
-  // We allow complex as a GCC extension.
+  // C99 6.5.2.4p1: 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,
            resType.getAsString(), op->getSourceRange());
       return QualType();
     }
-  } else if (!resType->isRealType() && !resType->isComplexType()) { 
-    Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement,
-         resType.getAsString(), op->getSourceRange());
-    return QualType(); 
+  } else if (!resType->isRealType()) {
+    if (resType->isComplexType()) 
+      // C99 does not support ++/-- on complex types.
+      Diag(OpLoc, diag::ext_integer_increment_complex,
+           resType.getAsString(), op->getSourceRange());
+    else {
+      Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement,
+           resType.getAsString(), op->getSourceRange());
+      return QualType();
+    }
   }
   // At this point, we know we have a real, complex or pointer type. 
   // Now make sure the operand is a modifiable lvalue.
@@ -1555,11 +1560,16 @@ Action::ExprResult Sema::ParseUnaryOp(SourceLocation OpLoc, tok::TokenKind Op,
   case UnaryOperator::Not: // bitwise complement
     UsualUnaryConversions(Input);
     resultType = Input->getType();
-    // 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());
+    // C99 6.5.3.3p1. We allow complex as a GCC extension.
+    if (!resultType->isIntegerType()) {
+      if (resultType->isComplexType())
+        // C99 does not support '~' for complex conjugation.
+        Diag(OpLoc, diag::ext_integer_complement_complex,
+                    resultType.getAsString());
+      else
+        return Diag(OpLoc, diag::err_typecheck_unary_expr,
+                    resultType.getAsString());
+    }
     break;
   case UnaryOperator::LNot: // logical negation
     // Unlike +/-/~, integer promotions aren't done here (C99 6.5.3.3p5).
index f2dd28225859d4e7cf8a14748c07c954ffe841d7..920ba456eb2a0b62e656b6d5a2e9b8ebc7c15cab 100644 (file)
@@ -275,6 +275,10 @@ DIAG(ext_integer_complex, EXTENSION,
      "ISO C does not support complex integer types")
 DIAG(ext_thread_before, EXTENSION,
      "'__thread' before 'static'")
+DIAG(ext_integer_increment_complex, EXTENSION,
+     "ISO C does not support '++'/'--' on complex integer types")
+DIAG(ext_integer_complement_complex, EXTENSION,
+     "ISO C does not support '~' for complex conjugation")
 
 DIAG(ext_empty_struct_union_enum, EXTENSION,
      "use of empty %0 extension")