[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: cp/parse.y:2120: invalid value: $3
From: |
Paul Eggert |
Subject: |
Re: cp/parse.y:2120: invalid value: $3 |
Date: |
Mon, 29 Apr 2002 15:08:46 -0700 (PDT) |
> Date: Mon, 29 Apr 2002 13:31:29 -0700 (PDT)
> From: "David S. Miller" <address@hidden>
>
> http://gcc.gnu.org/ml/gcc-bugs/2002-04/msg01309.html
That thread explains why the C++ parser code is the way it is.
Unfortunately, the code is still wrong. Here's why.
If you look at the C code that is generated by Bison 1.35 from
cp/parse.y, you'll find that the corresponding C-language action looks
like this:
case 456:
#line 2151 "parse.y"
{ /* Set things up as initdcl0_innards expects. */
(*) yyvsp[1].ttype = yyvsp[0].ttype;
yyvsp[0].ttype = yyvsp[-1].ttype;
yyvsp[-1].ftype.t = NULL_TREE;
yyvsp[-1].ftype.lookups = NULL_TREE; }
break;
The line marked (*) is the expansion of the controversial statement
`$<ttype>3 = $2;' that is attempting to make the stack "look right".
OK, what happens next? The "break" statement takes us to here:
yyvsp -= yylen;
yyssp -= yylen;
#if YYLSP_NEEDED
yylsp -= yylen;
#endif
yylen is zero, so these statements have no effect. The next statement
executed is:
(**) *++yyvsp = yyval;
and this obliterates the effect of (*): it's as if (*) had never
happened, which means that `$<ttype>3 = $2;' is a no-op.
To fix the bug, you need to change (*) to look like this instead:
yyval = yyvsp[0].ttype;
so that (*) stores the desired value on the stack. This will put the
desired value into yyval so that (**) makes the stack "look right".
Here's how to do this:
2002-04-29 Paul Eggert <address@hidden>
* parse.y (nomods_initdcl0): Replace $<ttype>3 with $<ttype>$,
to fix a typo uncovered by CVS Bison. Let's buy Akim Demaille
a beer!
--- parse.y 2002-04-29 14:43:20.511360000 -0700
+++ parse.y-fix 2002-04-29 14:55:06.991361000 -0700
@@ -2149,7 +2149,7 @@ notype_initdcl0:
nomods_initdcl0:
notype_declarator maybeasm
{ /* Set things up as initdcl0_innards expects. */
- $<ttype>3 = $2;
+ $<ttype>$ = $2;
$2 = $1;
$<ftype>1.t = NULL_TREE;
$<ftype>1.lookups = NULL_TREE; }
- Re: $<out of range>, (continued)
cp/parse.y:2120: invalid value: $3, Akim Demaille, 2002/04/29
- Re: cp/parse.y:2120: invalid value: $3, Paul Eggert, 2002/04/29
- Re: cp/parse.y:2120: invalid value: $3, Nathan Sidwell, 2002/04/29
- Re: cp/parse.y:2120: invalid value: $3, Daniel Berlin, 2002/04/29
- Re: cp/parse.y:2120: invalid value: $3, Paul Eggert, 2002/04/29
- Re: cp/parse.y:2120: invalid value: $3, David S. Miller, 2002/04/29
- Re: cp/parse.y:2120: invalid value: $3,
Paul Eggert <=
- Re: cp/parse.y:2120: invalid value: $3, Jakub Jelinek, 2002/04/29
- Re: cp/parse.y:2120: invalid value: $3, Paul Eggert, 2002/04/29
- Re: cp/parse.y:2120: invalid value: $3, Mark Mitchell, 2002/04/29
- Re: cp/parse.y:2120: invalid value: $3, Jason Merrill, 2002/04/30
- Re: cp/parse.y:2120: invalid value: $3, Jason Merrill, 2002/04/30
- Re: cp/parse.y:2120: invalid value: $3, Nathan Sidwell, 2002/04/30
- Re: cp/parse.y:2120: invalid value: $3, Akim Demaille, 2002/04/30
- Re: cp/parse.y:2120: invalid value: $3, Jason Merrill, 2002/04/30
Re: cp/parse.y:2120: invalid value: $3, Franz Sirl, 2002/04/30
Re: cp/parse.y:2120: invalid value: $3, Akim Demaille, 2002/04/30