bison-patches
[Top][All Lists]
Advanced

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

fixits: handle duplicates of %name-prefix


From: Akim Demaille
Subject: fixits: handle duplicates of %name-prefix
Date: Thu, 17 Jan 2019 18:12:14 +0100

commit eb0f3e79e04b92ed2fa9dd32b0fe57bcd009b2cf
Author: Akim Demaille <address@hidden>
Date:   Thu Jan 17 08:49:34 2019 +0100

    fixits: handle duplicates of %name-prefix
    
    The test case "Deprecated directives" (currently 56) no longer emits
    warnings after 'bison -u'!
    
    * src/files.h, src/files.c (spec_name_prefix_loc): New.
    * src/parse-gram.y (handle_name_prefix): Emit fixits for duplicate
    %name-prefix.
    * tests/input.at (Deprecated directives): Adjust.

diff --git a/src/files.c b/src/files.c
index 759b81ea..d474227f 100644
--- a/src/files.c
+++ b/src/files.c
@@ -45,6 +45,7 @@ char const *spec_outfile = NULL;       /* for -o. */
 char const *spec_file_prefix = NULL;   /* for -b. */
 location spec_file_prefix_loc = EMPTY_LOCATION_INIT;
 char const *spec_name_prefix = NULL;   /* for -p. */
+location spec_name_prefix_loc = EMPTY_LOCATION_INIT;;
 char *spec_verbose_file = NULL;  /* for --verbose. */
 char *spec_graph_file = NULL;    /* for -g. */
 char *spec_xml_file = NULL;      /* for -x. */
diff --git a/src/files.h b/src/files.h
index 14f524c6..d5ee44c2 100644
--- a/src/files.h
+++ b/src/files.h
@@ -32,6 +32,7 @@ extern char *parser_file_name;
 
 /* Symbol prefix specified with -p, or 0 if no -p.  */
 extern const char *spec_name_prefix;
+extern location spec_name_prefix_loc;
 
 /* File name prefix specified with -b, or 0 if no -b.  */
 extern char const *spec_file_prefix;
diff --git a/src/parse-gram.c b/src/parse-gram.c
index 60068dd5..fb5add9c 100644
--- a/src/parse-gram.c
+++ b/src/parse-gram.c
@@ -3410,24 +3410,33 @@ static void
 handle_name_prefix (location const *loc,
                     char const *directive, char const *value)
 {
-  spec_name_prefix = value;
+  bison_directive (loc, directive);
 
   char buf1[1024];
   size_t len1 = sizeof (buf1);
   char *old = asnprintf (buf1, &len1, "%s\"%s\"", directive, value);
   if (!old)
     xalloc_die ();
-  char buf2[1024];
-  size_t len2 = sizeof (buf2);
-  char *new = asnprintf (buf2, &len2, "%%define api.prefix {%s}", value);
-  if (!new)
-    xalloc_die ();
-  bison_directive (loc, old);
-  deprecated_directive (loc, old, new);
+
+  if (location_empty (spec_name_prefix_loc))
+    {
+      spec_name_prefix = value;
+      spec_name_prefix_loc = *loc;
+
+      char buf2[1024];
+      size_t len2 = sizeof (buf2);
+      char *new = asnprintf (buf2, &len2, "%%define api.prefix {%s}", value);
+      if (!new)
+        xalloc_die ();
+      deprecated_directive (loc, old, new);
+      if (new != buf2)
+        free (new);
+    }
+  else
+    duplicate_directive (old, spec_file_prefix_loc, *loc);
+
   if (old != buf1)
     free (old);
-  if (new != buf2)
-    free (new);
 }
 
 
diff --git a/src/parse-gram.y b/src/parse-gram.y
index 872be4d4..3d0b99bc 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -905,24 +905,33 @@ static void
 handle_name_prefix (location const *loc,
                     char const *directive, char const *value)
 {
-  spec_name_prefix = value;
+  bison_directive (loc, directive);
 
   char buf1[1024];
   size_t len1 = sizeof (buf1);
   char *old = asnprintf (buf1, &len1, "%s\"%s\"", directive, value);
   if (!old)
     xalloc_die ();
-  char buf2[1024];
-  size_t len2 = sizeof (buf2);
-  char *new = asnprintf (buf2, &len2, "%%define api.prefix {%s}", value);
-  if (!new)
-    xalloc_die ();
-  bison_directive (loc, old);
-  deprecated_directive (loc, old, new);
+
+  if (location_empty (spec_name_prefix_loc))
+    {
+      spec_name_prefix = value;
+      spec_name_prefix_loc = *loc;
+
+      char buf2[1024];
+      size_t len2 = sizeof (buf2);
+      char *new = asnprintf (buf2, &len2, "%%define api.prefix {%s}", value);
+      if (!new)
+        xalloc_die ();
+      deprecated_directive (loc, old, new);
+      if (new != buf2)
+        free (new);
+    }
+  else
+    duplicate_directive (old, spec_file_prefix_loc, *loc);
+
   if (old != buf1)
     free (old);
-  if (new != buf2)
-    free (new);
 }
 
 
diff --git a/tests/input.at b/tests/input.at
index 3bd2be65..bce75b97 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -2550,8 +2550,9 @@ fix-it:"input.y":{26:1-26:13}:"%token-table"
 input.y:27.1-14: error: %define variable 'parse.error' redefined
 input.y:11.1-14:     previous definition
 fix-it:"input.y":{27:1-27:15}:""
-input.y:29.1-18: warning: deprecated directive: '%name-prefix "bar"', use 
'%define api.prefix {bar}' [-Wdeprecated]
-fix-it:"input.y":{29:1-29:19}:"%define api.prefix {bar}"
+input.y:29.1-18: warning: duplicate directive: '%name-prefix "bar"' [-Wother]
+input.y:13.1-20:     previous declaration [-Wother]
+fix-it:"input.y":{29:1-29:19}:""
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. 
[-Wother]
 ]])
 
@@ -2594,20 +2595,11 @@ AT_CHECK([cat input.y], [],
 %pure-parser
 %token-table
 %glr-parser
-%define api.prefix {bar}
 %%
 exp : '0'
 ]])
 
-AT_BISON_CHECK([[-fcaret input.y]], [[1]], [],
-[[input.y:23.1-24: error: %define variable 'api.prefix' redefined
- %define api.prefix {bar}
- ^~~~~~~~~~~~~~~~~~~~~~~~
-input.y:15.1-24:     previous definition
- %define api.prefix {foo}
- ^~~~~~~~~~~~~~~~~~~~~~~~
-input.y: warning: fix-its can be applied.  Rerun with option '--update'. 
[-Wother]
-]])
+AT_BISON_CHECK([[input.y]])
 
 AT_CLEANUP
 




reply via email to

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