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
This commit is contained in:
David Malcolm 2016-02-23 17:44:28 +00:00 committed by David Malcolm
parent 1d3121af3a
commit 196440f844
6 changed files with 48 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2016-02-23 David Malcolm <dmalcolm@redhat.com>
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 <dmalcolm@redhat.com>
PR preprocessor/69126

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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
}

View File

@ -1,3 +1,13 @@
2016-02-23 David Malcolm <dmalcolm@redhat.com>
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 <dmalcolm@redhat.com>
PR preprocessor/69664

View File

@ -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;
}