Parsing of switch statement

Oleg Krivosheev kriol@fnal.gov
Thu Dec 11 05:32:00 GMT 1997


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);





More information about the Gcc mailing list