mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-17 00:03:03 +00:00
c++: issue a warning with a value is moved several times
Suggested by Frank Heckenbach. http://lists.gnu.org/archive/html/bug-bison/2018-09/msg00022.html * src/scan-code.l (parse_ref): Check multiple occurrences of rhs values. * tests/c++.at (Multiple occurrences of $n and api.value.automove): New.
This commit is contained in:
@@ -439,26 +439,22 @@ parse_ref (char *cp, symbol_list *rule, int rule_length,
|
|||||||
if ('[' == *cp)
|
if ('[' == *cp)
|
||||||
{
|
{
|
||||||
/* Ignore the brackets. */
|
/* Ignore the brackets. */
|
||||||
char *p;
|
for (cp_end = ++cp; *cp_end != ']'; ++cp_end)
|
||||||
for (p = ++cp; *p != ']'; ++p)
|
|
||||||
continue;
|
continue;
|
||||||
cp_end = p;
|
|
||||||
|
|
||||||
explicit_bracketing = true;
|
explicit_bracketing = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Take all characters of the name. */
|
/* Take all characters of the name. */
|
||||||
char* p;
|
for (char* p = cp; *p; ++p)
|
||||||
for (p = cp; *p; ++p)
|
|
||||||
if (is_dot_or_dash (*p))
|
if (is_dot_or_dash (*p))
|
||||||
{
|
{
|
||||||
ref_tail_fields = p;
|
ref_tail_fields = p;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (p = cp; *p; ++p)
|
for (cp_end = cp; *cp_end; ++cp_end)
|
||||||
continue;
|
continue;
|
||||||
cp_end = p;
|
|
||||||
|
|
||||||
explicit_bracketing = false;
|
explicit_bracketing = false;
|
||||||
}
|
}
|
||||||
@@ -705,8 +701,15 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
|
|||||||
obstack_quote (&obstack_for_string, type_name);
|
obstack_quote (&obstack_for_string, type_name);
|
||||||
obstack_sgrow (&obstack_for_string, ")[");
|
obstack_sgrow (&obstack_for_string, ")[");
|
||||||
if (0 < n)
|
if (0 < n)
|
||||||
symbol_list_n_get (effective_rule, n)->action_props.is_value_used =
|
{
|
||||||
true;
|
symbol_list *sym = symbol_list_n_get (effective_rule, n);
|
||||||
|
if (muscle_percent_define_ifdef ("api.value.automove")
|
||||||
|
&& sym->action_props.is_value_used)
|
||||||
|
complain (&dollar_loc, Wother,
|
||||||
|
_("multiple occurrences of $%s with api.value.automove enabled"),
|
||||||
|
cp);
|
||||||
|
sym->action_props.is_value_used = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
37
tests/c++.at
37
tests/c++.at
@@ -190,6 +190,41 @@ AT_PARSER_CHECK([./list], 0, [],
|
|||||||
AT_BISON_OPTION_POPDEFS
|
AT_BISON_OPTION_POPDEFS
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
|
|
||||||
|
## --------------------------------------------------- ##
|
||||||
|
## Multiple occurrences of $n and api.value.automove. ##
|
||||||
|
## --------------------------------------------------- ##
|
||||||
|
|
||||||
|
AT_SETUP([Multiple occurrences of $n and api.value.automove])
|
||||||
|
|
||||||
|
AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc"])
|
||||||
|
|
||||||
|
AT_DATA_GRAMMAR([input.yy],
|
||||||
|
[[%skeleton "lalr1.cc"
|
||||||
|
%define api.value.automove
|
||||||
|
%token <int> NUMBER "number"
|
||||||
|
%nterm <int> exp
|
||||||
|
%%
|
||||||
|
exp:
|
||||||
|
"number" { $$ = $1; $$; }
|
||||||
|
| "twice" exp { $$ = $2 + $2; }
|
||||||
|
| "thrice" exp[val] { $$ = $2 + $val + $2; }
|
||||||
|
]])
|
||||||
|
|
||||||
|
AT_BISON_CHECK([[-fcaret input.yy]], [0], [],
|
||||||
|
[[input.yy:16.33-34: warning: multiple occurrences of $2 with api.value.automove enabled [-Wother]
|
||||||
|
| "twice" exp { $$ = $2 + $2; }
|
||||||
|
^^
|
||||||
|
input.yy:17.33-36: warning: multiple occurrences of $val with api.value.automove enabled [-Wother]
|
||||||
|
| "thrice" exp[val] { $$ = $2 + $val + $2; }
|
||||||
|
^^^^
|
||||||
|
input.yy:17.40-41: warning: multiple occurrences of $2 with api.value.automove enabled [-Wother]
|
||||||
|
| "thrice" exp[val] { $$ = $2 + $val + $2; }
|
||||||
|
^^
|
||||||
|
]])
|
||||||
|
|
||||||
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
AT_CLEANUP
|
||||||
|
|
||||||
|
|
||||||
## ---------- ##
|
## ---------- ##
|
||||||
## Variants. ##
|
## Variants. ##
|
||||||
@@ -336,7 +371,7 @@ list:
|
|||||||
|
|
||||||
item:
|
item:
|
||||||
TEXT { $$ = $][1; }
|
TEXT { $$ = $][1; }
|
||||||
| NUMBER { if ($][1 == 3) YYERROR; else $$ = to_string ($][1); }
|
| NUMBER { int v = $][1; if (v == 3) YYERROR; else $$ = to_string (v); }
|
||||||
;
|
;
|
||||||
%%
|
%%
|
||||||
]AT_TOKEN_CTOR_IF([],
|
]AT_TOKEN_CTOR_IF([],
|
||||||
|
|||||||
Reference in New Issue
Block a user