Make sure we get extension diagnostics for GCC's complex extensions.

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
diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp
index 03f5d7f..9efd229 100644
--- a/Sema/SemaExpr.cpp
+++ b/Sema/SemaExpr.cpp
@@ -1256,18 +1256,23 @@
   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 @@
   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).