Hello- Trying this one again. Could I please ask a global maintainer to take a look maybe? Thanks! https://gcc.gnu.org/pipermail/gcc-patches/2026-July/724528.html
-Lewis On Sun, Oct 4, 2026 at 11:44 PM Lewis Hyatt <[email protected]> wrote: > > Hello- > > Could I please ping this one? > https://gcc.gnu.org/pipermail/gcc-patches/2026-July/724528.html > fixes https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124240 > > Thanks! > > -Lewis > > On Sun, Sep 27, 2026 at 11:48 AM Lewis Hyatt <[email protected]> wrote: > > > > Hello- > > > > https://gcc.gnu.org/pipermail/gcc-patches/2026-July/724528.html > > > > Ping please? Thanks! > > > > -Lewis > > > > On Sun, Aug 30, 2026 at 11:22 AM Lewis Hyatt <[email protected]> wrote: > > > > > > https://gcc.gnu.org/pipermail/gcc-patches/2026-July/724528.html > > > > > > Ping please? Thanks! > > > > > > -Lewis > > > > > > On Sun, Aug 9, 2026 at 3:59 PM Lewis Hyatt <[email protected]> wrote: > > > > > > > > Could I please ping this one? Thanks! > > > > > > > > https://gcc.gnu.org/pipermail/gcc-patches/2026-July/724528.html > > > > > > > > -Lewis > > > > > > > > On Sun, Jul 19, 2026 at 10:26 PM Lewis Hyatt <[email protected]> wrote: > > > > > > > > > > Hello- > > > > > > > > > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124240 > > > > > > > > > > This is a small patch to fix up the issue with #pragma GCC diagnostic > > > > > noted > > > > > in the PR. OK? > > > > > > > > > > bootstrap + regtest all languages on x86-64 and aarch64 (cfarm425). > > > > > > > > > > Thanks! > > > > > > > > > > -Lewis > > > > > > > > > > -- >8 -- > > > > > > > > > > There are two distinct properties of a diagnostic that determine > > > > > whether or > > > > > not it will be emitted: > > > > > > > > > > 1) Enabled/Disabled > > > > > A diagnostic can be globally enabled or disabled. Most > > > > > commonly, a > > > > > diagnostic is enabled by passing an argument -Wxyz or > > > > > -Werror=xyz > > > > > and disabled by -Wno-xyz. A diagnostic can also be enabled by > > > > > `#pragma GCC diagnostic'. > > > > > > > > > > 2) Classification > > > > > A diagnostic can be classifed as an error or a warning, or it > > > > > can be > > > > > classified as "ignored" to suppress it. A diagnostic can be > > > > > classified as an error or a warning by -Werror=xyz or > > > > > -Wno-error=xyz > > > > > (the former also enables the diagnostic; the latter does not > > > > > enable > > > > > or disable it, but classifies it as a warning so that, if it > > > > > is later > > > > > enabled, it will be a warning and not an error.) The default > > > > > classification of all enabled diagnostics can be set to > > > > > "error" with > > > > > -Werror or to "warning" with -Wno-error. > > > > > > > > > > A diagnostic will be suppressed if either it is not enabled, or if it > > > > > is > > > > > enabled but classified as "ignored". While the visible outcome is the > > > > > same > > > > > in either case, the states are not identical. (For example, the work > > > > > done to > > > > > diagnose an issue is done iff the diagnostic is enabled, regardless > > > > > if it > > > > > will later be suppressed.) > > > > > > > > > > The implementation of `#pragma GCC diagnostic' does not currently > > > > > distinguish between these two properties sufficiently to get all > > > > > possible > > > > > cases correct, as shown in the PR. The intended logic implemented in > > > > > diagnostics/option-classifier.cc is: > > > > > > > > > > -When a diagnostic is enabled by a pragma, that diagnostic becomes > > > > > enabled permanently. A subsequent `#pragma GCC diagnostic pop' > > > > > will not > > > > > disable it; rather, the option remains enabled but is classified > > > > > as > > > > > "ignored" in the regions of the source where the pragma that > > > > > enabled it > > > > > is not in effect. > > > > > > > > > > -When a pragma changes a diagnostic classification, or changes > > > > > the state > > > > > from disabled to enabled, the original situation (from the > > > > > command > > > > > line, prior to any pragmas) needs to be remembered for use in > > > > > source > > > > > regions outside the scope of the pragmas. > > > > > > > > > > -option-classifier.cc does not clearly make a separate note of > > > > > the two > > > > > different properties described above; it stores only the previous > > > > > classification, assuming that if a diagnostic has been classified > > > > > previously, then it must be enabled. If a diagnostic has not been > > > > > classified, then it stores the classification as either > > > > > "ignored", if > > > > > the diagnostic is disabled, otherwise as "any", meaning the > > > > > diagnostic > > > > > should be emitted as a warning or error as later requested and > > > > > not > > > > > suppressed. > > > > > > > > > > The issue with the last point is that after a sequence such as: > > > > > > > > > > -Werror -Wno-error=xyz -Wno-xyz > > > > > > > > > > then "xyz" is classified as a warning, but it is also disabled. If it > > > > > is > > > > > later enabled by `#pragma GCC diagnostic error' or `#pragma GCC > > > > > diagnostic > > > > > warning', then the incorrect original classification will be > > > > > remembered, and > > > > > a subsequent `#pragma GCC diagnostic pop' will leave the diagnostic > > > > > enabled > > > > > as a warning when it should be enabled and ignored. > > > > > > > > > > It could be more clear to explicitly remember the two different > > > > > properties > > > > > within the option classifier, rather than collapsing enabled/disabled > > > > > and > > > > > classification to a single variable. However, this would require more > > > > > extensive changes (including for streaming the pragmas in c++ > > > > > modules), and > > > > > it is not necessary to make the logic correct. Given that a pragma can > > > > > enable a diagnostic but never disable a diagnostic, it is sufficient > > > > > just to > > > > > tweak the existing logic a bit; namely, if a diagnostic is not > > > > > enabled when > > > > > `#pragma GCC diagnostic' is seen, then the old classification should > > > > > be > > > > > stored as "ignored" so that the correct state will be set when the > > > > > pragma is > > > > > not in effect. > > > > > > > > > > gcc/ChangeLog: > > > > > > > > > > PR diagnostics/124240 > > > > > * diagnostics/option-classifier.cc > > > > > (option_classifier::classify_diagnostic): Always record a > > > > > disabled > > > > > diagnostic option as being ignored. > > > > > > > > > > gcc/testsuite/ChangeLog: > > > > > > > > > > PR diagnostics/124240 > > > > > * c-c++-common/pr124240-1.c: New test. > > > > > * c-c++-common/pr124240-2.c: New test. > > > > > * c-c++-common/pr124240-3.c: New test. > > > > > --- > > > > > gcc/diagnostics/option-classifier.cc | 17 +++++++++++++---- > > > > > gcc/testsuite/c-c++-common/pr124240-1.c | 7 +++++++ > > > > > gcc/testsuite/c-c++-common/pr124240-2.c | 7 +++++++ > > > > > gcc/testsuite/c-c++-common/pr124240-3.c | 7 +++++++ > > > > > 4 files changed, 34 insertions(+), 4 deletions(-) > > > > > create mode 100644 gcc/testsuite/c-c++-common/pr124240-1.c > > > > > create mode 100644 gcc/testsuite/c-c++-common/pr124240-2.c > > > > > create mode 100644 gcc/testsuite/c-c++-common/pr124240-3.c > > > > > > > > > > diff --git a/gcc/diagnostics/option-classifier.cc > > > > > b/gcc/diagnostics/option-classifier.cc > > > > > index 60dd1dda49a..b9069a60dde 100644 > > > > > --- a/gcc/diagnostics/option-classifier.cc > > > > > +++ b/gcc/diagnostics/option-classifier.cc > > > > > @@ -135,10 +135,19 @@ option_classifier::classify_diagnostic (const > > > > > context *dc, > > > > > the pragmas were. */ > > > > > if (where != UNKNOWN_LOCATION) > > > > > { > > > > > - /* Record the command-line status, so we can reset it back on > > > > > kind::pop. */ > > > > > - if (base_kind == kind::unspecified) > > > > > - base_kind = (!dc->option_enabled_p (opt_id) > > > > > - ? kind::ignored : kind::any); > > > > > + /* Record the command-line status, so we can reset it back on > > > > > kind::pop. > > > > > + If an option was not initially enabled, it may become > > > > > enabled after a > > > > > + pragma, at which point it will always remain enabled even > > > > > after a > > > > > + subsequent pragma pop, so we need to classify the baseline > > > > > state as > > > > > + being ignored, even if it was previously set (e.g. by > > > > > -Werror=) to > > > > > + something else. It is safe to always mark a non-enabled > > > > > option as > > > > > + ignored here, given that a pragma can never cause an enabled > > > > > diagnostic > > > > > + to become disabled--it would rather just become > > > > > enabled-but-ignored > > > > > + after #pragma GCC diagnostic ignored. */ > > > > > + if (!dc->option_enabled_p (opt_id)) > > > > > + base_kind = kind::ignored; > > > > > + else if (base_kind == kind::unspecified) > > > > > + base_kind = kind::any; > > > > > > > > > > classification_change_t v > > > > > = { where, opt_id.m_idx, new_kind }; > > > > > diff --git a/gcc/testsuite/c-c++-common/pr124240-1.c > > > > > b/gcc/testsuite/c-c++-common/pr124240-1.c > > > > > new file mode 100644 > > > > > index 00000000000..dfd6eab3809 > > > > > --- /dev/null > > > > > +++ b/gcc/testsuite/c-c++-common/pr124240-1.c > > > > > @@ -0,0 +1,7 @@ > > > > > +/* PR diagnostics/124240 */ > > > > > +/* { dg-do compile } */ > > > > > +/* { dg-additional-options "-Wall -Werror -Wno-unused-variable" } */ > > > > > +#pragma GCC diagnostic push > > > > > +#pragma GCC diagnostic error "-Wunused-variable" > > > > > +#pragma GCC diagnostic pop > > > > > +static int i = 1; /* { dg-bogus "-Wunused" } */ > > > > > diff --git a/gcc/testsuite/c-c++-common/pr124240-2.c > > > > > b/gcc/testsuite/c-c++-common/pr124240-2.c > > > > > new file mode 100644 > > > > > index 00000000000..8cf03e38606 > > > > > --- /dev/null > > > > > +++ b/gcc/testsuite/c-c++-common/pr124240-2.c > > > > > @@ -0,0 +1,7 @@ > > > > > +/* PR diagnostics/124240 */ > > > > > +/* { dg-do compile } */ > > > > > +/* { dg-additional-options "-Wall -Werror -Wno-error=unused-variable > > > > > -Wno-unused-variable" } */ > > > > > +#pragma GCC diagnostic push > > > > > +#pragma GCC diagnostic error "-Wunused-variable" > > > > > +#pragma GCC diagnostic pop > > > > > +static int i = 1; /* { dg-bogus "-Wunused" } */ > > > > > diff --git a/gcc/testsuite/c-c++-common/pr124240-3.c > > > > > b/gcc/testsuite/c-c++-common/pr124240-3.c > > > > > new file mode 100644 > > > > > index 00000000000..eb73b88fc1e > > > > > --- /dev/null > > > > > +++ b/gcc/testsuite/c-c++-common/pr124240-3.c > > > > > @@ -0,0 +1,7 @@ > > > > > +/* PR diagnostics/124240 */ > > > > > +/* { dg-do compile } */ > > > > > +/* { dg-additional-options "-Wall -Werror -Wno-unused-variable > > > > > -Wno-error=unused-variable" } */ > > > > > +#pragma GCC diagnostic push > > > > > +#pragma GCC diagnostic error "-Wunused-variable" > > > > > +#pragma GCC diagnostic pop > > > > > +static int i = 1; /* { dg-bogus "-Wunused" } */
