aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>1998-10-20 07:32:08 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>1998-10-20 07:32:08 +0000
commit0ca3fb0a168e9db2bd5405855d3932f62b08b7c9 (patch)
tree3a1a6a1311b867a1768dacc4273f79b79d375b1f /gcc
parentf1c374cbf13459be57011c157b5ebba66cc1e02d (diff)
downloadgcc-0ca3fb0a168e9db2bd5405855d3932f62b08b7c9.zip
gcc-0ca3fb0a168e9db2bd5405855d3932f62b08b7c9.tar.gz
gcc-0ca3fb0a168e9db2bd5405855d3932f62b08b7c9.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/c-decl.c14
-rw-r--r--gcc/c-tree.h4
-rw-r--r--gcc/invoke.texi9
-rw-r--r--gcc/toplev.c3
5 files changed, 41 insertions, 1 deletions
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 <ghazi@caip.rutgers.edu>
+
+ * 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 <m.hayes@elec.canterbury.ac.nz>
* 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'"},