diff options
author | Daniel Franke <franke.daniel@gmail.com> | 2008-02-28 15:22:55 -0500 |
---|---|---|
committer | Daniel Franke <dfranke@gcc.gnu.org> | 2008-02-28 15:22:55 -0500 |
commit | 766d0c8c4401b260163f0895c69dbc88eb421a87 (patch) | |
tree | f84b1022377b8110b6bff00c5391be2d07e74321 /gcc/fortran/trans-decl.c | |
parent | 4613543f827f21ebc28da9ba2fba4cee24b43c5e (diff) | |
download | gcc-766d0c8c4401b260163f0895c69dbc88eb421a87.zip gcc-766d0c8c4401b260163f0895c69dbc88eb421a87.tar.gz gcc-766d0c8c4401b260163f0895c69dbc88eb421a87.tar.bz2 |
re PR fortran/31463 ([patch] inconsistent warnings if function return value is not set)
gcc/fortran:
2008-02-28 Daniel Franke <franke.daniel@gmail.com>
PR fortran/31463
PR fortran/33950
PR fortran/34296
* lang.opt: Added -Wreturn-type.
* options.c (gfc_handle_option): Recognize -Wreturn-type.
* trans-decl.c (gfc_trans_deferred_vars): Emit warnings for funtions
where the result value is not set.
(gfc_generate_function_code): Likewise.
(generate_local_decl): Emit warnings for funtions whose RESULT
variable is not set.
gcc/testsuite:
2008-02-28 Daniel Franke <franke.daniel@gmail.com>
PR fortran/31463
PR fortran/33950
PR fortran/34296
* gfortran.dg/arrayio_11.f90: Fixed test.
* gfortran.dg/arrayio_12.f90: Likewise.
* gfortran.dg/module_read_1.f90: Added warning-directives.
* gfortran.dg/pr32242.f90: Likewise.
* gfortran.dg/result_in_spec_3.f90: Likewise.
* gfortran.dg/use_12.f90: Likewise.
* gfortran.dg/warn_function_without_result.f90 : New test.
From-SVN: r132756
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index bf07a88..6f430cb 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -2607,8 +2607,10 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, tree fnbody) if (el->sym != el->sym->result) break; } - if (el == NULL) - warning (0, "Function does not return a value"); + /* TODO: move to the appropriate place in resolve.c. */ + if (warn_return_type && el == NULL) + gfc_warning ("Return value of function '%s' at %L not set", + proc_sym->name, &proc_sym->declared_at); } else if (proc_sym->as) { @@ -2952,7 +2954,7 @@ generate_local_decl (gfc_symbol * sym) /* Warn for unused variables, but not if they're inside a common block or are use-associated. */ else if (warn_unused_variable - && !(sym->attr.in_common || sym->attr.use_assoc)) + && !(sym->attr.in_common || sym->attr.use_assoc || sym->mark)) gfc_warning ("Unused variable '%s' declared at %L", sym->name, &sym->declared_at); /* For variable length CHARACTER parameters, the PARM_DECL already @@ -2982,6 +2984,25 @@ generate_local_decl (gfc_symbol * sym) gfc_warning ("Unused parameter '%s' declared at %L", sym->name, &sym->declared_at); } + else if (sym->attr.flavor == FL_PROCEDURE) + { + /* TODO: move to the appropriate place in resolve.c. */ + if (warn_return_type + && sym->attr.function + && sym->result + && sym != sym->result + && !sym->result->attr.referenced + && !sym->attr.use_assoc + && sym->attr.if_source != IFSRC_IFBODY) + { + gfc_warning ("Return value '%s' of function '%s' declared at " + "%L not set", sym->result->name, sym->name, + &sym->result->declared_at); + + /* Prevents "Unused variable" warning for RESULT variables. */ + sym->mark = sym->result->mark = 1; + } + } if (sym->attr.dummy == 1) { @@ -3275,10 +3296,17 @@ gfc_generate_function_code (gfc_namespace * ns) gfc_add_expr_to_block (&block, tmp2); } - gfc_add_expr_to_block (&block, tmp); + gfc_add_expr_to_block (&block, tmp); + + if (result == NULL_TREE) + { + /* TODO: move to the appropriate place in resolve.c. */ + if (warn_return_type && !sym->attr.referenced && sym == sym->result) + gfc_warning ("Return value of function '%s' at %L not set", + sym->name, &sym->declared_at); - if (result == NULL_TREE) - warning (0, "Function return value not set"); + TREE_NO_WARNING(sym->backend_decl) = 1; + } else { /* Set the return value to the dummy result variable. The |