mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
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:
12
gcc/testsuite/g++.dg/modules/warn-spec-5_a.C
Normal file
12
gcc/testsuite/g++.dg/modules/warn-spec-5_a.C
Normal 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
|
||||
8
gcc/testsuite/g++.dg/modules/warn-spec-5_b.C
Normal file
8
gcc/testsuite/g++.dg/modules/warn-spec-5_b.C
Normal 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 } }
|
||||
4
gcc/testsuite/g++.dg/modules/warn-spec-5_c.C
Normal file
4
gcc/testsuite/g++.dg/modules/warn-spec-5_c.C
Normal file
@@ -0,0 +1,4 @@
|
||||
// PR c++/124466
|
||||
// { dg-additional-options "-fmodules" }
|
||||
|
||||
import B;
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user