]> granicus.if.org Git - clang/commitdiff
improve error recovery for extra ')'s after a if/switch/while condition. Before:
authorChris Lattner <sabre@nondot.org>
Sat, 28 Apr 2012 16:24:20 +0000 (16:24 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 28 Apr 2012 16:24:20 +0000 (16:24 +0000)
t.c:3:9: error: expected expression
  if (x)) {
        ^

.. which isn't even true - a statement or expression is fine.  After:

t.c:3:9: error: extraneous ')' after condition, expected a statement
  if (x)) {
        ^

This is the second part of PR12595

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155762 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseStmt.cpp
test/Parser/recovery.c

index 15c93e3b2f9a122e052fe06ac493793445e194d4..d28e1dcda0ddcc3d648d1b0f99d8fa13dacdb39e 100644 (file)
@@ -396,6 +396,8 @@ def err_expected_init_in_condition : Error<
   "variable declaration in condition must have an initializer">;
 def err_expected_init_in_condition_lparen : Error<
   "variable declaration in condition cannot have a parenthesized initializer">;
+def err_extraneous_rparen_in_condition : Error<
+  "extraneous ')' after condition, expected a statement">;
 def warn_parens_disambiguated_as_function_decl : Warning<
   "parentheses were disambiguated as a function declarator">,
   InGroup<VexingParse>;
index 8dd0a2a5dc81933bbb0715d5514fac1d29d1a1f8..9796ea69bacd6cf2329d846dfb9526fb78b4d117 100644 (file)
@@ -895,6 +895,16 @@ bool Parser::ParseParenExprOrCondition(ExprResult &ExprResult,
 
   // Otherwise the condition is valid or the rparen is present.
   T.consumeClose();
+  
+  // Check for extraneous ')'s to catch things like "if (foo())) {".  We know
+  // that all callers are looking for a statement after the condition, so ")"
+  // isn't valid.
+  while (Tok.is(tok::r_paren)) {
+    Diag(Tok, diag::err_extraneous_rparen_in_condition)
+      << FixItHint::CreateRemoval(Tok.getLocation());
+    ConsumeParen();
+  }
+  
   return false;
 }
 
index 3916acfda1e01a8fd4b016764501eb502e6cd8d7..178427e4b3c22f302e9a6b0cfe39116fed83a09b 100644 (file)
@@ -37,8 +37,9 @@ void test(int a) {
     test(0);
   else
     ;
-  
-  if (x.i == 0))   // expected-error {{expected expression}}
+
+  // PR12595
+  if (x.i == 0))   // expected-error {{extraneous ')' after condition, expected a statement}}
     test(0);
   else
     ;