https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69558
Bernd Edlinger <bernd.edlinger at hotmail dot de> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bernd.edlinger at hotmail dot de --- Comment #24 from Bernd Edlinger <bernd.edlinger at hotmail dot de> --- (In reply to Jakub Jelinek from comment #4) > Reverting one minor part of those changes fixes both of the PRs though: > --- gcc/c-family/c-pragma.c.jj 2016-01-15 21:57:00.000000000 +0100 > +++ gcc/c-family/c-pragma.c 2016-01-29 18:34:51.743943283 +0100 > @@ -819,7 +819,7 @@ handle_pragma_diagnostic(cpp_reader *ARG > arg = option_string + 1 + cl_options[option_index].opt_len; > control_warning_option (option_index, (int) kind, > arg, kind != DK_IGNORED, > - loc, lang_mask, &handlers, > + input_location, lang_mask, &handlers, > &global_options, &global_options_set, > global_dc); > } > I have no idea why, but if it doesn't break anything else, I think it would > be better to revert it. The ChangeLog nor gcc-patches post doesn't mention > that change anywhere. FYI, I was there as well, and found the following. loc points to the location of ")" in "C (foo)", while input_location points to "C" in the C FE and to ")" in the C++ FE :-) The reason why this does still not work in C++ is, that the source code is sorted by location in this way: "void foo (void) _Pragma ("GCC diagnostic push") Pragma ("GCC diagnostic ignored")" at the time when the warning is issued. while your patch fixed the C FE, by using the location of the macro expansion pint for the _Pragma, and therefore the stack looked again way: "_Pragma ("push") _Pragma ("ignored") void foo (void)" This works only because the warning is printed immediately. For late warnings the situation would look like "_Pragma ("push") _Pragma ("ignored") _Pragma ("pop") warning_location"