bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RFC: c++: issue a warning with a value is moved several times


From: Akim Demaille
Subject: RFC: c++: issue a warning with a value is moved several times
Date: Fri, 21 Sep 2018 06:34:38 +0200

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 <address@hidden>
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.  ##




reply via email to

[Prev in Thread] Current Thread [Next in Thread]