From acb0bd85d30ecacbe872ca9d9cfac5d7b6038a43 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 29 Jun 2010 23:25:20 +0000 Subject: [PATCH] Re-improve recovery when the condition of a switch statement does not have integral or enumeration type, so that we still check the contents of the switch body. My previous patch made this worse; now we're back to where we were previously. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107223 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaOverload.cpp | 8 +++----- lib/Sema/SemaStmt.cpp | 8 ++++---- test/Sema/complex-int.c | 6 +----- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index af28d46b5f..86724f9a92 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -3106,7 +3106,7 @@ Sema::ConvertToIntegralOrEnumerationType(SourceLocation Loc, ExprArg FromE, if (!RecordTy || !getLangOptions().CPlusPlus) { Diag(Loc, NotIntDiag) << T << From->getSourceRange(); - return ExprError(); + return move(FromE); } // We must have a complete class type. @@ -3190,14 +3190,12 @@ Sema::ConvertToIntegralOrEnumerationType(SourceLocation Loc, ExprArg FromE, Diag(Conv->getLocation(), AmbigNote) << ConvTy->isEnumeralType() << ConvTy; } - return ExprError(); + return move(FromE); } - if (!From->getType()->isIntegralOrEnumerationType()) { + if (!From->getType()->isIntegralOrEnumerationType()) Diag(Loc, NotIntDiag) << From->getType() << From->getSourceRange(); - return ExprError(); - } return move(FromE); } diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index fed30e4e56..efd74e3c25 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -486,11 +486,11 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, StmtArg Switch, // be represented by the promoted type. Therefore we need to find // the pre-promotion type of the switch condition. if (!CondExpr->isTypeDependent()) { - if (!CondType->isIntegerType()) { // C99 6.8.4.2p1 - Diag(SwitchLoc, diag::err_typecheck_statement_requires_integer) - << CondType << CondExpr->getSourceRange(); + // We have already converted the expression to an integral or enumeration + // type, when we started the switch statement. If we don't have an + // appropriate type now, just return an error. + if (!CondType->isIntegralOrEnumerationType()) return StmtError(); - } if (CondExpr->isKnownToHaveBooleanValue()) { // switch(bool_expr) {...} is often a programmer error, e.g. diff --git a/test/Sema/complex-int.c b/test/Sema/complex-int.c index bcd9939b29..cb76a342c2 100644 --- a/test/Sema/complex-int.c +++ b/test/Sema/complex-int.c @@ -16,13 +16,9 @@ result = arr*brr; result = xx*yy; switch (arr) { // expected-error{{statement requires expression of integer type ('_Complex int' invalid)}} - default: ; -} - - switch (ii) { case brr: ; // expected-error{{expression is not an integer constant expression}} case xx: ; // expected-error{{expression is not an integer constant expression}} - } +} } void Tester() { -- 2.40.0