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
best regards, Julian 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 > >>>> > >>> > >> > > >