From 79e79be29841a9f9a7360ea53b2ad384b082cc71 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sat, 12 Jan 2019 19:44:36 +0100 Subject: [PATCH] diagnostics: improve accuracy for deprecated %define variables * src/parse-gram.y: Use the location of the whole definition to record the location of a %define variable, instead of just the name of the variable. Adjust tests. --- src/parse-gram.c | 6 +- src/parse-gram.h | 2 +- src/parse-gram.y | 2 +- tests/input.at | 172 ++++++++++++++++++++++++----------------------- tests/push.at | 2 +- tests/types.at | 4 +- 6 files changed, 95 insertions(+), 93 deletions(-) diff --git a/src/parse-gram.c b/src/parse-gram.c index bedbc110..4b3ba4f7 100644 --- a/src/parse-gram.c +++ b/src/parse-gram.c @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.2.90. */ +/* A Bison parser, made by GNU Bison 3.2.90.11-ccb3-dirty. */ /* Bison implementation for Yacc-like parsers in C @@ -48,7 +48,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.2.90" +#define YYBISON_VERSION "3.2.90.11-ccb3-dirty" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -2292,7 +2292,7 @@ yyreduce: case 8: #line 293 "src/parse-gram.y" /* yacc.c:1649 */ { - muscle_percent_define_insert ((yyvsp[-1].variable), (yylsp[-1]), (yyvsp[0].value).kind, (yyvsp[0].value).chars, + muscle_percent_define_insert ((yyvsp[-1].variable), (yyloc), (yyvsp[0].value).kind, (yyvsp[0].value).chars, MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE); } #line 2299 "src/parse-gram.c" /* yacc.c:1649 */ diff --git a/src/parse-gram.h b/src/parse-gram.h index 3e22a0ec..31746018 100644 --- a/src/parse-gram.h +++ b/src/parse-gram.h @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.2.90. */ +/* A Bison parser, made by GNU Bison 3.2.90.11-ccb3-dirty. */ /* Bison interface for Yacc-like parsers in C diff --git a/src/parse-gram.y b/src/parse-gram.y index fe0afce7..85597421 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -291,7 +291,7 @@ prologue_declaration: } | "%define" variable value { - muscle_percent_define_insert ($2, @2, $3.kind, $3.chars, + muscle_percent_define_insert ($2, @$, $3.kind, $3.chars, MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE); } | "%defines" { defines_flag = true; } diff --git a/tests/input.at b/tests/input.at index d5eec578..522eda54 100644 --- a/tests/input.at +++ b/tests/input.at @@ -1740,10 +1740,10 @@ start: %empty; ]]) AT_BISON_CHECK([[input-redefined.y]], [[1]], [], -[[input-redefined.y:2.9-11: error: %define variable 'var' redefined -input-redefined.y:1.9-11: previous definition -input-redefined.y:3.10-12: error: %define variable 'var' redefined -input-redefined.y:2.9-11: previous definition +[[input-redefined.y:2.1-20: error: %define variable 'var' redefined +input-redefined.y:1.1-20: previous definition +input-redefined.y:3.2-21: error: %define variable 'var' redefined +input-redefined.y:2.1-20: previous definition ]]) AT_DATA([input-unused.y], @@ -1753,7 +1753,7 @@ start: %empty; ]]) AT_BISON_CHECK([[input-unused.y]], [[1]], [], -[[input-unused.y:1.9-11: error: %define variable 'var' is not used +[[input-unused.y:1.1-19: error: %define variable 'var' is not used ]]) AT_CLEANUP @@ -1797,7 +1797,7 @@ AT_DATA([[input-dg.y]], start: %empty; ]]) AT_BISON_CHECK([[-Dvar=cmd-d input-dg.y]], [[1]], [], -[[input-dg.y:1.9-11: error: %define variable 'var' redefined +[[input-dg.y:1.1-18: error: %define variable 'var' redefined :2: previous definition ]]) @@ -1807,9 +1807,9 @@ AT_DATA([[input-dg.y]], start: %empty; ]]) AT_BISON_CHECK([[-fcaret -Dvar=cmd-d input-dg.y]], [[1]], [], -[[input-dg.y:1.9-11: error: %define variable 'var' redefined +[[input-dg.y:1.1-18: error: %define variable 'var' redefined %define var "gram" - ^~~ + ^~~~~~~~~~~~~~~~~~ :3: previous definition ]]) @@ -1840,7 +1840,7 @@ start: %empty; ]]) AT_BISON_CHECK([[Input.y]], [1], [], -[[Input.y:3.9-25: error: invalid value for %define Boolean variable 'api.parser.public' +[[Input.y:3.1-33: error: invalid value for %define Boolean variable 'api.parser.public' ]]) AT_CLEANUP @@ -1865,15 +1865,15 @@ start: TOK; ]]) AT_BISON_CHECK([[input.yy]], [0], [], -[[input.yy:2.9-25: warning: %define variable 'api.location.type' requires '{...}' values [-Wdeprecated] -input.yy:4.9-18: warning: %define variable 'api.prefix' requires '{...}' values [-Wdeprecated] -input.yy:5.9-24: warning: %define variable 'api.token.prefix' requires '{...}' values [-Wdeprecated] -input.yy:3.9-21: warning: %define variable 'api.namespace' requires '{...}' values [-Wdeprecated] +[[input.yy:2.$3: warning: %define variable 'api.location.type' requires '{...}' values [-Wdeprecated] +input.yy:4.$3: warning: %define variable 'api.prefix' requires '{...}' values [-Wdeprecated] +input.yy:5.$3: warning: %define variable 'api.token.prefix' requires '{...}' values [-Wdeprecated] +input.yy:3.$3: warning: %define variable 'api.namespace' requires '{...}' values [-Wdeprecated] ]]) ]) -AT_TEST([], []) -AT_TEST(["], ["]) +AT_TEST([], [], [1-30]) +AT_TEST(["], ["], [1-32]) m4_popdef([AT_TEST]) AT_CLEANUP @@ -1897,11 +1897,11 @@ exp: %empty ]]) AT_BISON_CHECK([[input.y]], [0], [], -[[input.y:5.9-15: warning: %define variable 'lr.type' requires keyword values [-Wdeprecated] -input.y:3.9-28: warning: %define variable 'lr.default-reduction' requires keyword values [-Wdeprecated] -input.y:4.9-33: warning: %define variable 'lr.keep-unreachable-state' requires keyword values [-Wdeprecated] -input.y:2.9-21: warning: %define variable 'api.push-pull' requires keyword values [-Wdeprecated] -input.y:1.9-16: warning: %define variable 'api.pure' requires keyword values [-Wdeprecated] +[[input.y:5.1-40: warning: %define variable 'lr.type' requires keyword values [-Wdeprecated] +input.y:3.1-40: warning: %define variable 'lr.default-reduction' requires keyword values [-Wdeprecated] +input.y:4.1-40: warning: %define variable 'lr.keep-unreachable-state' requires keyword values [-Wdeprecated] +input.y:2.1-40: warning: %define variable 'api.push-pull' requires keyword values [-Wdeprecated] +input.y:1.1-38: warning: %define variable 'api.pure' requires keyword values [-Wdeprecated] ]]) ]) @@ -1929,12 +1929,12 @@ AT_DATA([[input.y]], start: %empty; ]]) AT_BISON_CHECK([[-fcaret input.y]], [[1]], [[]], -[[input.y:1.9-28: error: invalid value for %define variable 'lr.default-reduction': 'bogus' +[[input.y:1.1-34: error: invalid value for %define variable 'lr.default-reduction': 'bogus' %define lr.default-reduction bogus - ^~~~~~~~~~~~~~~~~~~~ -input.y:1.9-28: accepted value: 'most' -input.y:1.9-28: accepted value: 'consistent' -input.y:1.9-28: accepted value: 'accepting' + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +input.y:1.1-34: accepted value: 'most' +input.y:1.1-34: accepted value: 'consistent' +input.y:1.1-34: accepted value: 'accepting' ]]) # Back-end. @@ -1944,12 +1944,12 @@ AT_DATA([[input.y]], start: %empty; ]]) AT_BISON_CHECK([[-fcaret input.y]], [[1]], [[]], -[[input.y:1.9-21: error: invalid value for %define variable 'api.push-pull': 'neither' +[[input.y:1.1-29: error: invalid value for %define variable 'api.push-pull': 'neither' %define api.push-pull neither - ^~~~~~~~~~~~~ -input.y:1.9-21: accepted value: 'pull' -input.y:1.9-21: accepted value: 'push' -input.y:1.9-21: accepted value: 'both' + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +input.y:1.1-29: accepted value: 'pull' +input.y:1.1-29: accepted value: 'push' +input.y:1.1-29: accepted value: 'both' ]]) AT_CLEANUP @@ -1970,9 +1970,9 @@ AT_DATA([[input.y]], start: %empty; ]]) AT_BISON_CHECK([[-fcaret input.y]], [[1]], [[]], -[[input.y:3.9-25: error: %define variable 'api.location.file' requires 'none' or '"..."' values +[[input.y:3.1-33: error: %define variable 'api.location.file' requires 'none' or '"..."' values %define api.location.file {bogus} - ^~~~~~~~~~~~~~~~~ + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]) AT_CLEANUP @@ -1996,27 +1996,27 @@ AT_DATA([[input.y]], start: %empty; ]]) AT_BISON_CHECK([[-fcaret input.y]], [1], [], -[[input.y:1.9-21: warning: deprecated directive, use '%define api.push-pull both' [-Wdeprecated] +[[input.y:1.1-26: warning: deprecated directive, use '%define api.push-pull both' [-Wdeprecated] %define api.push_pull both - ^~~~~~~~~~~~~ -input.y:2.9-34: warning: deprecated directive, use '%define lr.keep-unreachable-state maybe' [-Wdeprecated] + ^~~~~~~~~~~~~~~~~~~~~~~~~~ +input.y:2.1-40: warning: deprecated directive, use '%define lr.keep-unreachable-state maybe' [-Wdeprecated] %define lr.keep_unreachable_states maybe - ^~~~~~~~~~~~~~~~~~~~~~~~~~ -input.y:3.9-17: warning: deprecated directive, use '%define api.namespace {foo}' [-Wdeprecated] + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +input.y:3.1-23: warning: deprecated directive, use '%define api.namespace {foo}' [-Wdeprecated] %define namespace "foo" - ^~~~~~~~~ -input.y:4.9-21: error: %define variable 'api.namespace' redefined + ^~~~~~~~~~~~~~~~~~~~~~~ +input.y:4.1-27: error: %define variable 'api.namespace' redefined %define api.namespace {foo} - ^~~~~~~~~~~~~ -input.y:3.9-17: previous definition + ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +input.y:3.1-23: previous definition %define namespace "foo" - ^~~~~~~~~ -input.y:5.9-15: warning: deprecated directive, use '%define api.value.type variant' [-Wdeprecated] + ^~~~~~~~~~~~~~~~~~~~~~~ +input.y:5.1-15: warning: deprecated directive, use '%define api.value.type variant' [-Wdeprecated] %define variant - ^~~~~~~ -input.y:6.9-25: warning: deprecated directive, use '%define api.parser.class {parser}' [-Wdeprecated] + ^~~~~~~~~~~~~~~ +input.y:6.1-34: warning: deprecated directive, use '%define api.parser.class {parser}' [-Wdeprecated] %define parser_class_name {parser} - ^~~~~~~~~~~~~~~~~ + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]) AT_CLEANUP @@ -2028,11 +2028,11 @@ AT_CLEANUP AT_SETUP([[Unused %define api.pure]]) -# AT_CHECK_API_PURE(DECLS, VALUE) +# AT_TEST(DECLS, VALUE, LOCATION) # ------------------------------- # Make sure Bison reports that '%define api.pure VALUE' is unused when DECLS # are specified. -m4_define([AT_CHECK_API_PURE], +m4_pushdef([AT_TEST], [ AT_DATA([[input.y]], [[%define api.pure ]$2[ @@ -2042,16 +2042,18 @@ start: %empty; ]]) AT_BISON_CHECK([[input.y]], [[1]], [], -[[input.y:1.9-16: error: %define variable 'api.pure' is not used +[[input.y:]$3[: error: %define variable 'api.pure' is not used ]]) ]) -AT_CHECK_API_PURE([[%language "c++"]], [[]]) -AT_CHECK_API_PURE([[%language "c++"]], [[false]]) -AT_CHECK_API_PURE([[%language "c++" %glr-parser]], [[""]]) -AT_CHECK_API_PURE([[%language "c++" %glr-parser]], [[false]]) -AT_CHECK_API_PURE([[%language "java"]], [[true]]) -AT_CHECK_API_PURE([[%language "java"]], [[false]]) +AT_TEST([[%language "c++"]], [[]], [[1.1-16]]) +AT_TEST([[%language "c++"]], [[false]], [[1.1-22]]) +AT_TEST([[%language "c++" %glr-parser]], [[""]], [[1.1-19]]) +AT_TEST([[%language "c++" %glr-parser]], [[false]], [[1.1-22]]) +AT_TEST([[%language "java"]], [[true]], [[1.1-21]]) +AT_TEST([[%language "java"]], [[false]], [[1.1-22]]) + +m4_popdef([AT_TEST]) AT_CLEANUP @@ -2077,31 +2079,31 @@ start: %empty; AT_BISON_CHECK([[input.y]], [1], [], [m4_foreach([b4_arg], m4_dquote(m4_shift($@)), -[[input.y:3.9-21: error: ]b4_arg[ -]])]) +[b4_arg +])]) ]) AT_CHECK_NAMESPACE_ERROR([[]], - [[namespace reference is empty]]) + [[input.y:3.1-24: error: namespace reference is empty]]) AT_CHECK_NAMESPACE_ERROR([[ @tb@@tb@ @tb@ @tb@]], - [[namespace reference is empty]]) + [[input.y:3.1-57: error: namespace reference is empty]]) AT_CHECK_NAMESPACE_ERROR([[foo::::bar]], - [[namespace reference has consecutive "::"]]) + [[input.y:3.1-34: error: namespace reference has consecutive "::"]]) AT_CHECK_NAMESPACE_ERROR([[foo:: @tb@::bar]], - [[namespace reference has consecutive "::"]]) + [[input.y:3.1-38: error: namespace reference has consecutive "::"]]) AT_CHECK_NAMESPACE_ERROR([[::::bar]], - [[namespace reference has consecutive "::"]]) + [[input.y:3.1-31: error: namespace reference has consecutive "::"]]) AT_CHECK_NAMESPACE_ERROR([[:: ::bar]], - [[namespace reference has consecutive "::"]]) + [[input.y:3.1-32: error: namespace reference has consecutive "::"]]) AT_CHECK_NAMESPACE_ERROR([[foo::bar::@tb@::]], - [[namespace reference has consecutive "::"]], - [[namespace reference has a trailing "::"]]) + [[input.y:3.1-43: error: namespace reference has consecutive "::"]], + [[input.y:3.1-43: error: namespace reference has a trailing "::"]]) AT_CHECK_NAMESPACE_ERROR([[foo::bar::]], - [[namespace reference has a trailing "::"]]) + [[input.y:3.1-34: error: namespace reference has a trailing "::"]]) AT_CHECK_NAMESPACE_ERROR([[foo::bar:: @tb@]], - [[namespace reference has a trailing "::"]]) + [[input.y:3.1-41: error: namespace reference has a trailing "::"]]) AT_CHECK_NAMESPACE_ERROR([[::]], - [[namespace reference has a trailing "::"]]) + [[input.y:3.1-26: error: namespace reference has a trailing "::"]]) AT_CLEANUP @@ -2315,10 +2317,10 @@ AT_BISON_CHECK([[$2 -Wno-deprecated input.y]], [[1]], [[]], ]]) ]) -AT_TEST([%define api.prefix {foo} %name-prefix "bar"], [], [input.y:1.9-18]) -AT_TEST([], [-Dapi.prefix={foo} -p bar], [:2]) -AT_TEST([%name-prefix "bar"], [-Dapi.prefix={foo}], [:2]) -AT_TEST([%define api.prefix {foo}], [-p bar], [input.y:1.9-18]) +AT_TEST([%define api.prefix {foo} %name-prefix "bar"], [], [input.y:1.1-24]) +AT_TEST([], [-Dapi.prefix={foo} -p bar], [:2]) +AT_TEST([%name-prefix "bar"], [-Dapi.prefix={foo}], [:2]) +AT_TEST([%define api.prefix {foo}], [-p bar], [input.y:1.1-24]) m4_popdef([AT_TEST]) @@ -2350,18 +2352,18 @@ AT_TEST([[%union foo {}; %define api.value.union.name foo]], [[input.y:3.8-10: error: %define variable 'api.value.union.name' redefined input.y:1.8-10: previous definition -input.y:4.9-28: error: %define variable 'api.value.union.name' redefined +input.y:4.1-32: error: %define variable 'api.value.union.name' redefined input.y:3.8-10: previous definition ]]) AT_TEST([[%define api.value.union.name {foo}]], -[[input.y:1.9-28: error: %define variable 'api.value.union.name' requires keyword values -input.y:1.9-28: error: %define variable 'api.value.union.name' is not used +[[input.y:1.1-34: error: %define variable 'api.value.union.name' requires keyword values +input.y:1.1-34: error: %define variable 'api.value.union.name' is not used ]]) AT_TEST([[%define api.value.union.name "foo"]], -[[input.y:1.9-28: error: %define variable 'api.value.union.name' requires keyword values -input.y:1.9-28: error: %define variable 'api.value.union.name' is not used +[[input.y:1.1-34: error: %define variable 'api.value.union.name' requires keyword values +input.y:1.1-34: error: %define variable 'api.value.union.name' is not used ]]) m4_popdef([AT_TEST]) @@ -2522,8 +2524,8 @@ input.y:24.1-9: warning: deprecated directive: '%output =', use '%output' [-Wdep input.y:25.1-12: warning: deprecated directive: '%pure_parser', use '%pure-parser' [-Wdeprecated] input.y:26.1-12: warning: deprecated directive: '%token_table', use '%token-table' [-Wdeprecated] input.y:27.1-14: warning: deprecated directive: '%error-verbose', use '%define parse.error verbose' [-Wdeprecated] -input.y:27-6: error: %define variable 'parse.error' redefined -input.y:11-6: previous definition +input.y:27-14: error: %define variable 'parse.error' redefined +input.y:11-14: previous definition input.y:29.1-18: warning: deprecated directive: '%name-prefix "bar"', use '%define api.prefix {bar}' [-Wdeprecated] ]]) @@ -2558,8 +2560,8 @@ input.y:26.1-12: warning: deprecated directive: '%token_table', use '%token-tabl fix-it:"input.y":{26:1-26:13}:"%token-table" input.y:27.1-14: warning: deprecated directive: '%error-verbose', use '%define parse.error verbose' [-Wdeprecated] fix-it:"input.y":{27:1-27:15}:"%define parse.error verbose" -input.y:27-6: error: %define variable 'parse.error' redefined -input.y:11-6: previous definition +input.y:27-14: error: %define variable 'parse.error' redefined +input.y:11-14: previous definition 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}" ]]) @@ -2596,11 +2598,11 @@ input.y:11.15-24: warning: deprecated directive: '%expect_rr', use '%expect-rr' input.y:12.15-24: warning: deprecated directive: '%expect_rr', use '%expect-rr' [-Wdeprecated] input.y:13.1-14: warning: deprecated directive: '%error_verbose', use '%define parse.error verbose' [-Wdeprecated] input.y:13.16-29: warning: deprecated directive: '%error_verbose', use '%define parse.error verbose' [-Wdeprecated] -input.y:13.11-21: error: %define variable 'parse.error' redefined -input.y:13-6: previous definition +input.y:13.3-29: error: %define variable 'parse.error' redefined +input.y:13-14: previous definition input.y:14.16-29: warning: deprecated directive: '%error_verbose', use '%define parse.error verbose' [-Wdeprecated] -input.y:14.11-21: error: %define variable 'parse.error' redefined -input.y:13.11-21: previous definition +input.y:14.3-29: error: %define variable 'parse.error' redefined +input.y:13.3-29: previous definition ]]) AT_CLEANUP diff --git a/tests/push.at b/tests/push.at index a46c255e..72766084 100644 --- a/tests/push.at +++ b/tests/push.at @@ -154,7 +154,7 @@ start: ; AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([[input.y]], [[1]], [], -[[input.y:2.9-21: error: %define variable 'api.push-pull' is not used +[[input.y:2.1-26: error: %define variable 'api.push-pull' is not used ]]) AT_CLEANUP diff --git a/tests/types.at b/tests/types.at index 8fff4291..2794838a 100644 --- a/tests/types.at +++ b/tests/types.at @@ -32,7 +32,7 @@ exp: %empty; ]]) AT_BISON_CHECK([[input.y]], [[1]], [[]], -[[input.y:2.9-22: error: '%union' and '%define api.value.type' cannot be used together +[[input.y:2.1-38: error: '%union' and '%define api.value.type' cannot be used together ]]) AT_CLEANUP @@ -51,7 +51,7 @@ exp: %empty; ]]) AT_BISON_CHECK([[input.y]], [[1]], [[]], -[[input.y:2.9-22: error: '%yacc' and '%define api.value.type "union"' cannot be used together +[[input.y:2.1-28: error: '%yacc' and '%define api.value.type "union"' cannot be used together ]]) AT_CLEANUP