From 92822affc53ea6df5caad9693daf347bfdf87723 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Fri, 3 Apr 2009 03:13:36 -0400 Subject: [PATCH] Fix strange %define locations for default values. Reported by Akim Demaille at and discussed again starting at . * data/bison.m4 (b4_percent_define_default): Leave syncline blank because location information is bogus. Use angle brackets to delimit fake file name because square brackets look like over-quoted m4. Choose a better fake file name. Use negative line numbers. * src/muscle_tab.c (muscle_percent_define_default): Likewise. * src/location.c (location_print): If line for a boundary is negative, only print that boundary's file name. * src/location.h: Document that. * tests/skeletons.at (%define Boolean variables: invalid skeleton defaults): Update output. --- ChangeLog | 19 +++++++++++++++++++ data/bison.m4 | 7 +++---- src/location.c | 47 +++++++++++++++++++++++++++++++--------------- src/location.h | 10 +++++++--- src/muscle_tab.c | 11 +++++------ tests/skeletons.at | 4 ++-- 6 files changed, 68 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index d838b483..66cdcb6a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2009-04-03 Joel E. Denny + + Fix strange %define locations for default values. + Reported by Akim Demaille at + + and discussed again starting at + . + * data/bison.m4 (b4_percent_define_default): Leave syncline blank + because location information is bogus. + Use angle brackets to delimit fake file name because square brackets + look like underexpanded m4. Choose a better fake file name. + Use negative line numbers. + * src/muscle_tab.c (muscle_percent_define_default): Likewise. + * src/location.c (location_print): If line for a boundary is negative, + only print that boundary's file name. + * src/location.h: Document that. + * tests/skeletons.at (%define Boolean variables: invalid skeleton + defaults): Update output. + 2009-04-03 Joel E. Denny Pacify ./configure --enable-gcc-warnings. diff --git a/data/bison.m4 b/data/bison.m4 index 67020033..1c35ccda 100644 --- a/data/bison.m4 +++ b/data/bison.m4 @@ -680,10 +680,9 @@ m4_define([b4_percent_define_default], [m4_ifndef([b4_percent_define(]$1[)], [m4_define([b4_percent_define(]$1[)], [$2])dnl m4_define([b4_percent_define_loc(]$1[)], - [[[[[Bison:b4_percent_define_default]:1.0]], [[[Bison:b4_percent_define_default]:1.0]]]])dnl - m4_define([b4_percent_define_syncline(]$1[)], - [[]b4_syncline(1, [["[Bison:b4_percent_define_default]"]])[ -]])])]) + [[[[:-1.-1]], + [[:-1.-1]]]])dnl + m4_define([b4_percent_define_syncline(]$1[)], [[]])])]) # b4_percent_define_check_values(VALUES) # -------------------------------------- diff --git a/src/location.c b/src/location.c index 98627a55..4cbfd8db 100644 --- a/src/location.c +++ b/src/location.c @@ -1,5 +1,6 @@ /* Locations for Bison - Copyright (C) 2002, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2002, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, + Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -100,21 +101,37 @@ location_compute (location *loc, boundary *cur, char const *token, size_t size) void location_print (FILE *out, location loc) { - int end_col = 0 < loc.end.column ? loc.end.column - 1 : 0; - fprintf (out, "%s:%d", - quotearg_n_style (3, escape_quoting_style, loc.start.file), - loc.start.line); - if (0 <= loc.start.column) - fprintf (out, ".%d", loc.start.column); - + int end_col = 0 != loc.end.column ? loc.end.column - 1 : 0; + fprintf (out, "%s", + quotearg_n_style (3, escape_quoting_style, loc.start.file)); + if (0 <= loc.start.line) + { + fprintf(out, ":%d", loc.start.line); + if (0 <= loc.start.column) + fprintf (out, ".%d", loc.start.column); + } if (loc.start.file != loc.end.file) - fprintf (out, "-%s:%d.%d", - quotearg_n_style (3, escape_quoting_style, loc.end.file), - loc.end.line, end_col); - else if (loc.start.line < loc.end.line) - fprintf (out, "-%d.%d", loc.end.line, end_col); - else if (0 <= loc.start.column && loc.start.column < end_col) - fprintf (out, "-%d", end_col); + { + fprintf (out, "-%s", + quotearg_n_style (3, escape_quoting_style, loc.end.file)); + if (0 <= loc.end.line) + { + fprintf(out, ":%d", loc.end.line); + if (0 <= end_col) + fprintf (out, ".%d", end_col); + } + } + else if (0 <= loc.end.line) + { + if (loc.start.line < loc.end.line) + { + fprintf (out, "-%d", loc.end.line); + if (0 <= end_col) + fprintf (out, ".%d", end_col); + } + else if (0 <= end_col && loc.start.column < end_col) + fprintf (out, "-%d", end_col); + } } void diff --git a/src/location.h b/src/location.h index efd256dd..a99232bd 100644 --- a/src/location.h +++ b/src/location.h @@ -1,5 +1,6 @@ /* Locations for Bison - Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software + Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -27,8 +28,11 @@ typedef struct /* The name of the file that contains the boundary. */ uniqstr file; - /* The (origin-1) line that contains the boundary. - If this is INT_MAX, the line number has overflowed. */ + /* If nonnegative, the (origin-1) line that contains the boundary. + If this is INT_MAX, the line number has overflowed. + + Meaningless and not displayed if negative. + */ int line; /* If nonnegative, the (origin-1) column just after the boundary. diff --git a/src/muscle_tab.c b/src/muscle_tab.c index fe6affb6..0265e45a 100644 --- a/src/muscle_tab.c +++ b/src/muscle_tab.c @@ -1,7 +1,7 @@ /* Muscle table manager for Bison. - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software - Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free + Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -539,13 +539,12 @@ muscle_percent_define_default (char const *variable, char const *value) { location loc; MUSCLE_INSERT_STRING (name, value); - loc.start.file = loc.end.file = "[Bison:muscle_percent_define_default]"; - loc.start.line = loc.end.line = 1; - loc.start.column = loc.end.column = 0; + loc.start.file = loc.end.file = ""; + loc.start.line = loc.end.line = -1; + loc.start.column = loc.end.column = -1; muscle_insert (loc_name, ""); muscle_location_grow (loc_name, loc); muscle_insert (syncline_name, ""); - muscle_syncline_grow (syncline_name, loc); } } diff --git a/tests/skeletons.at b/tests/skeletons.at index 3845d3dd..60fc1176 100644 --- a/tests/skeletons.at +++ b/tests/skeletons.at @@ -1,5 +1,5 @@ # Checking skeleton support. -*- Autotest -*- -# Copyright (C) 2007 Free Software Foundation, Inc. +# Copyright (C) 2007, 2009 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -159,7 +159,7 @@ start: ; ]]) AT_BISON_CHECK([[input.y]], [[1]], [[]], -[[[Bison:b4_percent_define_default]:1.0: invalid value for %define Boolean variable `foo' +[[: invalid value for %define Boolean variable `foo' ]]) AT_CLEANUP -- 2.45.2