On Tue, Oct 17, 2023 at 9:51 PM Jason Merrill <ja...@redhat.com> wrote:
>
> Ping?

OK.

Thanks,
Richard.

> On 10/3/23 17:09, Jason Merrill wrote:
> > This revision changes from using DK_PEDWARN for permerror-with-option to 
> > using
> > DK_PERMERROR.
> >
> > Tested x86_64-pc-linux-gnu.  OK for trunk?
> >
> > -- 8< --
> >
> > In the discussion of promoting some pedwarns to be errors by default, rather
> > than move them all into -fpermissive it seems to me to make sense to support
> > DK_PERMERROR with an option flag.  This way will also work with
> > -fpermissive, but users can also still use -Wno-error=narrowing to downgrade
> > that specific diagnostic rather than everything affected by -fpermissive.
> >
> > So, for diagnostics that we want to make errors by default we can just
> > change the pedwarn call to permerror.
> >
> > The tests check desired behavior for such a permerror in a system header
> > with various flags.  The patch preserves the existing permerror behavior of
> > ignoring -w and system headers by default, but respecting them when
> > downgraded to a warning by -fpermissive.
> >
> > This seems similar to but a bit better than the approach of forcing
> > -pedantic-errors that I previously used for -Wnarrowing: specifically, in
> > that now -w by itself is not enough to silence the -Wnarrowing
> > error (integer-pack2.C).
> >
> > gcc/ChangeLog:
> >
> >       * doc/invoke.texi: Move -fpermissive to Warning Options.
> >       * diagnostic.cc (update_effective_level_from_pragmas): Remove
> >       redundant system header check.
> >       (diagnostic_report_diagnostic): Move down syshdr/-w check.
> >       (diagnostic_impl): Handle DK_PERMERROR with an option number.
> >       (permerror): Add new overloads.
> >       * diagnostic-core.h (permerror): Declare them.
> >
> > gcc/cp/ChangeLog:
> >
> >       * typeck2.cc (check_narrowing): Use permerror.
> >
> > gcc/testsuite/ChangeLog:
> >
> >       * g++.dg/ext/integer-pack2.C: Add -fpermissive.
> >       * g++.dg/diagnostic/sys-narrow.h: New test.
> >       * g++.dg/diagnostic/sys-narrow1.C: New test.
> >       * g++.dg/diagnostic/sys-narrow1a.C: New test.
> >       * g++.dg/diagnostic/sys-narrow1b.C: New test.
> >       * g++.dg/diagnostic/sys-narrow1c.C: New test.
> >       * g++.dg/diagnostic/sys-narrow1d.C: New test.
> >       * g++.dg/diagnostic/sys-narrow1e.C: New test.
> >       * g++.dg/diagnostic/sys-narrow1f.C: New test.
> >       * g++.dg/diagnostic/sys-narrow1g.C: New test.
> >       * g++.dg/diagnostic/sys-narrow1h.C: New test.
> >       * g++.dg/diagnostic/sys-narrow1i.C: New test.
> > ---
> >   gcc/doc/invoke.texi                           | 22 +++---
> >   gcc/diagnostic-core.h                         |  3 +
> >   gcc/testsuite/g++.dg/diagnostic/sys-narrow.h  |  2 +
> >   gcc/cp/typeck2.cc                             | 10 +--
> >   gcc/diagnostic.cc                             | 67 ++++++++++++-------
> >   gcc/testsuite/g++.dg/diagnostic/sys-narrow1.C |  4 ++
> >   .../g++.dg/diagnostic/sys-narrow1a.C          |  5 ++
> >   .../g++.dg/diagnostic/sys-narrow1b.C          |  5 ++
> >   .../g++.dg/diagnostic/sys-narrow1c.C          |  5 ++
> >   .../g++.dg/diagnostic/sys-narrow1d.C          |  5 ++
> >   .../g++.dg/diagnostic/sys-narrow1e.C          |  5 ++
> >   .../g++.dg/diagnostic/sys-narrow1f.C          |  5 ++
> >   .../g++.dg/diagnostic/sys-narrow1g.C          |  5 ++
> >   .../g++.dg/diagnostic/sys-narrow1h.C          |  6 ++
> >   .../g++.dg/diagnostic/sys-narrow1i.C          |  6 ++
> >   gcc/testsuite/g++.dg/ext/integer-pack2.C      |  2 +-
> >   16 files changed, 117 insertions(+), 40 deletions(-)
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow.h
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1.C
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1a.C
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1b.C
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1c.C
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1d.C
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1e.C
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1f.C
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1g.C
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1h.C
> >   create mode 100644 gcc/testsuite/g++.dg/diagnostic/sys-narrow1i.C
> >
> > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> > index 4085fc90907..6b6506a75b2 100644
> > --- a/gcc/doc/invoke.texi
> > +++ b/gcc/doc/invoke.texi
> > @@ -231,7 +231,7 @@ in the following sections.
> >   -fnew-inheriting-ctors
> >   -fnew-ttp-matching
> >   -fno-nonansi-builtins  -fnothrow-opt  -fno-operator-names
> > --fno-optional-diags  -fpermissive
> > +-fno-optional-diags
> >   -fno-pretty-templates
> >   -fno-rtti  -fsized-deallocation
> >   -ftemplate-backtrace-limit=@var{n}
> > @@ -323,7 +323,7 @@ Objective-C and Objective-C++ Dialects}.
> >   @item Warning Options
> >   @xref{Warning Options,,Options to Request or Suppress Warnings}.
> >   @gccoptlist{-fsyntax-only  -fmax-errors=@var{n}  -Wpedantic
> > --pedantic-errors
> > +-pedantic-errors -fpermissive
> >   -w  -Wextra  -Wall  -Wabi=@var{n}
> >   -Waddress  -Wno-address-of-packed-member  -Waggregate-return
> >   -Walloc-size-larger-than=@var{byte-size}  -Walloc-zero
> > @@ -3494,12 +3494,6 @@ Disable diagnostics that the standard says a 
> > compiler does not need to
> >   issue.  Currently, the only such diagnostic issued by G++ is the one for
> >   a name having multiple meanings within a class.
> >
> > -@opindex fpermissive
> > -@item -fpermissive
> > -Downgrade some diagnostics about nonconformant code from errors to
> > -warnings.  Thus, using @option{-fpermissive} allows some
> > -nonconforming code to compile.
> > -
> >   @opindex fno-pretty-templates
> >   @opindex fpretty-templates
> >   @item -fno-pretty-templates
> > @@ -6159,6 +6153,18 @@ errors by @option{-pedantic-errors}.  For instance:
> >   -Wwrite-strings @r{(C++11 or later)}
> >   }
> >
> > +@opindex fpermissive
> > +@item -fpermissive
> > +Downgrade some required diagnostics about nonconformant code from
> > +errors to warnings.  Thus, using @option{-fpermissive} allows some
> > +nonconforming code to compile.  Some C++ diagnostics are controlled
> > +only by this flag, but it also downgrades some diagnostics that have
> > +their own flag:
> > +
> > +@gccoptlist{
> > +-Wnarrowing @r{(C++)}
> > +}
> > +
> >   @opindex Wall
> >   @opindex Wno-all
> >   @item -Wall
> > diff --git a/gcc/diagnostic-core.h b/gcc/diagnostic-core.h
> > index c9e27fd2e6e..2d9909f18bd 100644
> > --- a/gcc/diagnostic-core.h
> > +++ b/gcc/diagnostic-core.h
> > @@ -105,6 +105,9 @@ extern bool pedwarn (rich_location *, int, const char 
> > *, ...)
> >   extern bool permerror (location_t, const char *, ...) 
> > ATTRIBUTE_GCC_DIAG(2,3);
> >   extern bool permerror (rich_location *, const char *,
> >                                  ...) ATTRIBUTE_GCC_DIAG(2,3);
> > +extern bool permerror (location_t, int, const char *, ...) 
> > ATTRIBUTE_GCC_DIAG(3,4);
> > +extern bool permerror (rich_location *, int, const char *,
> > +                    ...) ATTRIBUTE_GCC_DIAG(3,4);
> >   extern void sorry (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
> >   extern void sorry_at (location_t, const char *, ...) 
> > ATTRIBUTE_GCC_DIAG(2,3);
> >   extern void inform (location_t, const char *, ...) 
> > ATTRIBUTE_GCC_DIAG(2,3);
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow.h 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow.h
> > new file mode 100644
> > index 00000000000..ff042c54a10
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow.h
> > @@ -0,0 +1,2 @@
> > +#pragma GCC system_header
> > +int i = { 2.4 }; // C++11 error: narrowing conversion
> > diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc
> > index cd1ea045720..ab819d4e49d 100644
> > --- a/gcc/cp/typeck2.cc
> > +++ b/gcc/cp/typeck2.cc
> > @@ -1109,15 +1109,11 @@ check_narrowing (tree type, tree init, 
> > tsubst_flags_t complain,
> >         else if (complain & tf_error)
> >       {
> >         int savederrorcount = errorcount;
> > -       if (!flag_permissive)
> > -         global_dc->pedantic_errors = 1;
> > -       auto s = make_temp_override (global_dc->dc_warn_system_headers, 
> > true);
> > -       pedwarn (loc, OPT_Wnarrowing,
> > -                "narrowing conversion of %qE from %qH to %qI",
> > -                init, ftype, type);
> > +       permerror (loc, OPT_Wnarrowing,
> > +                  "narrowing conversion of %qE from %qH to %qI",
> > +                  init, ftype, type);
> >         if (errorcount == savederrorcount)
> >           ok = true;
> > -       global_dc->pedantic_errors = flag_pedantic_errors;
> >       }
> >       }
> >
> > diff --git a/gcc/diagnostic.cc b/gcc/diagnostic.cc
> > index 65a78840a66..fcbd69f2b8b 100644
> > --- a/gcc/diagnostic.cc
> > +++ b/gcc/diagnostic.cc
> > @@ -1232,14 +1232,6 @@ static diagnostic_t
> >   update_effective_level_from_pragmas (diagnostic_context *context,
> >                                    diagnostic_info *diagnostic)
> >   {
> > -  if (diagnostic->m_iinfo.m_allsyslocs && !context->dc_warn_system_headers)
> > -    {
> > -      /* Ignore the diagnostic if all the inlined locations are
> > -      in system headers and -Wno-system-headers is in effect.  */
> > -      diagnostic->kind = DK_IGNORED;
> > -      return DK_IGNORED;
> > -    }
> > -
> >     if (context->n_classification_history <= 0)
> >       return DK_UNSPECIFIED;
> >
> > @@ -1480,24 +1472,16 @@ bool
> >   diagnostic_report_diagnostic (diagnostic_context *context,
> >                             diagnostic_info *diagnostic)
> >   {
> > -  location_t location = diagnostic_location (diagnostic);
> >     diagnostic_t orig_diag_kind = diagnostic->kind;
> >
> >     gcc_assert (context->m_output_format);
> >
> >     /* Give preference to being able to inhibit warnings, before they
> >        get reclassified to something else.  */
> > -  bool report_warning_p = true;
> > -  if (diagnostic->kind == DK_WARNING || diagnostic->kind == DK_PEDWARN)
> > -    {
> > -      if (context->dc_inhibit_warnings)
> > -     return false;
> > -      /* Remember the result of the overall system header warning setting
> > -      but proceed to also check the inlining context.  */
> > -      report_warning_p = diagnostic_report_warnings_p (context, location);
> > -      if (!report_warning_p && diagnostic->kind == DK_PEDWARN)
> > -     return false;
> > -    }
> > +  bool was_warning = (diagnostic->kind == DK_WARNING
> > +                   || diagnostic->kind == DK_PEDWARN);
> > +  if (was_warning && context->dc_inhibit_warnings)
> > +    return false;
> >
> >     if (diagnostic->kind == DK_PEDWARN)
> >       {
> > @@ -1537,9 +1521,12 @@ diagnostic_report_diagnostic (diagnostic_context 
> > *context,
> >     if (!diagnostic_enabled (context, diagnostic))
> >       return false;
> >
> > -  if (!report_warning_p && diagnostic->m_iinfo.m_allsyslocs)
> > -    /* Bail if the warning is not to be reported because all locations
> > -       in the inlining stack (if there is one) are in system headers.  */
> > +  if ((was_warning || diagnostic->kind == DK_WARNING)
> > +      && ((!context->dc_warn_system_headers
> > +        && diagnostic->m_iinfo.m_allsyslocs)
> > +       || context->dc_inhibit_warnings))
> > +    /* Bail if the warning is not to be reported because all locations in 
> > the
> > +       inlining stack (if there is one) are in system headers.  */
> >       return false;
> >
> >     if (diagnostic->kind != DK_NOTE && diagnostic->kind != DK_ICE)
> > @@ -1733,7 +1720,8 @@ diagnostic_impl (rich_location *richloc, const 
> > diagnostic_metadata *metadata,
> >       {
> >         diagnostic_set_info (&diagnostic, gmsgid, ap, richloc,
> >                          permissive_error_kind (global_dc));
> > -      diagnostic.option_index = permissive_error_option (global_dc);
> > +      diagnostic.option_index = (opt != -1 ? opt
> > +                              : permissive_error_option (global_dc));
> >       }
> >     else
> >       {
> > @@ -2029,6 +2017,37 @@ permerror (rich_location *richloc, const char 
> > *gmsgid, ...)
> >     return ret;
> >   }
> >
> > +/* Similar to the above, but controlled by a flag other than -fpermissive.
> > +   As above, an error by default or a warning with -fpermissive, but this
> > +   diagnostic can also be downgraded by -Wno-error=opt.  */
> > +
> > +bool
> > +permerror (location_t location, int opt, const char *gmsgid, ...)
> > +{
> > +  auto_diagnostic_group d;
> > +  va_list ap;
> > +  va_start (ap, gmsgid);
> > +  rich_location richloc (line_table, location);
> > +  bool ret = diagnostic_impl (&richloc, NULL, opt, gmsgid, &ap, 
> > DK_PERMERROR);
> > +  va_end (ap);
> > +  return ret;
> > +}
> > +
> > +/* Same as "permerror" above, but at RICHLOC.  */
> > +
> > +bool
> > +permerror (rich_location *richloc, int opt, const char *gmsgid, ...)
> > +{
> > +  gcc_assert (richloc);
> > +
> > +  auto_diagnostic_group d;
> > +  va_list ap;
> > +  va_start (ap, gmsgid);
> > +  bool ret = diagnostic_impl (richloc, NULL, opt, gmsgid, &ap, 
> > DK_PERMERROR);
> > +  va_end (ap);
> > +  return ret;
> > +}
> > +
> >   /* A hard error: the code is definitely ill-formed, and an object file
> >      will not be produced.  */
> >   void
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1.C
> > new file mode 100644
> > index 00000000000..7d3bca9f231
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1.C
> > @@ -0,0 +1,4 @@
> > +// { dg-do compile { target c++11 } }
> > +
> > +// { dg-error "narrowing" "" { target *-*-* } 2 }
> > +#include "sys-narrow.h"
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1a.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1a.C
> > new file mode 100644
> > index 00000000000..58cdaf273c9
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1a.C
> > @@ -0,0 +1,5 @@
> > +// { dg-do compile { target c++11 } }
> > +// { dg-additional-options "-w" }
> > +
> > +// { dg-error "narrowing" "" { target *-*-* } 2 }
> > +#include "sys-narrow.h"
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1b.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1b.C
> > new file mode 100644
> > index 00000000000..8528f5d357b
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1b.C
> > @@ -0,0 +1,5 @@
> > +// { dg-do compile { target c++11 } }
> > +// { dg-additional-options "-Wno-error" }
> > +
> > +// { dg-error "narrowing" "" { target *-*-* } 2 }
> > +#include "sys-narrow.h"
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1c.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1c.C
> > new file mode 100644
> > index 00000000000..1243eb00eef
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1c.C
> > @@ -0,0 +1,5 @@
> > +// { dg-do compile { target c++11 } }
> > +// { dg-additional-options "-Wno-error=narrowing" }
> > +
> > +// No diagnostic.
> > +#include "sys-narrow.h"
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1d.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1d.C
> > new file mode 100644
> > index 00000000000..0653df9c238
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1d.C
> > @@ -0,0 +1,5 @@
> > +// { dg-do compile { target c++11 } }
> > +// { dg-options "-fpermissive" }
> > +
> > +// No diagnostic.
> > +#include "sys-narrow.h"
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1e.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1e.C
> > new file mode 100644
> > index 00000000000..d2198298e7c
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1e.C
> > @@ -0,0 +1,5 @@
> > +// { dg-do compile { target c++11 } }
> > +// { dg-options "-fpermissive -Wsystem-headers" }
> > +
> > +// { dg-warning "narrowing" "" { target *-*-* } 2 }
> > +#include "sys-narrow.h"
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1f.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1f.C
> > new file mode 100644
> > index 00000000000..28f7fe2e84c
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1f.C
> > @@ -0,0 +1,5 @@
> > +// { dg-do compile { target c++11 } }
> > +// { dg-options "-Wno-narrowing" }
> > +
> > +// No diagnostic
> > +#include "sys-narrow.h"
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1g.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1g.C
> > new file mode 100644
> > index 00000000000..d052beab031
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1g.C
> > @@ -0,0 +1,5 @@
> > +// { dg-do compile { target c++11 } }
> > +// { dg-options "-Wno-error=narrowing -Wsystem-headers" }
> > +
> > +// { dg-warning "narrowing" "" { target *-*-* } 2 }
> > +#include "sys-narrow.h"
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1h.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1h.C
> > new file mode 100644
> > index 00000000000..e96ee1fc134
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1h.C
> > @@ -0,0 +1,6 @@
> > +// { dg-do compile { target c++11 } }
> > +// { dg-options "-Wno-error=narrowing -w" }
> > +
> > +// No diagnostic
> > +int i = { 2.4 }; // C++11 error: narrowing conversion
> > +
> > diff --git a/gcc/testsuite/g++.dg/diagnostic/sys-narrow1i.C 
> > b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1i.C
> > new file mode 100644
> > index 00000000000..f7d958548cf
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/diagnostic/sys-narrow1i.C
> > @@ -0,0 +1,6 @@
> > +// { dg-do compile { target c++11 } }
> > +// { dg-options "-fpermissive -w" }
> > +
> > +// No diagnostic
> > +int i = { 2.4 }; // C++11 error: narrowing conversion
> > +
> > diff --git a/gcc/testsuite/g++.dg/ext/integer-pack2.C 
> > b/gcc/testsuite/g++.dg/ext/integer-pack2.C
> > index 406e195574c..fa6a8813368 100644
> > --- a/gcc/testsuite/g++.dg/ext/integer-pack2.C
> > +++ b/gcc/testsuite/g++.dg/ext/integer-pack2.C
> > @@ -1,5 +1,5 @@
> >   // { dg-do compile { target { c++11 && int32 } } }
> > -// { dg-options -w }
> > +// { dg-options "-fpermissive -w" }
> >
> >   template<typename T, T...> struct integer_sequence { };
> >   template<typename T, T num>
> >
> > base-commit: 41d1c9a97953b457146c1dbeea2a4f19bfbb0b6e
>

Reply via email to