* Re: Parsing of switch statement
1997-12-10 12:02 Parsing of switch statement Craig J Copi
1997-12-10 15:53 ` Joe Buck
@ 1997-12-11 5:32 ` Oleg Krivosheev
1 sibling, 0 replies; 3+ messages in thread
From: Oleg Krivosheev @ 1997-12-11 5:32 UTC (permalink / raw)
To: Craig J Copi; +Cc: egcs
Hi,
On Wed, 10 Dec 1997, Craig J Copi wrote:
> Date: Wed, 10 Dec 1997 15:01:50 -0500
> From: Craig J Copi <copi@erebus.phys.cwru.edu>
> Reply-To: egcs@cygnus.com
> To: egcs@cygnus.com
> Subject: Parsing of switch statement
>
> Recently I have encountered some code that contains an empty case
> statement at the end of a switch (see example below). The code compiles under
> gcc but not under g++. I get the error
> test.c: In function `int main (int, char **)':
> test.c:9: parse error before `}'
> If I put a ';' after the case 0 : it will also compile under g++. I've tried
> this on sparc-sun-solaris2.5.1 with egcs-2.90.21 971202 (egcs-1.00 release)
> and egcs-2.91.02 971206 (gcc-2.8.0); both give the same results. Is this the
> correct behavior?
No, it's not.
> Does the C++ spec require this?
Nor C neither C++ require this. This is GNU C extension.
Just in case, some times ago i patched
C++ parser to allow such a code. It was
not accepted by maintainer, i believe.
Just in case i enclose patch below.
OK
*** parse.y.orig Tue Jun 17 21:25:08 1997
--- parse.y Mon Jul 7 00:58:28 1997
***************
*** 3583,3595 ****
.poplevel
{ finish_stmt (); }
| CASE expr_no_commas ':'
! { do_case ($2, NULL_TREE); }
stmt
| CASE expr_no_commas ELLIPSIS expr_no_commas ':'
! { do_case ($2, $4); }
stmt
| DEFAULT ':'
! { do_case (NULL_TREE, NULL_TREE); }
stmt
| BREAK ';'
{ emit_line_note (input_filename, lineno);
--- 3583,3616 ----
.poplevel
{ finish_stmt (); }
| CASE expr_no_commas ':'
! { do_case ($2, NULL_TREE);
! if (yychar == YYEMPTY) /* read ahead */
! yychar = YYLEX;
! if ( yychar == '}' ) { /* no stmt, just closing } */
! yyungetc ('}', 0 ); /* put it back */
! yychar=';' ; /* fool parser with fake empty stmt */
! }
! }
stmt
| CASE expr_no_commas ELLIPSIS expr_no_commas ':'
! { do_case ($2, $4);
! if (yychar == YYEMPTY) /* read ahead */
! yychar = YYLEX;
! if ( yychar == '}' ) { /* no stmt, just closing } */
! yyungetc ('}', 0 ); /* put it back */
! yychar=';' ; /* fool parser with fake empty stmt */
! }
! }
stmt
| DEFAULT ':'
! { do_case (NULL_TREE, NULL_TREE);
! if (yychar == YYEMPTY) /* read ahead */
! yychar = YYLEX;
! if ( yychar == '}' ) { /* no stmt, just closing } */
! yyungetc ('}', 0 ); /* put it back */
! yychar=';' ; /* fool parser with fake empty stmt */
! }
! }
stmt
| BREAK ';'
{ emit_line_note (input_filename, lineno);
^ permalink raw reply [flat|nested] 3+ messages in thread