The testcase crashed because in warn-spec-5_b.C we were writing
diagnostic classifications for pops but not for the things they were
ignoring. We should have been writing neither, as they all came from an
imported location, but linemap_location_from_module_p was returning
false for locations that originated from macros in a module.
PR c++/124466
libcpp/ChangeLog:
* line-map.cc (linemap_location_from_module_p): Resolve loc in
case it's a macro location.
gcc/testsuite/ChangeLog:
* g++.dg/modules/warn-spec-5_a.C: New test.
* g++.dg/modules/warn-spec-5_b.C: New test.
* g++.dg/modules/warn-spec-5_c.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
--- /dev/null
+// PR c++/124466
+// { dg-additional-options "-fmodules" }
+// { dg-module-cmi A }
+
+export module A;
+
+#define PUSH _Pragma("GCC diagnostic push")
+#define POP _Pragma("GCC diagnostic pop")
+
+PUSH
+#pragma GCC diagnostic ignored "-Wvariadic-macros"
+POP
--- /dev/null
+// PR c++/124466
+// { dg-additional-options "-fmodules -fdump-lang-module" }
+// { dg-module-cmi B }
+
+export module B;
+export import A;
+
+// { dg-final { scan-lang-dump {Diagnostic changes: 0} module } }
--- /dev/null
+// PR c++/124466
+// { dg-additional-options "-fmodules" }
+
+import B;
bool
linemap_location_from_module_p (const line_maps *set, location_t loc)
{
- const line_map_ordinary *map = linemap_ordinary_map_lookup (set, loc);
+ const line_map_ordinary *map = nullptr;
+ linemap_resolve_location (set, loc, LRK_SPELLING_LOCATION, &map);
+
while (map && map->reason != LC_MODULE)
map = linemap_included_from_linemap (set, map);
return !!map;