GCC supports the complex conjugate operator (an extension) on complex int
as well as complex float. rdar://6097730
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54080 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 99c0709..25a86fa 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -2261,16 +2261,14 @@
case UnaryOperator::Not: // bitwise complement
UsualUnaryConversions(Input);
resultType = Input->getType();
- // 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());
- }
+ // C99 6.5.3.3p1. We allow complex int and float as a GCC extension.
+ if (resultType->isComplexType() || resultType->isComplexIntegerType())
+ // C99 does not support '~' for complex conjugation.
+ Diag(OpLoc, diag::ext_integer_complement_complex,
+ resultType.getAsString(), Input->getSourceRange());
+ else if (!resultType->isIntegerType())
+ return Diag(OpLoc, diag::err_typecheck_unary_expr,
+ resultType.getAsString(), Input->getSourceRange());
break;
case UnaryOperator::LNot: // logical negation
// Unlike +/-/~, integer promotions aren't done here (C99 6.5.3.3p5).