]> git.saurik.com Git - bison.git/commitdiff
lalr1.cc: fix the support of YYERROR with variants
authorAkim Demaille <akim@lrde.epita.fr>
Fri, 15 Nov 2013 09:08:31 +0000 (10:08 +0100)
committerAkim Demaille <akim@lrde.epita.fr>
Fri, 15 Nov 2013 09:14:05 +0000 (10:14 +0100)
When variant are enabled, the yylhs variable (the left-hand side of
the rule being reduced, i.e. $$ and @$) is explicitly destroyed when
YYERROR is called.  This is because before running the user code, $$
is initialized, so that the user can properly use it.

However, when quitting yyparse, yylhs is also reclaimed by the C++
compiler: the variable goes out of scope.

Instead of trying to be too smart, let the compiler do its job: reduce
the scope of yylhs to exactly the reduction.  This way, whatever the
type of scope exit (regular, exception, return, goto...) this variable
will be properly reclaimed.

Reported by Paolo Simone Gasparello.
<http://lists.gnu.org/archive/html/bug-bison/2013-10/msg00003.html>

* data/lalr1.cc (yyparse): Reduce the scope of yylhs.
* tests/c++.at: We now pass this test.

data/lalr1.cc
tests/c++.at

index d3d063ab67b80aa0df8d3b2ad86234c39510b3b2..61dc666351aa76ea2f73ef923f4d60c48df191c5 100644 (file)
@@ -700,6 +700,7 @@ m4_if(b4_prefix, [yy], [],
 
     // State.
     int yyn;
+    /// Length of the RHS of the rule being reduced.
     int yylen = 0;
 
     // Error handling.
@@ -712,9 +713,6 @@ m4_if(b4_prefix, [yy], [],
     /// The locations where the error started and ended.
     stack_symbol_type yyerror_range[3];]])[
 
-    /// $$ and @@$.
-    stack_symbol_type yylhs;
-
     /// The return value of parse ().
     int yyresult;
 
@@ -815,6 +813,8 @@ b4_dollar_popdef])[]dnl
   `-----------------------------*/
   yyreduce:
     yylen = yyr2_[yyn];
+    {
+      stack_symbol_type yylhs;
     yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
     /* Variants are always initialized to an empty instance of the
        correct type. The default $$=$1 action is NOT applied when using
@@ -861,6 +861,7 @@ b4_dollar_popdef])[]dnl
 
     // Shift the result of the reduction.
     yypush_ (YY_NULLPTR, yylhs);
+    }
     goto yynewstate;
 
   /*--------------------------------------.
@@ -907,10 +908,7 @@ b4_dollar_popdef])[]dnl
        code.  */
     if (false)
       goto yyerrorlab;]b4_locations_if([[
-    yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[
-    /* $$ was initialized before running the user action.  */
-    YY_SYMBOL_PRINT ("Error: discarding", yylhs);
-    yylhs.~stack_symbol_type();]])[
+    yyerror_range[1].location = yystack_[yylen - 1].location;]])[
     /* Do not reclaim the symbols of the rule whose action triggered
        this YYERROR.  */
     yypop_ (yylen);
index 355e6247fbbfe37ab83f858dcb7c047f28e1afed..5b3df02bd8439fb10b8e548458cf45f26c1f3b65 100644 (file)
@@ -658,9 +658,6 @@ m4_pushdef([AT_TEST],
 
 AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR
 
-m4_if([$1], [], [],
-      [m4_if([$2], [without], [AT_XFAIL_IF([true])])])
-
 AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" $1])
 
 AT_DATA_GRAMMAR([[input.yy]],