Support '~' for complex conjugation. This is a GCC extension.

This following now compiles without error...

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

llvm-svn: 41341
This commit is contained in:
Steve Naroff 2007-08-23 22:06:40 +00:00
parent 7b939cf606
commit 8ddb23a6c5
1 changed files with 5 additions and 3 deletions

View 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;