]> git.saurik.com Git - bison.git/commitdiff
* data/glr.c (yyresolveLocations): Remove bogus YYASSERT that the
authorJoel E. Denny <jdenny@ces.clemson.edu>
Sun, 21 May 2006 06:22:36 +0000 (06:22 +0000)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Sun, 21 May 2006 06:22:36 +0000 (06:22 +0000)
state before an empty RHS is always resolved here.  Only the location
of that state is guaranteed to be resolved, and that's enough.  This
fixes the remaining bug reported by Derek M. Jones in
<http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00027.html>.
* tests/glr-regression.at (Uninitialized location when reporting
ambiguity): Test the above case.
Also, the embedded comments in this test case claim it checks the case
of an empty RHS that has inherited the initial location.  However, the
corresponding LHS was already resolved, so yyresolveLocations didn't
actually have reason to modify it.  Fix this by forcing
nondeterministic operation at the beginning of the parse.

ChangeLog
data/glr.c
tests/glr-regression.at

index 5e13d5a95e15a2599b08d4877d08b1e751a2d698..bfe0b48c20898e91823c524a4b8fa6209e050595 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2006-05-21  Joel E. Denny  <jdenny@ces.clemson.edu>
+
+       * data/glr.c (yyresolveLocations): Remove bogus YYASSERT that the
+       state before an empty RHS is always resolved here.  Only the location
+       of that state is guaranteed to be resolved, and that's enough.  This
+       fixes the remaining bug reported by Derek M. Jones in
+       <http://lists.gnu.org/archive/html/bug-bison/2006-05/msg00027.html>.
+       * tests/glr-regression.at (Uninitialized location when reporting
+       ambiguity): Test the above case.
+       Also, the embedded comments in this test case claim it checks the case
+       of an empty RHS that has inherited the initial location.  However, the
+       corresponding LHS was already resolved, so yyresolveLocations didn't
+       actually have reason to modify it.  Fix this by forcing
+       nondeterministic operation at the beginning of the parse.
+
 2006-05-20  Paul Eggert  <eggert@cs.ucla.edu>
 
        * data/c.m4 (b4_yy_symbol_print_generate):
index d01122a1ded6d34dacb5573e451ddf70799fc64a..7c9443eafa4633f0f70f5f6ff3250f98f3966846 100644 (file)
@@ -201,7 +201,7 @@ typedef struct YYLTYPE
 ]])
 
 b4_defines_if([#include @output_header_name@],
-              [b4_shared_declarations])[
+             [b4_shared_declarations])[
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
@@ -1836,8 +1836,14 @@ yyresolveLocations (yyGLRState* yys1, int yyn1,
            }
          else
            {
+             /* Both yyresolveAction and yyresolveLocations traverse the GSS
+                in reverse rightmost order.  It is only necessary to invoke
+                yyresolveLocations on a subforest for which yyresolveAction
+                would have been invoked next had an ambiguity not been
+                detected.  Thus the location of the previous state (but not
+                necessarily the previous state itself) is guaranteed to be
+                resolved already.  */
              yyGLRState *yyprevious = yyoption->yystate;
-             YYASSERT (yyprevious->yyresolved);
              yyrhsloc[0].yystate.yyloc = yyprevious->yyloc;
            }
          yychar_current = yychar;
index 54424656df601bd31962a223e783be471a34258f..9e3cec79df4c4dd413862bc548faa12d235ac5b6 100644 (file)
@@ -1606,17 +1606,22 @@ AT_DATA_GRAMMAR([glr-regr17.y],
 
 %%
 
+/* Tests the case of an empty RHS that has inherited the location of the
+   previous nonterminal, which is unresolved.  That location is reported as the
+   last position of the ambiguity.  */
+start: ambig1 empty1 | ambig2 empty2 ;
+
 /* Tests multiple levels of yyresolveLocations recursion.  */
-start: ambig1 | ambig2 ;
 ambig1: sub_ambig1 | sub_ambig2 ;
 ambig2: sub_ambig1 | sub_ambig2 ;
 
-/* Tests non-empty RHS as well as empty RHS with either initial location or
-   location of previous token.  Both empty RHS locations are printed in the
-   error message.  */
-sub_ambig1: empty 'a' 'b' empty ;
-sub_ambig2: empty 'a' 'b' empty ;
-empty: ;
+/* Tests the case of a non-empty RHS as well as the case of an empty RHS that
+   has inherited the initial location.  The empty RHS's location is reported as
+   the first position in the ambiguity.  */
+sub_ambig1: empty1 'a' 'b' ;
+sub_ambig2: empty2 'a' 'b' ;
+empty1: ;
+empty2: ;
 
 %%