[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- fixits: handle duplicates of %name-prefix,
Akim Demaille <=