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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P1
                 CC|                            |dmalcolm at gcc dot gnu.org

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Actually, pilot error.  It actually does reproduce with it, and reproduces
since like forever.
c=/opt/notnfs/gcc-bisect/obj/gcc/cc1plus.r15-3886; $c -quiet -D_GNU_SOURCE
pr116847.h --output-pch pr116847.h.gch; $c -quiet -D_GNU_SOURCE -Winvalid-pch
pr116847.C
pr116847.h: In instantiation of ‘static int S<N>::bar() [with int N = 0]’:
pr116847.C:3:19:   required from here
    3 | int a = S<0>::bar ();
      |         ~~~~~~~~~~^~
pr116847.h:6:32: warning: ‘int foo()’ is deprecated [-Wdeprecated-declarations]
    6 | static int bar () { return foo (); }
      |                            ~~~~^~
pr116847.h:1:20: note: declared here
    1 | [[deprecated]] int foo () { return 42; }
      |                    ^~~
pr116847.h:6:32: warning: ‘int foo()’ is deprecated [-Wdeprecated-declarations]
    6 | static int bar () { return foo (); }
      |                            ~~~~^~
pr116847.h:1:20: note: declared here
    1 | [[deprecated]] int foo () { return 42; }
      |                    ^~~
pr116847.h:6:32: warning: ‘int foo()’ is deprecated [-Wdeprecated-declarations]
    6 | static int bar () { return foo (); }
      |                            ~~~~^~
pr116847.h:1:20: note: declared here
    1 | [[deprecated]] int foo () { return 42; }
      |                    ^~~
Same all the way to r13-282, before that we didn't support --output-pch space
argument, but changing that to --output-pch=pr116847.h.gch and far earlier
changing [[deprecated]] to __attribute__((deprecated)) all the way to
r0-100966-g5e88be0d153ec
when the diagnostic history has been introduced.

I think the reason is simple, neither global_dc nor
global_dc->m_option_classifier->m_option_classifier and
global_dc->m_option_classifier->m_n_classification_history are in GC, so
effectively after PCH restore there is empty history.

Dunno if we want to support say:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wwhatever"
in a header which is compiled with PCH and #pragma GCC diagnostic pop in the
main source or another header, if yes, we need to save/restore more stuff, like
m_classify_diagnostic and m_push_list and m_n_push, if not, I think we need to
save/restore just the classification history.

That can be done either by making that stuff GTY, or by explicitly
saving/restoring the stuff that needs saving/restoring, like e.g.
cpp_write_pch_state/cpp_read_state does.

OT, is there a reason why diagnostic.{h,cc} doesn't use vec.h and uses its own
vectors instead?
  m_push_list = (int *) xrealloc (m_push_list, (m_n_push + 1) * sizeof (int));
  m_push_list[m_n_push ++] = m_n_classification_history;
or
      i = m_n_classification_history;
      m_classification_history =
        (diagnostic_classification_change_t *) xrealloc
(m_classification_history, (i + 1)
                                                         * sizeof
(diagnostic_classification_change_t));
      m_classification_history[i].location = where;
      m_classification_history[i].option = option_id.m_idx;
      m_classification_history[i].kind = new_kind;
      m_n_classification_history ++;
is simply terrible for many reasons:
1) linear growth rather than exponential growth
2) not using XRESIZEVEC macro, m_push_list = XRESIZEVEC (int, m_push_list,
m_n_push + 1);
3) = shouldn't be at the end of line
4) space before ++
If yes, say because of it is also linked into gen* utilities and if they can't
link with vec.o, then at least the formatting
should be fixed and exponential growth should be added, especially now that the
pragmas are widely used.
I see 159 #pragma GCC diagnostic ignored and 147 #pragma GCC diagnostic pop
pragmas in libstdc++ headers, so if one includes lots of STL headers,
that is ~300 reallocations on the history and wonder how many on the other
vectors.

Reply via email to