* [committed] libcpp: preserve ranges within macro expansions (PR c++/79300)
@ 2017-07-07 18:52 David Malcolm
0 siblings, 0 replies; only message in thread
From: David Malcolm @ 2017-07-07 18:52 UTC (permalink / raw)
To: gcc-patches; +Cc: David Malcolm
Comment #4 of PR c++/79300 noted a place in which we fail to underline
the full token of a macro name in maybe_unwind_expanded_macro_loc.
Root cause is that linemap_macro_loc_to_def_point drops range
information too early when following the macro expansions; fixed thusly.
Successfully bootstrapped®rtested on x86_64-pc-linux-gnu.
Committed to trunk as r250058.
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.
---
gcc/testsuite/g++.dg/diagnostic/pr79300.C | 44 +++++++++++++++++++++++++++++++
libcpp/line-map.c | 14 +++++-----
2 files changed, 52 insertions(+), 6 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/diagnostic/pr79300.C
diff --git a/gcc/testsuite/g++.dg/diagnostic/pr79300.C b/gcc/testsuite/g++.dg/diagnostic/pr79300.C
new file mode 100644
index 0000000..6805e85
--- /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/line-map.c b/libcpp/line-map.c
index 1c1acc8..300cfd0 100644
--- a/libcpp/line-map.c
+++ b/libcpp/line-map.c
@@ -1439,21 +1439,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 <line_map *> (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 <line_map *> (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)
--
1.8.5.3
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2017-07-07 18:52 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-07 18:52 [committed] libcpp: preserve ranges within macro expansions (PR c++/79300) David Malcolm
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).