From: Steve Naroff Date: Fri, 24 Aug 2007 17:20:07 +0000 (+0000) Subject: Make sure we get extension diagnostics for GCC's complex extensions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=084f9ed404a4cb266a2b5343b7bfb8393cf4aeea;p=clang 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 03f5d7f897..9efd229cc0 100644 --- a/Sema/SemaExpr.cpp +++ b/Sema/SemaExpr.cpp @@ -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(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). diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index f2dd282258..920ba456eb 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/include/clang/Basic/DiagnosticKinds.def @@ -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")