diff options
author | Tobias Burnus <burnus@gcc.gnu.org> | 2009-03-28 15:04:14 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2009-03-28 15:04:14 +0100 |
commit | 43998ed92e06a48a1d52a37536fcc609ab2a608d (patch) | |
tree | f7ba51c41dbc70d06547423c13013047c63f8adc /gcc/fortran/trans-decl.c | |
parent | dc186969b5524ab768c53c2e2f226bf24d0a35f8 (diff) | |
download | gcc-43998ed92e06a48a1d52a37536fcc609ab2a608d.zip gcc-43998ed92e06a48a1d52a37536fcc609ab2a608d.tar.gz gcc-43998ed92e06a48a1d52a37536fcc609ab2a608d.tar.bz2 |
re PR fortran/32626 (Run-time check for recursive functions)
2009-03-28 Tobias Burnus <burnus@net-b.de>
PR fortran/32626
* option.c (gfc_handle_runtime_check_option): Enable recursion check.
* trans-decl.c (gfc_generate_function_code): Add recursion check.
* invoke.texi (-fcheck): Add recursive option.
From-SVN: r145188
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index d3895d8..6cfc86a 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -3679,6 +3679,7 @@ gfc_generate_function_code (gfc_namespace * ns) stmtblock_t block; stmtblock_t body; tree result; + tree recurcheckvar = NULL; gfc_symbol *sym; int rank; @@ -3846,6 +3847,22 @@ gfc_generate_function_code (gfc_namespace * ns) gfc_add_expr_to_block (&body, tmp); } + if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION) && !sym->attr.recursive) + { + char * msg; + + asprintf (&msg, "Recursive call to nonrecursive procedure '%s'", + sym->name); + recurcheckvar = gfc_create_var (boolean_type_node, "is_recursive"); + TREE_STATIC (recurcheckvar) = 1; + DECL_INITIAL (recurcheckvar) = boolean_false_node; + gfc_add_expr_to_block (&block, recurcheckvar); + gfc_trans_runtime_check (true, false, recurcheckvar, &block, + &sym->declared_at, msg); + gfc_add_modify (&block, recurcheckvar, boolean_true_node); + gfc_free (msg); + } + if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node && sym->attr.subroutine) { @@ -3924,6 +3941,9 @@ gfc_generate_function_code (gfc_namespace * ns) else gfc_add_expr_to_block (&block, tmp); + /* Reset recursion-check variable. */ + if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION) && !sym->attr.recursive) + gfc_add_modify (&block, recurcheckvar, boolean_false_node); /* Add all the decls we created during processing. */ decl = saved_function_decls; |