On 11/15/2017 10:42 AM, Eric Botcazou wrote: >> But we don't. Wonder if in addition to your patch or instead of it it >> wouldn't be safer (especially for FEs added in the future) to: >> >> /* If we see "return;" in some basic block, then we do reach the end >> without returning a value. */ >> - else if (warn_return_type >> + else if (warn_return_type > 0 >> && !TREE_NO_WARNING (fun->decl) >> && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) > 0 >> && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fun->decl)))) >> >> in tree-cfg.c. That change is preapproved if it works, and your >> patch if you want in addition to that is ok too. > > That's the first thing I tried and it indeed works. >
Hi. Following patch survives regression tests and bootstraps. There are multiple places where warn_return_type should be compared to zero. Ready for trunk? Thanks, Martin
>From 5f8daccc584c7ae749d25d59526e0173aa4334f7 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Wed, 15 Nov 2017 09:16:23 +0100 Subject: [PATCH] Disable -Wreturn-type by default in all languages other from C++. gcc/ChangeLog: 2017-11-15 Martin Liska <mli...@suse.cz> * tree-cfg.c (pass_warn_function_return::execute): Compare warn_return_type for greater than zero. gcc/ada/ChangeLog: 2017-11-15 Martin Liska <mli...@suse.cz> * gcc-interface/misc.c (gnat_post_options): Do not set default value of warn_return_type. gcc/c/ChangeLog: 2017-11-15 Martin Liska <mli...@suse.cz> * c-decl.c (grokdeclarator): Compare warn_return_type for greater than zero. (start_function): Likewise. (finish_function): Likewise. * c-typeck.c (c_finish_return): Likewise. gcc/cp/ChangeLog: 2017-11-15 Martin Liska <mli...@suse.cz> * decl.c (finish_function): Compare warn_return_type for greater than zero. * semantics.c (finish_return_stmt): Likewise. gcc/fortran/ChangeLog: 2017-11-15 Martin Liska <mli...@suse.cz> * options.c (gfc_post_options): Do not set default value of warn_return_type. * trans-decl.c (gfc_trans_deferred_vars): Compare warn_return_type for greater than zero. (generate_local_decl): Likewise (gfc_generate_function_code): Likewise. --- gcc/ada/gcc-interface/misc.c | 3 --- gcc/c/c-decl.c | 6 +++--- gcc/c/c-typeck.c | 2 +- gcc/cp/decl.c | 2 +- gcc/cp/semantics.c | 2 +- gcc/fortran/options.c | 3 --- gcc/fortran/trans-decl.c | 8 ++++---- gcc/tree-cfg.c | 2 +- 8 files changed, 11 insertions(+), 17 deletions(-) diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index 9a4a48fba42..7bdb3803c13 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -262,9 +262,6 @@ gnat_post_options (const char **pfilename ATTRIBUTE_UNUSED) /* No psABI change warnings for Ada. */ warn_psabi = 0; - /* No return type warnings for Ada. */ - warn_return_type = 0; - /* No caret by default for Ada. */ if (!global_options_set.x_flag_diagnostics_show_caret) global_dc->show_caret = false; diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index d95a2b6ea4f..7120420f2df 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -5689,7 +5689,7 @@ grokdeclarator (const struct c_declarator *declarator, /* Issue a warning if this is an ISO C 99 program or if -Wreturn-type and this is a function, or if -Wimplicit; prefer the former warning since it is more explicit. */ - if ((warn_implicit_int || warn_return_type || flag_isoc99) + if ((warn_implicit_int || warn_return_type > 0 || flag_isoc99) && funcdef_flag) warn_about_return_type = 1; else @@ -8655,7 +8655,7 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator, if (warn_about_return_type) warn_defaults_to (loc, flag_isoc99 ? OPT_Wimplicit_int - : (warn_return_type ? OPT_Wreturn_type + : (warn_return_type > 0 ? OPT_Wreturn_type : OPT_Wimplicit_int), "return type defaults to %<int%>"); @@ -9373,7 +9373,7 @@ finish_function (void) finish_fname_decls (); /* Complain if there's just no return statement. */ - if (warn_return_type + if (warn_return_type > 0 && TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE && !current_function_returns_value && !current_function_returns_null /* Don't complain if we are no-return. */ diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 4bdc48a9ea3..492a245d296 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -10091,7 +10091,7 @@ c_finish_return (location_t loc, tree retval, tree origtype) if (!retval) { current_function_returns_null = 1; - if ((warn_return_type || flag_isoc99) + if ((warn_return_type > 0 || flag_isoc99) && valtype != NULL_TREE && TREE_CODE (valtype) != VOID_TYPE) { bool warned_here; diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 041893db937..96bbff6c1f9 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -15583,7 +15583,7 @@ finish_function (bool inline_p) save_function_data (fndecl); /* Complain if there's just no return statement. */ - if (warn_return_type + if (warn_return_type > 0 && !VOID_TYPE_P (TREE_TYPE (fntype)) && !dependent_type_p (TREE_TYPE (fntype)) && !current_function_returns_value && !current_function_returns_null diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 51489d17ad5..cbb395e3f61 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -890,7 +890,7 @@ finish_return_stmt (tree expr) || (flag_openmp && !check_omp_return ())) { /* Suppress -Wreturn-type for this function. */ - if (warn_return_type) + if (warn_return_type > 0) TREE_NO_WARNING (current_function_decl) = true; return error_mark_node; } diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c index c584a19e559..0ee6b7808d9 100644 --- a/gcc/fortran/options.c +++ b/gcc/fortran/options.c @@ -435,9 +435,6 @@ gfc_post_options (const char **pfilename) gfc_fatal_error ("Maximum subrecord length cannot exceed %d", MAX_SUBRECORD_LENGTH); - if (warn_return_type == -1) - warn_return_type = 0; - gfc_cpp_post_options (); if (gfc_option.allow_std & GFC_STD_F2008) diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 8efaae79ebc..60e7d8f79ee 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -4198,7 +4198,7 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block) break; } /* TODO: move to the appropriate place in resolve.c. */ - if (warn_return_type && el == NULL) + if (warn_return_type > 0 && el == NULL) gfc_warning (OPT_Wreturn_type, "Return value of function %qs at %L not set", proc_sym->name, &proc_sym->declared_at); @@ -5619,7 +5619,7 @@ generate_local_decl (gfc_symbol * sym) else if (sym->attr.flavor == FL_PROCEDURE) { /* TODO: move to the appropriate place in resolve.c. */ - if (warn_return_type + if (warn_return_type > 0 && sym->attr.function && sym->result && sym != sym->result @@ -6494,11 +6494,11 @@ gfc_generate_function_code (gfc_namespace * ns) if (result == NULL_TREE || artificial_result_decl) { /* TODO: move to the appropriate place in resolve.c. */ - if (warn_return_type && sym == sym->result) + if (warn_return_type > 0 && sym == sym->result) gfc_warning (OPT_Wreturn_type, "Return value of function %qs at %L not set", sym->name, &sym->declared_at); - if (warn_return_type) + if (warn_return_type > 0) TREE_NO_WARNING(sym->backend_decl) = 1; } if (result != NULL_TREE) diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 9a2fa1d98ca..f08a0547f0f 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -9071,7 +9071,7 @@ pass_warn_function_return::execute (function *fun) /* If we see "return;" in some basic block, then we do reach the end without returning a value. */ - else if (warn_return_type + else if (warn_return_type > 0 && !TREE_NO_WARNING (fun->decl) && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) > 0 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fun->decl)))) -- 2.14.3