From 738f7c2e12de922b91024717429a048b877492ee Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Fri, 7 Jul 2017 18:49:09 +0000 Subject: [PATCH] libcpp: preserve ranges within macro expansions (PR c++/79300) gcc/testsuite/ChangeLog: PR c++/79300 * g++.dg/diagnostic/pr79300.C: New test case. libcpp/ChangeLog: PR c++/79300 * line-map.c (linemap_macro_loc_to_def_point): Preserve range information for macro expansions by delaying resolving ad-hoc locations until within the loop. From-SVN: r250058 --- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/diagnostic/pr79300.C | 44 +++++++++++++++++++++++ libcpp/ChangeLog | 7 ++++ libcpp/line-map.c | 14 ++++---- 4 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/diagnostic/pr79300.C diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b2e43ef08a0..73db4a70eca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-07-07 David Malcolm + + PR c++/79300 + * g++.dg/diagnostic/pr79300.C: New test case. + 2017-07-07 Michael Meissner * gcc.target/powerpc/clone1.c: Add check to make sure the diff --git a/gcc/testsuite/g++.dg/diagnostic/pr79300.C b/gcc/testsuite/g++.dg/diagnostic/pr79300.C new file mode 100644 index 00000000000..6805e85873f --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/pr79300.C @@ -0,0 +1,44 @@ +// { dg-options "-fdiagnostics-show-caret" } + +#define TEST_1_DEPTH_0 throw bad_alloc; // { dg-line define_TEST_1_DEPTH_0 } + +void test_1 () +{ + TEST_1_DEPTH_0 // { dg-line use_TEST_1_DEPTH_0 } +} + +// { dg-error "'bad_alloc' was not declared in this scope" "" { target *-*-* } define_TEST_1_DEPTH_0 } +/* { dg-begin-multiline-output "" } + #define TEST_1_DEPTH_0 throw bad_alloc; + ^~~~~~~~~ + { dg-end-multiline-output "" } */ +// { dg-message "in expansion of macro 'TEST_1_DEPTH_0'" "" { target *-*-* } use_TEST_1_DEPTH_0 } +/* { dg-begin-multiline-output "" } + TEST_1_DEPTH_0 + ^~~~~~~~~~~~~~ + { dg-end-multiline-output "" } */ + + +#define TEST_2_DEPTH_0 throw bad_alloc; // { dg-line define_TEST_2_DEPTH_0 } +#define TEST_2_DEPTH_1 TEST_2_DEPTH_0 // { dg-line define_TEST_2_DEPTH_1 } + +void test_2 () +{ + TEST_2_DEPTH_1 // { dg-line use_TEST_2_DEPTH_1 } +} + +// { dg-error "'bad_alloc' was not declared in this scope" "" { target *-*-* } define_TEST_2_DEPTH_0 } +/* { dg-begin-multiline-output "" } + #define TEST_2_DEPTH_0 throw bad_alloc; + ^~~~~~~~~ + { dg-end-multiline-output "" } */ +// { dg-message "in expansion of macro 'TEST_2_DEPTH_0'" "" { target *-*-* } define_TEST_2_DEPTH_1 } +/* { dg-begin-multiline-output "" } + #define TEST_2_DEPTH_1 TEST_2_DEPTH_0 + ^~~~~~~~~~~~~~ + { dg-end-multiline-output "" } */ +// { dg-message "in expansion of macro 'TEST_2_DEPTH_1'" "" { target *-*-* } use_TEST_2_DEPTH_1 } +/* { dg-begin-multiline-output "" } + TEST_2_DEPTH_1 + ^~~~~~~~~~~~~~ + { dg-end-multiline-output "" } */ diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index d080b016876..cf6f924ac95 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,10 @@ +2017-07-07 David Malcolm + + PR c++/79300 + * line-map.c (linemap_macro_loc_to_def_point): Preserve range + information for macro expansions by delaying resolving ad-hoc + locations until within the loop. + 2017-07-06 David Malcolm PR c++/79300 diff --git a/libcpp/line-map.c b/libcpp/line-map.c index 3b65a464647..0e5804b65bc 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -1440,21 +1440,23 @@ linemap_macro_loc_to_def_point (struct line_maps *set, { struct line_map *map; - if (IS_ADHOC_LOC (location)) - location = set->location_adhoc_data_map.data[location - & MAX_SOURCE_LOCATION].locus; - linemap_assert (set && location >= RESERVED_LOCATION_COUNT); while (true) { - map = const_cast (linemap_lookup (set, location)); + source_location caret_loc; + if (IS_ADHOC_LOC (location)) + caret_loc = get_location_from_adhoc_loc (set, location); + else + caret_loc = location; + + map = const_cast (linemap_lookup (set, caret_loc)); if (!linemap_macro_expansion_map_p (map)) break; location = linemap_macro_map_loc_to_def_point (linemap_check_macro (map), - location); + caret_loc); } if (original_map) -- 2.30.2