Darn, not even sending it from my friend's mail account worked to combat the patch formatting issues. Not only is the patch a complete wreck on the mailing list archive, but my friend's mail account has now somehow merged into mine on the list, resulting in a truly confusing author display name. I really hope you've somehow gotten the patch intact on your end...
best regards, Julian On Fri, Jul 19, 2024 at 11:47 AM Tay Joseph <tanksherma...@gmail.com> wrote: > Hi Jason, > > > > I’ve managed to address your review comments, and rewrite the patch to > include both -Winvalid-noreturn and -Winvalid-noreturn= but have trouble > figuring out how to format invoke.texi and where to add the documentation > for the new warning options. I’ve also made this a Common option, since > it’s come to my attention that the warning is not specific to c-family, but > is also used by other languages too (See tree-cfg.cc). Here’s the current > version of the patch, hope it’s good to go this time > > > > best regards, > > Julian > > > > From fe1b4d5747e05101410b6bb6db9430362e3977d9 Mon Sep 17 00:00:00 2001 > > From: Julian Waters <tanksherma...@gmail.com> > > Date: Fri, 19 Jul 2024 11:22:38 +0800 > > Subject: [PATCH] Introduce the -Winvalid-noreturn flag from clang with > extra > > tuneability > > > > Currently, gcc warns about noreturn marked functions that return both > explicitly and implicitly, with no way to turn this warning off. clang does > have an option for these classes of warnings, -Winvalid-noreturn. However, > we can do better. Instead of just having 1 option that switches the > warnings for both on and off, we can define an extra layer of granularity, > and have a separate options for implicit returns and explicit returns, as > in -Winvalid-return=explicit and -Winvalid-noreturn=implicit, on top of the > regular -Winvalid-noreturn. This patch adds both to gcc, for compatibility > with clang. > > > > gcc/ChangeLog: > > > > * common.opt: Introduce -Winvalid-noreturn and -Winvalid-noreturn= > > * opts.cc (common_handle_option): Handle new option > > * flag-types.h: New flags for -Winvalid-noreturn= > > * tree-cfg.cc (pass_warn_function_return::execute): Use it > > > > gcc/c/ChangeLog: > > > > * c-typeck.cc (c_finish_return): Use it > > * gimple-parser.cc (c_finish_gimple_return): Use it > > > > gcc/config/mingw/ChangeLog: > > > > * mingw32.h (EXTRA_OS_CPP_BUILTINS): Fix semicolons > > > > gcc/cp/ChangeLog: > > > > * coroutines.cc (finish_co_return_stmt): Use it > > * typeck.cc (check_return_expr): Use it > > > > Signed-off-by: Julian Waters <tanksherma...@gmail.com> > > --- > > gcc/c/c-typeck.cc | 4 ++-- > > gcc/c/gimple-parser.cc | 4 ++-- > > gcc/common.opt | 13 +++++++++++++ > > gcc/config/mingw/mingw32.h | 6 +++--- > > gcc/cp/coroutines.cc | 4 ++-- > > gcc/cp/typeck.cc | 4 ++-- > > gcc/flag-types.h | 7 +++++++ > > gcc/opts.cc | 19 +++++++++++++++++++ > > gcc/tree-cfg.cc | 3 ++- > > 9 files changed, 52 insertions(+), 12 deletions(-) > > > > diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc > > index 7e0f01ed22b..0f8c8cfff2e 100644 > > --- a/gcc/c/c-typeck.cc > > +++ b/gcc/c/c-typeck.cc > > @@ -11738,8 +11738,8 @@ c_finish_return (location_t loc, tree retval, tree > origtype) > > in a function returning void. */ > > location_t xloc = expansion_point_location_if_in_system_header (loc); > > - if (TREE_THIS_VOLATILE (current_function_decl)) > > - warning_at (xloc, 0, > > + if (TREE_THIS_VOLATILE (current_function_decl) && flag_invalid_noreturn > != invalid_noreturn_kind::EXPLICIT) > > + warning_at (xloc, OPT_Winvalid_noreturn, > > "function declared %<noreturn%> has a %<return%> > statement"); > > if (retval) > > diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc > > index d156d83cd37..8a684fe334a 100644 > > --- a/gcc/c/gimple-parser.cc > > +++ b/gcc/c/gimple-parser.cc > > @@ -2592,8 +2592,8 @@ c_finish_gimple_return (location_t loc, tree retval) > > in a function returning void. */ > > location_t xloc = expansion_point_location_if_in_system_header (loc); > > - if (TREE_THIS_VOLATILE (current_function_decl)) > > - warning_at (xloc, 0, > > + if (TREE_THIS_VOLATILE (current_function_decl) && flag_invalid_noreturn > != invalid_noreturn_kind::EXPLICIT) > > + warning_at (xloc, OPT_Winvalid_noreturn, > > "function declared %<noreturn%> has a %<return%> > statement"); > > if (! retval) > > diff --git a/gcc/common.opt b/gcc/common.opt > > index ea39f87ae71..d44ff0231c3 100644 > > --- a/gcc/common.opt > > +++ b/gcc/common.opt > > @@ -94,6 +94,11 @@ void *flag_instrument_functions_exclude_files > > Variable > > void *flag_ignored_attributes > > +; The noreturn kind to ignore when warning for noreturn code that > > +; does return. > > +Variable > > +invalid_noreturn_kind flag_invalid_noreturn = invalid_noreturn_kind::NONE > > + > > ; Generic structs (e.g. templates not explicitly specialized) > > ; may not have a compilation unit associated with them, and so > > ; may need to be treated differently from ordinary structs. > > @@ -667,6 +672,14 @@ Winvalid-memory-model > > Common Var(warn_invalid_memory_model) Init(1) Warning > > Warn when an atomic memory model parameter is known to be outside the > valid range. > > +Winvalid-noreturn > > +Common Warning > > +Warn when code marked noreturn returns implicitly and/or explicitly. > > + > > +Winvalid-noreturn= > > +Common Joined Warning > > +Warn when code marked noreturn returns in the manner specified. > > + > > Wlarger-than- > > Common RejectNegative Joined Warning Undocumented Alias(Wlarger-than=) > > diff --git a/gcc/config/mingw/mingw32.h b/gcc/config/mingw/mingw32.h > > index 0dfe8e995b6..48eadfa2c2c 100644 > > --- a/gcc/config/mingw/mingw32.h > > +++ b/gcc/config/mingw/mingw32.h > > @@ -35,9 +35,9 @@ along with GCC; see the file COPYING3. If not see > > | MASK_MS_BITFIELD_LAYOUT) > > #ifdef TARGET_USING_MCFGTHREAD > > -#define DEFINE_THREAD_MODEL builtin_define ("__USING_MCFGTHREAD__"); > > +#define DEFINE_THREAD_MODEL builtin_define ("__USING_MCFGTHREAD__") > > #elif defined(TARGET_USE_PTHREAD_BY_DEFAULT) > > -#define DEFINE_THREAD_MODEL builtin_define ("__USING_POSIXTHREAD__"); > > +#define DEFINE_THREAD_MODEL builtin_define ("__USING_POSIXTHREAD__") > > #else > > #define DEFINE_THREAD_MODEL > > #endif > > @@ -60,7 +60,7 @@ along with GCC; see the file COPYING3. If not see > > builtin_define_std > ("WIN64"); \ > > builtin_define ("_WIN64"); > \ > > > } > \ > > - DEFINE_THREAD_MODEL \ > > + > DEFINE_THREAD_MODEL; \ > > > } > \ > > while (0) > > diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc > > index f350fc33e9b..f49ff82b1ee 100644 > > --- a/gcc/cp/coroutines.cc > > +++ b/gcc/cp/coroutines.cc > > @@ -1374,8 +1374,8 @@ finish_co_return_stmt (location_t kw, tree expr) > > } > > /* Makes no sense for a co-routine really. */ > > - if (TREE_THIS_VOLATILE (current_function_decl)) > > - warning_at (kw, 0, > > + if (TREE_THIS_VOLATILE (current_function_decl) && flag_invalid_noreturn > != invalid_noreturn_kind::EXPLICIT) > > + warning_at (kw, OPT_Winvalid_noreturn, > > "function declared %<noreturn%> has a" > > " %<co_return%> statement"); > > diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc > > index 8df8b871676..260a9f99b08 100644 > > --- a/gcc/cp/typeck.cc > > +++ b/gcc/cp/typeck.cc > > @@ -11080,8 +11080,8 @@ check_return_expr (tree retval, bool *no_warning, > bool *dangling) > > /* A `volatile' function is one that isn't supposed to return, ever. > > (This is a G++ extension, used to get better code for functions > > that call the `volatile' function.) */ > > - if (TREE_THIS_VOLATILE (current_function_decl)) > > - warning (0, "function declared %<noreturn%> has a %<return%> > statement"); > > + if (TREE_THIS_VOLATILE (current_function_decl) && flag_invalid_noreturn > != invalid_noreturn_kind::EXPLICIT) > > + warning (OPT_Winvalid_noreturn, "function declared %<noreturn%> has a > %<return%> statement"); > > /* Check for various simple errors. */ > > if (DECL_DESTRUCTOR_P (current_function_decl)) > > diff --git a/gcc/flag-types.h b/gcc/flag-types.h > > index 1e497f0bb91..591acd2a7d2 100644 > > --- a/gcc/flag-types.h > > +++ b/gcc/flag-types.h > > @@ -375,6 +375,13 @@ enum incremental_link { > > INCREMENTAL_LINK_LTO > > }; > > +/* Kind of noreturn to ignore when reporting invalid noreturns */ > > +enum class invalid_noreturn_kind { > > + NONE, > > + IMPLICIT, > > + EXPLICIT > > +}; > > + > > /* Different trace modes. */ > > enum sanitize_coverage_code { > > /* Trace PC. */ > > diff --git a/gcc/opts.cc b/gcc/opts.cc > > index be90a632338..19d31c262d7 100644 > > --- a/gcc/opts.cc > > +++ b/gcc/opts.cc > > @@ -2860,6 +2860,25 @@ common_handle_option (struct gcc_options *opts, > > dc->m_fatal_errors = value; > > break; > > + case OPT_Winvalid_noreturn_: > > + if (lang_mask == CL_DRIVER) > > + break; > > + > > + if (value) > > + warning (0, "%<-Winvalid-noreturn=%> is enabled by default, > ignoring"); > > + else if (strcmp (arg, "explicit")) > > + { > > + opts->x_flag_invalid_noreturn = > invalid_noreturn_kind::EXPLICIT; > > + } > > + else if (strcmp (arg, "implicit")) > > + { > > + opts->x_flag_invalid_noreturn = > invalid_noreturn_kind::IMPLICIT; > > + } > > + else > > + error_at (loc, "Unknown option for %<-Winvalid-noreturn=%>"); > > + > > + break; > > + > > case OPT_Wstack_usage_: > > opts->x_flag_stack_usage_info = value != -1; > > break; > > diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc > > index e6fd1294b95..f28dabc2bbf 100644 > > --- a/gcc/tree-cfg.cc > > +++ b/gcc/tree-cfg.cc > > @@ -9820,7 +9820,8 @@ pass_warn_function_return::execute (function *fun) > > } > > if (location == UNKNOWN_LOCATION) > > location = cfun->function_end_locus; > > - warning_at (location, 0, "%<noreturn%> function does return"); > > + if (flag_invalid_noreturn != invalid_noreturn_kind::IMPLICIT) > > + warning_at (location, 0, "%<noreturn%> function does return"); > > } > > /* If we see "return;" in some basic block, then we do reach the end > > -- > > 2.45.1 > > > > > > Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for > Windows > > > > *From: *Jason Merrill <ja...@redhat.com> > *Sent: *Thursday, 18 July 2024 3:27 am > *To: *Julian Waters <tanksherma...@gmail.com>; gcc-patches@gcc.gnu.org > *Subject: *Re: [PATCH] c-family: Introduce the -Winvalid-noreturn flag > from clang with extra tuneability > > > > On 7/9/24 6:46 AM, Julian Waters wrote: > > > Hi Jason, > > > > > > Sorry for the long period of radio silence, but I'm finally done with > > > all my university coursework. The main issue I see here is how to > > > process the Winvalid-noreturn= entry. Can I define it in c.opt and > > > then process it in c_common_handle_option and then store whether the > > > -W or -Wno form was used in a bool somewhere? If I can do that > > > somehow, and then access the bool at the callsites where it is > > > required, I can figure out the rest on my own > > > > You should be able to handle setting the variable entirely in c.opt, > > following the pattern of -fstrong-eval-order. The variable is defined > > by the Var(...) notation in c.opt, and the opts code handles setting it. > > > > > On Tue, Jun 11, 2024 at 10:26 AM Jason Merrill <ja...@redhat.com> wrote: > > >> > > >> On 6/10/24 03:13, Julian Waters wrote: > > >>> Hi Jason, > > >>> > > >>> Thanks for the reply. I'm a little bit overwhelmed with university at > > >>> the moment, would it be ok if I delay implementing this a little bit? > > >> > > >> Sure, we're still early in GCC 15 development, no time pressure. > > >> > > >>> On Tue, Jun 4, 2024 at 1:04 AM Jason Merrill <ja...@redhat.com> wrote: > > >>>> > > >>>> On 6/1/24 11:31, Julian Waters wrote: > > >>>>> Hi Jason, > > >>>>> > > >>>>> Thanks for the reply! I'll address your comments soon. I have a > > >>>>> question, if there is an option defined in c.opt as an Enum, like > > >>>>> fstrong-eval-order, and the -no variant of the option is passed, > would > > >>>>> the Var somehow reflect the negated option? Eg > > >>>>> > > >>>>> Winvalid-noreturn= > > >>>>> C ObjC C++ ObjC++ Var(warn_invalid_noreturn) Joined > > >>>>> Enum(invalid_noreturn) Warning > > >>>>> > > >>>>> Enum > > >>>>> Name(invalid_noreturn) Type(int) > > >>>>> > > >>>>> EnumValue > > >>>>> Enum(invalid_noreturn) String(explicit) Value(0) > > >>>> > > >>>> -fstrong-eval-order has > > >>>> > > >>>> fstrong-eval-order > > >>>> C++ ObjC++ Common Alias(fstrong-eval-order=, all, none) > > >>>> > > >>>> to represent that plain -fstrong-eval-order is equivalent to > > >>>> -fstrong-eval-order=all, and -fno-strong-eval-order is equivalent to > =none. > > >>>> > > >>>>> Would warn_invalid_noreturn then != 0 if > > >>>>> -Wno-invalid-noreturn=explicit is passed? Or is there a way to make a > > >>>>> warning call depend on 2 different OPT_ entries? > > >>>> > > >>>> Typically = options will specify RejectNegative so the driver will > > >>>> reject e.g. -Wno-invalid-noreturn=explicit. > > >>>> > > >>>> Jason > > >>>> > > >>>>> best regards, > > >>>>> Julian > > >>>>> > > >>>>> On Sat, Jun 1, 2024 at 4:57 AM Jason Merrill <ja...@redhat.com> > wrote: > > >>>>>> > > >>>>>> On 5/29/24 09:58, Julian Waters wrote: > > >>>>>>> Currently, gcc warns about noreturn marked functions that return > both explicitly and implicitly, with no way to turn this warning off. clang > does have an option for these classes of warnings, -Winvalid-noreturn. > However, we can do better. Instead of just having 1 option that switches > the warnings for both on and off, we can define an extra layer of > granularity, and have a separate options for implicit returns and explicit > returns, as in -Winvalid-return=explicit and -Winvalid-noreturn=implicit. > This patch adds both to gcc, for compatibility with clang. > > >>>>>> > > >>>>>> Thanks! > > >>>>>> > > >>>>>>> Do note that I am relatively new to gcc's codebase, and as such > couldn't figure out how to cleanly define a general -Winvalid-noreturn > warning that switch both on and off, for better compatibility with clang. > If someone should point out how to do so, I'll happily rewrite my patch. > > >>>>>> > > >>>>>> See -fstrong-eval-order for an example of an option that can be used > > >>>>>> with or without =arg. > > >>>>>> > > >>>>>>> I also do not have write access to gcc, and will need help pushing > this patch once the green light is given > > >>>>>> > > >>>>>> Good to know, I can take care of that. > > >>>>>> > > >>>>>>> best regards, > > >>>>>>> Julian > > >>>>>>> > > >>>>>>> gcc/c-family/ChangeLog: > > >>>>>>> > > >>>>>>> * c.opt: Introduce -Winvalid-noreturn=explicit and > -Winvalid-noreturn=implicit > > >>>>>>> > > >>>>>>> gcc/ChangeLog: > > >>>>>>> > > >>>>>>> * tree-cfg.cc (pass_warn_function_return::execute): Use it > > >>>>>>> > > >>>>>>> gcc/c/ChangeLog: > > >>>>>>> > > >>>>>>> * c-typeck.cc (c_finish_return): Use it > > >>>>>>> * gimple-parser.cc (c_finish_gimple_return): Use it > > >>>>>>> > > >>>>>>> gcc/config/mingw/ChangeLog: > > >>>>>>> > > >>>>>>> * mingw32.h (EXTRA_OS_CPP_BUILTINS): Fix semicolons > > >>>>>>> > > >>>>>>> gcc/cp/ChangeLog: > > >>>>>>> > > >>>>>>> * coroutines.cc (finish_co_return_stmt): Use it > > >>>>>>> * typeck.cc (check_return_expr): Use it > > >>>>>>> > > >>>>>>> gcc/doc/ChangeLog: > > >>>>>>> > > >>>>>>> * invoke.texi: Document new options > > >>>>>>> > > >>>>>>> From 4daf884f8bbc1e318ba93121a6fdf4139da80b64 Mon Sep 17 > 00:00:00 2001 > > >>>>>>> From: TheShermanTanker <tanksherma...@gmail.com> > > >>>>>>> Date: Wed, 29 May 2024 21:32:08 +0800 > > >>>>>>> Subject: [PATCH] Introduce the -Winvalid-noreturn flag from clang > with extra > > >>>>>>> tuneability > > >>>>>> > > >>>>>> The rationale and ChangeLog entries should be part of the commit > message > > >>>>>> (and so the git format-patch output). > > >>>>>> > > >>>>>>> > > >>>>>>> Signed-off-by: TheShermanTanker <tanksherma...@gmail.com> > > >>>>>> > > >>>>>> A DCO sign-off can't use a pseudonym, sorry; please either sign off > > >>>>>> using your real name or file a copyright assignment for the > pseudonym > > >>>>>> with the FSF. > > >>>>>> > > >>>>>> See https://gcc.gnu.org/contribute.html#legal for more detail. > > >>>>>> > > >>>>>>> --- > > >>>>>>> gcc/c-family/c.opt | 8 ++++++++ > > >>>>>>> gcc/c/c-typeck.cc | 2 +- > > >>>>>>> gcc/c/gimple-parser.cc | 2 +- > > >>>>>>> gcc/config/mingw/mingw32.h | 6 +++--- > > >>>>>>> gcc/cp/coroutines.cc | 2 +- > > >>>>>>> gcc/cp/typeck.cc | 2 +- > > >>>>>>> gcc/doc/invoke.texi | 13 +++++++++++++ > > >>>>>>> gcc/tree-cfg.cc | 2 +- > > >>>>>>> 8 files changed, 29 insertions(+), 8 deletions(-) > > >>>>>>> > > >>>>>>> diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt > > >>>>>>> index fb34c3b7031..32a2859fdcc 100644 > > >>>>>>> --- a/gcc/c-family/c.opt > > >>>>>>> +++ b/gcc/c-family/c.opt > > >>>>>>> @@ -886,6 +886,14 @@ Winvalid-constexpr > > >>>>>>> C++ ObjC++ Var(warn_invalid_constexpr) Init(-1) Warning > > >>>>>>> Warn when a function never produces a constant expression. > > >>>>>>> > > >>>>>>> +Winvalid-noreturn=explicit > > >>>>>>> +C ObjC C++ ObjC++ Warning > > >>>>>>> +Warn when a function marked noreturn returns explicitly. > > >>>>>>> + > > >>>>>>> +Winvalid-noreturn=implicit > > >>>>>>> +C ObjC C++ ObjC++ Warning > > >>>>>>> +Warn when a function marked noreturn returns implicitly. > > >>>>>>> + > > >>>>>>> Winvalid-offsetof > > >>>>>>> C++ ObjC++ Var(warn_invalid_offsetof) Init(1) Warning > > >>>>>>> Warn about invalid uses of the \"offsetof\" macro. > > >>>>>>> diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc > > >>>>>>> index ad4c7add562..1941fbc44cb 100644 > > >>>>>>> --- a/gcc/c/c-typeck.cc > > >>>>>>> +++ b/gcc/c/c-typeck.cc > > >>>>>>> @@ -11468,7 +11468,7 @@ c_finish_return (location_t loc, tree > retval, tree origtype) > > >>>>>>> location_t xloc = > expansion_point_location_if_in_system_header (loc); > > >>>>>>> > > >>>>>>> if (TREE_THIS_VOLATILE (current_function_decl)) > > >>>>>>> - warning_at (xloc, 0, > > >>>>>>> + warning_at (xloc, OPT_Winvalid_noreturn_explicit, > > >>>>>>> "function declared %<noreturn%> has a %<return%> > statement"); > > >>>>>>> > > >>>>>>> if (retval) > > >>>>>>> diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc > > >>>>>>> index d156d83cd37..1acaf75f844 100644 > > >>>>>>> --- a/gcc/c/gimple-parser.cc > > >>>>>>> +++ b/gcc/c/gimple-parser.cc > > >>>>>>> @@ -2593,7 +2593,7 @@ c_finish_gimple_return (location_t loc, tree > retval) > > >>>>>>> location_t xloc = > expansion_point_location_if_in_system_header (loc); > > >>>>>>> > > >>>>>>> if (TREE_THIS_VOLATILE (current_function_decl)) > > >>>>>>> - warning_at (xloc, 0, > > >>>>>>> + warning_at (xloc, OPT_Winvalid_noreturn_explicit, > > >>>>>>> "function declared %<noreturn%> has a %<return%> > statement"); > > >>>>>>> > > >>>>>>> if (! retval) > > >>>>>>> diff --git a/gcc/config/mingw/mingw32.h > b/gcc/config/mingw/mingw32.h > > >>>>>>> index fa6e307476c..a69926133b1 100644 > > >>>>>>> --- a/gcc/config/mingw/mingw32.h > > >>>>>>> +++ b/gcc/config/mingw/mingw32.h > > >>>>>>> @@ -35,9 +35,9 @@ along with GCC; see the file COPYING3. If not > see > > >>>>>>> | MASK_MS_BITFIELD_LAYOUT) > > >>>>>>> > > >>>>>>> #ifdef TARGET_USING_MCFGTHREAD > > >>>>>>> -#define DEFINE_THREAD_MODEL builtin_define > ("__USING_MCFGTHREAD__"); > > >>>>>>> +#define DEFINE_THREAD_MODEL builtin_define > ("__USING_MCFGTHREAD__") > > >>>>>>> #elif defined(TARGET_USE_PTHREAD_BY_DEFAULT) > > >>>>>>> -#define DEFINE_THREAD_MODEL builtin_define > ("__USING_POSIXTHREAD__"); > > >>>>>>> +#define DEFINE_THREAD_MODEL builtin_define > ("__USING_POSIXTHREAD__") > > >>>>>>> #else > > >>>>>>> #define DEFINE_THREAD_MODEL > > >>>>>>> #endif > > >>>>>>> @@ -60,7 +60,7 @@ along with GCC; see the file COPYING3. If not > see > > >>>>>>> builtin_define_std ("WIN64"); \ > > >>>>>>> builtin_define ("_WIN64"); \ > > >>>>>>> } \ > > >>>>>>> - DEFINE_THREAD_MODEL \ > > >>>>>>> + DEFINE_THREAD_MODEL; \ > > >>>>>>> > } \ > > >>>>>>> while (0) > > >>>>>>> > > >>>>>>> diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc > > >>>>>>> index 97bc211ff67..53e56bd4959 100644 > > >>>>>>> --- a/gcc/cp/coroutines.cc > > >>>>>>> +++ b/gcc/cp/coroutines.cc > > >>>>>>> @@ -1375,7 +1375,7 @@ finish_co_return_stmt (location_t kw, tree > expr) > > >>>>>>> > > >>>>>>> /* Makes no sense for a co-routine really. */ > > >>>>>>> if (TREE_THIS_VOLATILE (current_function_decl)) > > >>>>>>> - warning_at (kw, 0, > > >>>>>>> + warning_at (kw, OPT_Winvalid_noreturn_explicit, > > >>>>>>> "function declared %<noreturn%> has a" > > >>>>>>> " %<co_return%> statement"); > > >>>>>>> > > >>>>>>> diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc > > >>>>>>> index 1b7a31d32f3..74cc59bfb87 100644 > > >>>>>>> --- a/gcc/cp/typeck.cc > > >>>>>>> +++ b/gcc/cp/typeck.cc > > >>>>>>> @@ -11062,7 +11062,7 @@ check_return_expr (tree retval, bool > *no_warning, bool *dangling) > > >>>>>>> (This is a G++ extension, used to get better code for > functions > > >>>>>>> that call the `volatile' function.) */ > > >>>>>>> if (TREE_THIS_VOLATILE (current_function_decl)) > > >>>>>>> - warning (0, "function declared %<noreturn%> has a %<return%> > statement"); > > >>>>>>> + warning (OPT_Winvalid_noreturn_explicit, "function declared > %<noreturn%> has a %<return%> statement"); > > >>>>>>> > > >>>>>>> /* Check for various simple errors. */ > > >>>>>>> if (DECL_DESTRUCTOR_P (current_function_decl)) > > >>>>>>> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > > >>>>>>> index 2cba380718b..27d880fd4f0 100644 > > >>>>>>> --- a/gcc/doc/invoke.texi > > >>>>>>> +++ b/gcc/doc/invoke.texi > > >>>>>>> @@ -376,6 +376,7 @@ Objective-C and Objective-C++ Dialects}. > > >>>>>>> -Winfinite-recursion > > >>>>>>> -Winit-self -Winline -Wno-int-conversion > -Wint-in-bool-context > > >>>>>>> -Wno-int-to-pointer-cast -Wno-invalid-memory-model > > >>>>>>> +-Winvalid-noreturn=explicit -Winvalid-noreturn=implicit > > >>>>>>> -Winvalid-pch -Winvalid-utf8 -Wno-unicode > -Wjump-misses-init > > >>>>>>> -Wlarger-than=@var{byte-size} -Wlogical-not-parentheses > -Wlogical-op > > >>>>>>> -Wlong-long -Wno-lto-type-mismatch -Wmain > -Wmaybe-uninitialized > > >>>>>>> @@ -10482,6 +10483,18 @@ an error. @option{Wint-to-pointer-cast} > is enabled by default. > > >>>>>>> Suppress warnings from casts from a pointer to an integer > type of a > > >>>>>>> different size. > > >>>>>>> > > >>>>>>> +@opindex Winvalid-noreturn=explicit > > >>>>>>> +@opindex Wno-invalid-noreturn=explicit > > >>>>>>> +@item -Winvalid-noreturn=explicit > > >>>>>>> +Warn if a function marked noreturn returns explicitly, that is, it > > >>>>>>> +contains a return statement. > > >>>>>>> + > > >>>>>>> +@opindex Winvalid-noreturn=implicit > > >>>>>>> +@opindex Wno-invalid-noreturn=implicit > > >>>>>>> +@item -Winvalid-noreturn=implicit > > >>>>>>> +Warn if a function marked noreturn returns implicitly, that is, it > > >>>>>>> +has a path in its control flow that can reach the end of its body. > > >>>>>>> + > > >>>>>>> @opindex Winvalid-pch > > >>>>>>> @opindex Wno-invalid-pch > > >>>>>>> @item -Winvalid-pch > > >>>>>>> diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc > > >>>>>>> index 7fb7b92966b..cfe91038dd1 100644 > > >>>>>>> --- a/gcc/tree-cfg.cc > > >>>>>>> +++ b/gcc/tree-cfg.cc > > >>>>>>> @@ -9817,7 +9817,7 @@ pass_warn_function_return::execute (function > *fun) > > >>>>>>> } > > >>>>>>> if (location == UNKNOWN_LOCATION) > > >>>>>>> location = cfun->function_end_locus; > > >>>>>>> - warning_at (location, 0, "%<noreturn%> function does > return"); > > >>>>>>> + warning_at (location, OPT_Winvalid_noreturn_implicit, > "%<noreturn%> function does return"); > > >>>>>>> } > > >>>>>>> > > >>>>>>> /* If we see "return;" in some basic block, then we do > reach the end > > >>>>>> > > >>>>> > > >>>> > > >>> > > >> > > > > > > > >