[cfe-commits] r132903 - in /cfe/trunk: lib/Parse/ParseStmt.cpp test/Parser/switch-recovery.cpp

Douglas Gregor dgregor at apple.com
Tue Jun 14 07:41:39 PDT 2011


On Jun 12, 2011, at 10:50 PM, David Majnemer wrote:

> Author: majnemer
> Date: Mon Jun 13 00:50:12 2011
> New Revision: 132903
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=132903&view=rev
> Log:
> Improve the diagnostics generated for switch statements missing expressions
> 
> - Move the diagnostic to the case statement instead of at the end of the switch
> - Add a fix-it hint as to how to fix the compilation error

I don't consider this a proper use of Fix-Its. If we encounter code like

	switch (z) {
	case 4:
	}

it's almost surely the case that the user got distracted and forgot to write the code for that case, and it's highly unlikely that 

	;

is the right code for this case. Moreover, placing the ';' right after the ':' like this:

	switch (z) {
	case 4:;
	}

is going to hide the issue, especially if we're in a system that automatically applies Fix-Its.

Please revert this patch. I'm sorry that the FIXME there was misleading, but the FIXME is wrong and we shouldn't be suggesting any Fix-Its here because there isn't a clearly correct fix.

	- Doug

> Modified:
>    cfe/trunk/lib/Parse/ParseStmt.cpp
>    cfe/trunk/test/Parser/switch-recovery.cpp
> 
> Modified: cfe/trunk/lib/Parse/ParseStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseStmt.cpp?rev=132903&r1=132902&r2=132903&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseStmt.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseStmt.cpp Mon Jun 13 00:50:12 2011
> @@ -502,6 +502,7 @@
>   StmtTy *DeepestParsedCaseStmt = 0;
> 
>   // While we have case statements, eat and stack them.
> +  SourceLocation ColonLoc;
>   do {
>     SourceLocation CaseLoc = MissingCase ? Expr.get()->getExprLoc() :
>                                            ConsumeToken();  // eat the 'case'.
> @@ -539,7 +540,6 @@
> 
>     ColonProtection.restore();
> 
> -    SourceLocation ColonLoc;
>     if (Tok.is(tok::colon)) {
>       ColonLoc = ConsumeToken();
> 
> @@ -589,8 +589,9 @@
>   } else {
>     // Nicely diagnose the common error "switch (X) { case 4: }", which is
>     // not valid.
> -    // FIXME: add insertion hint.
> -    Diag(Tok, diag::err_label_end_of_compound_statement);
> +    SourceLocation ExpectedLoc = PP.getLocForEndOfToken(ColonLoc);
> +    Diag(ExpectedLoc, diag::err_label_end_of_compound_statement)
> +      << FixItHint::CreateInsertion(ExpectedLoc, ";");
>     SubStmt = true;
>   }
> 
> @@ -634,7 +635,9 @@
> 
>   // Diagnose the common error "switch (X) {... default: }", which is not valid.
>   if (Tok.is(tok::r_brace)) {
> -    Diag(Tok, diag::err_label_end_of_compound_statement);
> +    SourceLocation ExpectedLoc = PP.getLocForEndOfToken(ColonLoc);
> +    Diag(ExpectedLoc, diag::err_label_end_of_compound_statement)
> +      << FixItHint::CreateInsertion(ExpectedLoc, ";");
>     return StmtError();
>   }
> 
> 
> Modified: cfe/trunk/test/Parser/switch-recovery.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/switch-recovery.cpp?rev=132903&r1=132902&r2=132903&view=diff
> ==============================================================================
> --- cfe/trunk/test/Parser/switch-recovery.cpp (original)
> +++ cfe/trunk/test/Parser/switch-recovery.cpp Mon Jun 13 00:50:12 2011
> @@ -156,3 +156,17 @@
>     }
>   }
> }
> +
> +void missing_statement_case(int x) {
> +  switch (x) {
> +    case 1:
> +    case 0: // expected-error {{label at end of compound statement: expected statement}}
> +  }
> +}
> +
> +void missing_statement_default(int x) {
> +  switch (x) {
> +    case 0:
> +    default: // expected-error {{label at end of compound statement: expected statement}}
> +  }
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list