GCC refuses to compile a declaration that follows immediately after a 'case' in a 'switch', even in C99 mode: int main() { int x = 1; switch (x) { case 1: int y = 7; } return 0; } Says GCC: In function `main': parse error before "int". However, if I add a dummy statement before the declaration, GCC compiles it fine: int main() { int x = 1; switch (x) { case 1: 4 + 5; int y = 7; } return 0; } Release: GCC 3.1.1 Environment: Seen on MinGW, but probably problem on all platforms How-To-Repeat: Compile the first example in the report.
From: "Joseph S. Myers" <jsm28@cam.ac.uk> To: <ddcc@email.com> Cc: <gcc-gnats@gcc.gnu.org>, <gcc-bugs@gcc.gnu.org> Subject: Re: c/7508: GCC refuses to compile a declartion right after a 'case' in switch Date: Tue, 6 Aug 2002 19:53:58 +0100 (BST) On 6 Aug 2002 ddcc@email.com wrote: > GCC refuses to compile a declaration that follows immediately after a > 'case' in a 'switch', even in C99 mode: Although C99 allows declarations and statements to be mixed, it does not make declarations into statements. Labels can only be applied to statements, not to declarations. As to allowing this as an extension, see the comment in c-parse.in explaining why we don't: NOTE: we don't allow labels on declarations; this might seem like a natural extension, but there would be a conflict between attributes on the label and prefix attributes on the declaration. */ -- Joseph S. Myers jsm28@cam.ac.uk
State-Changed-From-To: open->closed State-Changed-Why: As explained, we deliberately do not implement this extension.
Reopening to mark as INVALID.
Marked as INVALID.
*** Bug 23365 has been marked as a duplicate of this bug. ***
*** Bug 23895 has been marked as a duplicate of this bug. ***
*** Bug 21689 has been marked as a duplicate of this bug. ***
To get it to compile, use curly brackets after the "case": case 1: { int y = 7; } I would suggest that the existence of several duplicates argue for a clearer error message.
*** Bug 25779 has been marked as a duplicate of this bug. ***
*** Bug 26742 has been marked as a duplicate of this bug. ***