https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69126

--- Comment #5 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
As far as I can tell:
  * _Pragma is handled by _cpp_do__Pragma which injects pragma tokens into the
token stream
  * the resulting "ignore" pragmas are handled by
gcc/c-family/c-pragma.c:handle_pragma_diagnostic which calls:
    * control_warning_option, which calls
      * diagnostic_classify_diagnostic, which leads to an element being pushed
onto context->classification_history with location as the location of the
token.

When handling the warning/warning_at, diagnostic_report_diagnostic has this
logic:
695           /* This tests for #pragma diagnostic changes.  */
696           if (context->n_classification_history > 0)
697             {
698               int i;
699               /* FIXME: Stupid search.  Optimize later. */
700               for (i = context->n_classification_history - 1; i >= 0; i --)
701                 {
702                   if (linemap_location_before_p
703                       (line_table,
704                        context->classification_history[i].location,
705                        location))

Note the call to linemap_location_before_p, which calls
linemap_compare_locations.

That said, the location of the token from _Pragma looks wrong; note the
underlines here:

Breakpoint 2, handle_pragma_diagnostic (dummy=<optimized out>) at
../../src/gcc/c-family/c-pragma.c:760
760         kind = DK_IGNORED;
(gdb) call inform (loc, "1st ignore")
/tmp/test.cc: In function ‘int f()’:
/tmp/test.cc:4:16: note: 1st ignore
     _Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
                ^~~~~~~
(gdb) cont
Continuing.

Breakpoint 2, handle_pragma_diagnostic (dummy=<optimized out>) at
../../src/gcc/c-family/c-pragma.c:760
760         kind = DK_IGNORED;
(gdb) call inform (loc, "2nd ignore")
/tmp/test.cc: In function ‘int g()’:
/tmp/test.cc:17:16: note: 2nd ignore
     MACRO;
                ^

Reply via email to