libcpp: Handle macro locations in linemap_location_from_module_p [PR124466]

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>
This commit is contained in:
Nathaniel Shead
2026-03-13 17:31:52 +11:00
parent a0d6c3f23c
commit a7135aaa4e
4 changed files with 27 additions and 1 deletions

View File

@@ -0,0 +1,12 @@
// 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

View File

@@ -0,0 +1,8 @@
// 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 } }

View File

@@ -0,0 +1,4 @@
// PR c++/124466
// { dg-additional-options "-fmodules" }
import B;

View File

@@ -772,7 +772,9 @@ linemap_module_restore (line_maps *set, line_map_uint_t lwm)
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;