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