help-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

address@hidden: Bison potential fix.]


From: Dimitri van Heesch
Subject: address@hidden: Bison potential fix.]
Date: Thu, 21 Mar 2002 21:16:20 +0100
User-agent: Mutt/1.2.5.1i

Hello,

The below patch fixed the compile problem I had when compiling 
doxygen with bison 1.34. The result seems to work at run-time 
as well, although no extensive tests have been done by me.

----- Forwarded message from "Richard B. Kreckel" <address@hidden> -----

Delivered-To: address@hidden
Delivered-To: address@hidden
X-Authentication-Warning: higgs.physik.uni-mainz.de: kreckel owned process 
doing -bs
Date: Tue, 19 Mar 2002 14:28:45 +0100 (CET)
From: "Richard B. Kreckel" <address@hidden>
X-Sender: address@hidden
Reply-To: address@hidden
To: address@hidden
Subject: Bison potential fix.

Dimitri,

I have seen that you are struck by the "member with constructor not
allowed in union" problem in current bison skeleton files.  After some
discussion on the mailing list, Paul Eggert has finally come up with a fix
for that.  Could you please try it out with Doxygen and send an okay to
<address@hidden> if it works for you?  It did work fine for my C++
projects.  I would appreciate if the attached fix gets applied and a fixed
bison can roll out ASAP.  The appended patch seems to apply fine to bison
1.34 as available from any GNU mirror.

Thanks a lot in advance!
                     -richy.
-- 
Richard B. Kreckel
<address@hidden>
<http://wwwthep.physik.uni-mainz.de/~kreckel/>

---------- Forwarded message ----------
Date: Mon, 18 Mar 2002 14:09:55 -0800 (PST)
From: Paul Eggert <address@hidden>
To: address@hidden
Cc: address@hidden, address@hidden,
     address@hidden, address@hidden, address@hidden,
     address@hidden, address@hidden, address@hidden
Subject: Re: member with constructor not allowed in union

> From: Akim Demaille <address@hidden>
> Date: 18 Mar 2002 11:31:23 +0100

> We cannot afford to put YYSTYPE (and actually YYLTYPE) into a union,
> as it makes it impossible for C++ users to use any useful structure
> in it.

OK, but (as you know) the code was broken at runtime, because it used
memcpy to copy the C++ objects when growing the stack, and bypassing
the constructors and destructors led to "pyrotechnical" behavior as
described in the Debian bug report at:
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=130914>

> would you handle the reversal in 1.3x?

I've installed the following patch in 1.3x.  It is not quite a
reversal, though, because it also fixes the "pyrotechnical" problem,
by disabling stack growth for C++ parsers that define YYSTYPE.
This should fix the compile-time problems that C++ users are
complaining about.  It should also fix the more-serious (and less
obvious) run-time problems with C++ parsers.

If I understand things correctly this change is not needed for the
1.4x version, as it has a separate C++ template.  But if I'm wrong
please let me know, so that I can install it there too.

This patch passes "make check" with Bison, but "make check" doesn't
have any C++ examples so I'd appreciate it if you C++ aficionados try
it out.


2002-03-18  Paul Eggert  <address@hidden>

        Fix the problem with union yyalloc and C++ (Debian bug 130914).

        * src/bison.simple (union yyalloc, YYSTACK_GAP_MAX, YYSTACK_BYTES,
        YYSTACK_RELOCATE): Do not define if yyoverflow is defined, or if
        this is a C++ parser and YYSTYPE or YYLTYPE has nontrivial
        constructors or destructors.
        (yymemcpy) [! defined YYSTACK_RELOCATE]: Do not define; not needed.
        (yyparse) [! defined YYSTACK_RELOCATE]: Do not relocate the stack.

        * src/reader.c (parse_union_decl): Define YYSTYPE_IS_TRIVIAL if we
        use our YYSTYPE.  It must be trivial, or our own union wouldn't be
        valid C++ anyway.
        (readgram): Define YYSTYPE_IS_TRIVIAL if it is int.
        (reader_output_yylsp): Define YYLTYPE_IS_TRIVIAL if we use our
        YYLTYPE.

Index: src/bison.simple
===================================================================
RCS file: /cvsroot/bison/bison/src/Attic/bison.simple,v
retrieving revision 1.53.2.19
diff -p -u -r1.53.2.19 bison.simple
--- src/bison.simple    25 Feb 2002 18:02:06 -0000      1.53.2.19
+++ src/bison.simple    18 Mar 2002 21:44:03 -0000
@@ -66,6 +66,12 @@
 #  define YYSTACK_ALLOC malloc
 #  define YYSTACK_FREE free
 # endif
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
@@ -109,7 +115,7 @@ union yyalloc
       }                                                                        
\
     while (0)
 
-#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+#endif
 
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -236,7 +242,7 @@ int yydebug;
 # define YYMAXDEPTH 10000
 #endif
 
-#if ! defined (yyoverflow) && ! defined (yymemcpy)
+#if defined (YYSTACK_RELOCATE) && ! defined (yymemcpy)
 # if __GNUC__ > 1              /* GNU C and GNU C++ define this.  */
 #  define yymemcpy __builtin_memcpy
 # else                         /* not GNU C or C++ */
@@ -504,6 +510,9 @@ yyparse (YYPARSE_PARAM_ARG)
        yyvs = yyvs1;
       }
 #else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
       /* Extend the stack our own way.  */
       if (yystacksize >= YYMAXDEPTH)
        goto yyoverflowlab;
@@ -526,6 +535,7 @@ yyparse (YYPARSE_PARAM_ARG)
        if (yyss1 != yyssa)
          YYSTACK_FREE (yyss1);
       }
+# endif
 #endif /* no yyoverflow */
 
       yyssp = yyss + yysize - 1;
Index: src/reader.c
===================================================================
RCS file: /cvsroot/bison/bison/src/reader.c,v
retrieving revision 1.72.2.30
diff -p -u -r1.72.2.30 reader.c
--- src/reader.c        4 Mar 2002 16:59:51 -0000       1.72.2.30
+++ src/reader.c        18 Mar 2002 21:44:03 -0000
@@ -745,6 +745,7 @@ typedef union";
   const char *epilogue = "\
  yystype;\n\
 # define YYSTYPE yystype\n\
+# define YYSTYPE_IS_TRIVIAL 1\n\
 #endif\n";
 
   if (typed)
@@ -1617,12 +1618,16 @@ readgram (void)
       /* We used to use `unsigned long' as YYSTYPE on MSDOS,
          but it seems better to be consistent.
          Most programs should declare their own type anyway.  */
-      obstack_sgrow (&attrs_obstack,
-                          "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n");
+      obstack_sgrow (&attrs_obstack, "\
+#ifndef YYSTYPE\n\
+# define YYSTYPE int\n\
+# define YYSTYPE_IS_TRIVIAL 1\n\
+#endif\n");
       if (defines_flag)
        obstack_sgrow (&defines_obstack, "\
 # ifndef YYSTYPE\n\
 #  define YYSTYPE int\n\
+#  define YYSTYPE_IS_TRIVIAL 1\n\
 # endif\n");
     }
 
@@ -2043,6 +2048,7 @@ typedef struct yyltype\n\
 } yyltype;\n\
 \n\
 # define YYLTYPE yyltype\n\
+# define YYLTYPE_IS_TRIVIAL 1\n\
 #endif\n\
 \n");
 }

----- End forwarded message -----



reply via email to

[Prev in Thread] Current Thread [Next in Thread]