diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 4dcee160956..628dec9c1b2 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -21217,10 +21217,6 @@ module_state::read_initial (cpp_reader *reader) else if (!read_ordinary_maps (config.ordinary_locs, config.loc_range_bits)) ok = false; - if (ok && have_locs && config.ordinary_locs - && !read_diagnostic_classification (global_dc)) - ok = false; - /* Allocate the REMAP vector. */ slurp->alloc_remap (config.num_imports); @@ -21281,6 +21277,12 @@ module_state::read_initial (cpp_reader *reader) else if (!read_macro_maps (config.macro_locs)) ok = false; + /* Diagnostic classification streaming needs to come after reading + macro maps to handle _Pragmas in macros. */ + if (ok && have_locs && config.ordinary_locs + && !read_diagnostic_classification (global_dc)) + ok = false; + /* Note whether there's an active initializer. */ active_init_p = !is_header () && bool (config.active_init); diff --git a/gcc/testsuite/g++.dg/modules/warn-spec-4_a.C b/gcc/testsuite/g++.dg/modules/warn-spec-4_a.C new file mode 100644 index 00000000000..2eddc1b4c56 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/warn-spec-4_a.C @@ -0,0 +1,15 @@ +// PR c++/124459 +// { dg-additional-options "-fmodules -Wunused-but-set-variable" } +// Test diagnostic pragmas in macro maps. + +export module M; + +#define MACRO(t) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wunused-but-set-variable\"") \ + int x = t; \ + _Pragma("GCC diagnostic pop") + +export template void foo(T t) { + MACRO(t); +} diff --git a/gcc/testsuite/g++.dg/modules/warn-spec-4_b.C b/gcc/testsuite/g++.dg/modules/warn-spec-4_b.C new file mode 100644 index 00000000000..fce9b849308 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/warn-spec-4_b.C @@ -0,0 +1,8 @@ +// PR c++/124459 +// { dg-additional-options "-fmodules -Wunused-but-set-variable" } + +import M; + +void test() { + foo(123); +}