From 0ca3fb0a168e9db2bd5405855d3932f62b08b7c9 Mon Sep 17 00:00:00 2001 From: "Kaveh R. Ghazi" Date: Tue, 20 Oct 1998 07:32:08 +0000 Subject: [PATCH] New warning, `missing-noreturn': * c-decl.c (warn_missing_noreturn): New global variable. (c_decode_option): Check for new flags -W{no-}missing-noreturn. (finish_function): Implement missing noreturn warning. * c-tree.h (warn_missing_noreturn): Declare extern. * invoke.texi: Document new flags. * toplev.c (documented_lang_options): Add description. From-SVN: r23197 --- gcc/ChangeLog | 12 ++++++++++++ gcc/c-decl.c | 14 ++++++++++++++ gcc/c-tree.h | 4 ++++ gcc/invoke.texi | 9 ++++++++- gcc/toplev.c | 3 +++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a532b2a..6a6280d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +Tue Oct 20 10:12:17 1998 Kaveh R. Ghazi + + * c-decl.c (warn_missing_noreturn): New global variable. + (c_decode_option): Check for new flags -W{no-}missing-noreturn. + (finish_function): Implement missing noreturn warning. + + * c-tree.h (warn_missing_noreturn): Declare extern. + + * invoke.texi: Document new flags. + + * toplev.c (documented_lang_options): Add description. + Tue Oct 20 22:16:11 1998 Michael Hayes * config/c4x/c4x.c (c4x_parallel_process): Disable until BCT diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 1cf5b45..df102ac 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -515,6 +515,10 @@ int warn_cast_qual; int warn_bad_function_cast; +/* Warn about functions which might be candidates for attribute noreturn. */ + +int warn_missing_noreturn; + /* Warn about traditional constructs whose meanings changed in ANSI C. */ int warn_traditional; @@ -728,6 +732,10 @@ c_decode_option (argc, argv) warn_bad_function_cast = 1; else if (!strcmp (p, "-Wno-bad-function-cast")) warn_bad_function_cast = 0; + else if (!strcmp (p, "-Wmissing-noreturn")) + warn_missing_noreturn = 1; + else if (!strcmp (p, "-Wno-missing-noreturn")) + warn_missing_noreturn = 0; else if (!strcmp (p, "-Wpointer-arith")) warn_pointer_arith = 1; else if (!strcmp (p, "-Wno-pointer-arith")) @@ -7192,6 +7200,12 @@ finish_function (nested) current_function_returns_null |= can_reach_end; + if (warn_missing_noreturn + && !TREE_THIS_VOLATILE (fndecl) + && !current_function_returns_null + && !current_function_returns_value) + warning ("function might be possible candidate for attribute `noreturn'"); + if (TREE_THIS_VOLATILE (fndecl) && current_function_returns_null) warning ("`noreturn' function does return"); else if (warn_return_type && can_reach_end diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 3e73299..fec60cb 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -469,6 +469,10 @@ extern int warn_cast_qual; extern int warn_bad_function_cast; +/* Warn about functions which might be candidates for attribute noreturn. */ + +extern int warn_missing_noreturn; + /* Warn about traditional constructs whose meanings changed in ANSI C. */ extern int warn_traditional; diff --git a/gcc/invoke.texi b/gcc/invoke.texi index cf46198..f6ecd64 100644 --- a/gcc/invoke.texi +++ b/gcc/invoke.texi @@ -123,7 +123,7 @@ in the following sections. -Wimplicit-function-declaration -Wimport -Werror-implicit-function-declaration -Winline -Wlarger-than-@var{len} -Wlong-long --Wmain -Wmissing-declarations +-Wmain -Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes -Wmultichar -Wnested-externs -Wno-import -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wparentheses -Wpointer-arith -Wredundant-decls -Wreorder @@ -1617,6 +1617,13 @@ Do so even if the definition itself provides a prototype. Use this option to detect global functions that are not declared in header files. +@item -Wmissing-noreturn +Warn about functions which might be candidates for attribute @code{noreturn}. +Note these are only possible candidates, not absolute ones. Care should +be taken to manually verify functions actually do not ever return before +adding the @code{noreturn} attribute, otherwise subtle code generation +bugs could be introduced. + @item -Wredundant-decls Warn if anything is declared more than once in the same scope, even in cases where multiple declaration is valid and changes nothing. diff --git a/gcc/toplev.c b/gcc/toplev.c index 8ad8eeb..5040987 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -974,6 +974,9 @@ documented_lang_options[] = { "-Wbad-function-cast", "Warn about casting functions to incompatible types" }, { "-Wno-bad-function-cast", "" }, + { "-Wmissing-noreturn", + "Warn about functions which might be candidates for attribute noreturn" }, + { "-Wno-missing-noreturn", "" }, { "-Wcast-qual", "Warn about casts which discard qualifiers"}, { "-Wno-cast-qual", "" }, { "-Wchar-subscripts", "Warn about subscripts whose type is 'char'"}, -- 2.7.4