I’m not sure about how the error message should be displayed. At least, I think I should remove ‘enabled’.
commit d23d8112aecba8786489dc4fef0233f998d7580a Author: Akim Demaille <[email protected]> Date: Thu Sep 20 22:09:25 2018 +0200 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. diff --git a/src/scan-code.l b/src/scan-code.l index c9cef326..918075e3 100644 --- a/src/scan-code.l +++ b/src/scan-code.l @@ -439,26 +439,22 @@ parse_ref (char *cp, symbol_list *rule, int rule_length, if ('[' == *cp) { /* Ignore the brackets. */ - char *p; - for (p = ++cp; *p != ']'; ++p) + for (cp_end = ++cp; *cp_end != ']'; ++cp_end) continue; - cp_end = p; explicit_bracketing = true; } else { /* Take all characters of the name. */ - char* p; - for (p = cp; *p; ++p) + for (char* p = cp; *p; ++p) if (is_dot_or_dash (*p)) { ref_tail_fields = p; break; } - for (p = cp; *p; ++p) + for (cp_end = cp; *cp_end; ++cp_end) continue; - cp_end = p; 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_sgrow (&obstack_for_string, ")["); 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_flag_if ("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; } } diff --git a/tests/c++.at b/tests/c++.at index 6fec6073..22e209ce 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -190,6 +190,41 @@ AT_PARSER_CHECK([./list], 0, [], AT_BISON_OPTION_POPDEFS 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. ##
