From 196440f844be32600507b6a026bca318675d5cd0 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Tue, 23 Feb 2016 17:44:28 +0000 Subject: [PATCH] PR preprocessor/69126: avoid comparing ad-hoc and non-ad-hoc locations gcc/testsuite/ChangeLog: PR preprocessor/69126 PR preprocessor/69543 * c-c++-common/pr69126-2-long.c: New test. * c-c++-common/pr69126-2-short.c: New test. * c-c++-common/pr69543-1.c: Remove xfail. libcpp/ChangeLog: PR preprocessor/69126 PR preprocessor/69543 * line-map.c (linemap_compare_locations): At the function top, replace inlined bodies of get_location_from_adhoc_loc with calls to get_location_from_adhoc_loc. Add a pair of calls to get_location_from_adhoc_loc at the bottom of the function, to avoid meaningless comparisons of ad-hoc and non-ad-hoc locations. From-SVN: r233638 --- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/c-c++-common/pr69126-2-long.c | 11 +++++++++++ gcc/testsuite/c-c++-common/pr69126-2-short.c | 11 +++++++++++ gcc/testsuite/c-c++-common/pr69543-1.c | 4 +--- libcpp/ChangeLog | 10 ++++++++++ libcpp/line-map.c | 9 +++++++-- 6 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr69126-2-long.c create mode 100644 gcc/testsuite/c-c++-common/pr69126-2-short.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 96007ce32175..d6aa9fa82d2f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-02-23 David Malcolm + + PR preprocessor/69126 + PR preprocessor/69543 + * c-c++-common/pr69126-2-long.c: New test. + * c-c++-common/pr69126-2-short.c: New test. + * c-c++-common/pr69543-1.c: Remove xfail. + 2016-02-23 David Malcolm PR preprocessor/69126 diff --git a/gcc/testsuite/c-c++-common/pr69126-2-long.c b/gcc/testsuite/c-c++-common/pr69126-2-long.c new file mode 100644 index 000000000000..f4f1964cba18 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr69126-2-long.c @@ -0,0 +1,11 @@ +/* { dg-options "-Wdeprecated-declarations" } */ + +/* The macro's name is >= 32 characters long, and hence its location + requires an ad-hoc location. */ + +#define IGNORE_WHERE_MACRO_IS_LONGER_THAN_31_CHARS _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +__attribute__((deprecated)) void f(); +int main() { + IGNORE_WHERE_MACRO_IS_LONGER_THAN_31_CHARS + f(); +} diff --git a/gcc/testsuite/c-c++-common/pr69126-2-short.c b/gcc/testsuite/c-c++-common/pr69126-2-short.c new file mode 100644 index 000000000000..aee43e552dc5 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr69126-2-short.c @@ -0,0 +1,11 @@ +/* { dg-options "-Wdeprecated-declarations" } */ + +/* IGNORE_SHORT_MACRO is < 32 characters long, and hence its location + can be stored without needing an ad-hoc location. */ + +#define IGNORE_SHORT_MACRO _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +__attribute__((deprecated)) void f(); +int main() { + IGNORE_SHORT_MACRO + f(); +} diff --git a/gcc/testsuite/c-c++-common/pr69543-1.c b/gcc/testsuite/c-c++-common/pr69543-1.c index bfb52705d764..bbf4759368b6 100644 --- a/gcc/testsuite/c-c++-common/pr69543-1.c +++ b/gcc/testsuite/c-c++-common/pr69543-1.c @@ -3,8 +3,6 @@ /* Verify disabling a warning, where the _Pragma is within a macro, but the affected code is *not* in a macro. */ -/* TODO: XFAIL: why does g++ still emit a warning here? (works for C). */ - # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ @@ -16,6 +14,6 @@ void test (char yylval) { char *yyvsp; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; /* { dg-bogus "used uninitialized" "" { xfail { c++ } } } */ + *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END } diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index a5cef17df458..1dfcf8dbb721 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,13 @@ +2016-02-23 David Malcolm + + PR preprocessor/69126 + PR preprocessor/69543 + * line-map.c (linemap_compare_locations): At the function top, + replace inlined bodies of get_location_from_adhoc_loc with calls + to get_location_from_adhoc_loc. Add a pair of calls to + get_location_from_adhoc_loc at the bottom of the function, to + avoid meaningless comparisons of ad-hoc and non-ad-hoc locations. + 2016-02-08 David Malcolm PR preprocessor/69664 diff --git a/libcpp/line-map.c b/libcpp/line-map.c index e9175dfa3070..c05a001dcc42 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -1328,9 +1328,9 @@ linemap_compare_locations (struct line_maps *set, source_location l0 = pre, l1 = post; if (IS_ADHOC_LOC (l0)) - l0 = set->location_adhoc_data_map.data[l0 & MAX_SOURCE_LOCATION].locus; + l0 = get_location_from_adhoc_loc (set, l0); if (IS_ADHOC_LOC (l1)) - l1 = set->location_adhoc_data_map.data[l1 & MAX_SOURCE_LOCATION].locus; + l1 = get_location_from_adhoc_loc (set, l1); if (l0 == l1) return 0; @@ -1365,6 +1365,11 @@ linemap_compare_locations (struct line_maps *set, return i1 - i0; } + if (IS_ADHOC_LOC (l0)) + l0 = get_location_from_adhoc_loc (set, l0); + if (IS_ADHOC_LOC (l1)) + l1 = get_location_from_adhoc_loc (set, l1); + return l1 - l0; }