ports/74436: bison 1.875 produced g++ rejected code

Uranus uranus at it.muds.net
Fri Nov 26 19:20:20 UTC 2004


>Number:         74436
>Category:       ports
>Synopsis:       bison 1.875 produced g++ rejected code
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Nov 26 19:20:19 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Uranus
>Release:        FreeBSD 5.3-STABLE i386
>Organization:
>Environment:
System: FreeBSD it.muds.net 5.3-STABLE FreeBSD 5.3-STABLE #0: Sun Nov 7 13:15:09 CST 2004 root at it.muds.net:/usr/obj/usr/src/sys/ED i386


	
>Description:
The bison 1.875 will produce the following code:
#if defined (__GNUC_MINOR__) && 2093 <= (__GNUC__ * 1000 + __GNUC_MINOR__)
  __attribute__ ((__unused__))
#endif

When the `__attribute__ ((__unused__))' be compiled, we'll get the following error msg:
  parser.tab.cxx: In function `int yyparse()':
  parser.tab.cxx:2754: error: expected primary-expression

My g++ is system builtin version, 3.4.2 [FreeBSD] 20040728.
>How-To-Repeat:
Any yacc source code which could trigger that conditional compilation.
You can search from Google by the keywords `bison', `__attribute__', and `__unused__' for more information.
>Fix:
The solution refers to http://lists.gnu.org/archive/html/bison-patches/2003-01/msg00047.html and I reproduce a patch file here:

--- yacc.c.orig Sat Dec 28 16:36:02 2002
+++ yacc.c      Sat Nov 27 03:12:32 2004
@@ -465,7 +465,14 @@
 
 #define YYACCEPT       goto yyacceptlab
 #define YYABORT                goto yyabortlab
-#define YYERROR                goto yyerrlab1
+#define YYERROR                goto ]b4_location_if([do       \
+                         {                            \
+                           yylerrsp = yylsp;           \
+                           *++yylerrsp = yyloc;        \
+                           goto yyerrlab1;             \
+                         }                             \
+                       while (0)],                    \
+                       [goto yyerrlab1])[
 
 /* Like YYERROR except do call yyerror.  This remains here temporarily
    to ease the transition to the new meaning of YYERROR, for GCC.
@@ -1103,7 +1110,7 @@
 
   /* Else will try to reuse lookahead token after shifting the error
      token.  */
-  goto yyerrlab2;
+  goto yyerrlab1;
 
 
 /*----------------------------------------------------.
@@ -1111,21 +1118,6 @@
 ----------------------------------------------------*/
 yyerrlab1:
 
-  /* Suppress GCC warning that yyerrlab1 is unused when no action
-     invokes YYERROR.  */
-#if defined (__GNUC_MINOR__) && 2093 <= (__GNUC__ * 1000 + __GNUC_MINOR__)
-  __attribute__ ((__unused__))
-#endif
-
-]b4_location_if([  yylerrsp = yylsp;
-  *++yylerrsp = yyloc;])[
-  goto yyerrlab2;
-
-
-/*---------------------------------------------------------------.
-| yyerrlab2 -- pop states until the error token can be shifted.  |
----------------------------------------------------------------*/
-yyerrlab2:
   yyerrstatus = 3;     /* Each real token shifted decrements this.  */
 
   for (;;)
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list