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

--- Comment #5 from adrien.hamelin at gmail dot com ---
The noexcept(false) is just to be extra obvious, we see the same behaviour
if we don't mark the function at all.


Regards,
Adrien Hamelin

Le mar. 25 juin 2019 à 14:30, redi at gcc dot gnu.org <
gcc-bugzi...@gcc.gnu.org> a écrit :

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90992
>
> --- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
> This suppresses the second warning if the first is suppressed:
>
> --- a/gcc/cp/except.c
> +++ b/gcc/cp/except.c
> @@ -1158,11 +1158,11 @@ maybe_noexcept_warning (tree fn)
>  {
>    if (TREE_NOTHROW (fn))
>      {
> -      warning (OPT_Wnoexcept, "noexcept-expression evaluates to %<false%>
> "
> -              "because of a call to %qD", fn);
> -      warning_at (DECL_SOURCE_LOCATION (fn), OPT_Wnoexcept,
> -                 "but %qD does not throw; perhaps "
> -                 "it should be declared %<noexcept%>", fn);
> +      if (warning (OPT_Wnoexcept, "noexcept-expression evaluates to
> %<false%>
> "
> +                  "because of a call to %qD", fn))
> +       warning_at (DECL_SOURCE_LOCATION (fn), OPT_Wnoexcept,
> +                   "but %qD does not throw; perhaps "
> +                   "it should be declared %<noexcept%>", fn);
>      }
>  }
>
>
>
> And this makes the first warning depend on whether the second one is in a
> system header:
>
> --- a/gcc/cp/except.c
> +++ b/gcc/cp/except.c
> @@ -1158,11 +1158,20 @@ maybe_noexcept_warning (tree fn)
>  {
>    if (TREE_NOTHROW (fn))
>      {
> +      location_t loc = DECL_SOURCE_LOCATION (fn);
> +
> +      const bool warn_in_system_headers =
> global_dc->dc_warn_system_headers;
> +      if (in_system_header_at (input_location) && !in_system_header_at
> (loc)
> +         && !warn_in_system_headers)
> +       global_dc->dc_warn_system_headers = 1;
>        warning (OPT_Wnoexcept, "noexcept-expression evaluates to %<false%>
> "
>                "because of a call to %qD", fn);
> -      warning_at (DECL_SOURCE_LOCATION (fn), OPT_Wnoexcept,
> +      warning_at (loc, OPT_Wnoexcept,
>                   "but %qD does not throw; perhaps "
>                   "it should be declared %<noexcept%>", fn);
> +      if (in_system_header_at (input_location) && !in_system_header_at
> (loc)
> +         && !warn_in_system_headers)
> +       global_dc->dc_warn_system_headers = 0;
>      }
>  }
>
>
> I don't know which of these is preferable, because I'm not sure if the
> point of
> the warning is to suggest changing Automatic, or the code in the system
> header.
>
> Tangentially, maybe the warning should not be given when a function is
> explicitly marked noexcept(false). That's not the same as an implicit
> potentially-throwing exception specification, and presumably the author did
> that for a reason.
>
> --
> You are receiving this mail because:
> You reported the bug.

Reply via email to