diff options
author | Jakub Jelinek <jakub@redhat.com> | 2006-03-13 22:44:04 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-03-13 22:44:04 +0100 |
commit | 11a5f60849d2c6b080eac43e496ffec1b3e93219 (patch) | |
tree | a57d6f733c78bc82586aadfe97600fb307eae75f /gcc/fortran/trans-openmp.c | |
parent | 4b8ae4dbb7b517474580c4e7a6f15fb4c8bb3e8d (diff) | |
download | gcc-11a5f60849d2c6b080eac43e496ffec1b3e93219.zip gcc-11a5f60849d2c6b080eac43e496ffec1b3e93219.tar.gz gcc-11a5f60849d2c6b080eac43e496ffec1b3e93219.tar.bz2 |
trans-openmp.c (gfc_trans_omp_variable): Handle references to parent result.
* trans-openmp.c (gfc_trans_omp_variable): Handle references
to parent result.
* trans-expr.c (gfc_conv_variable): Remove useless setting
of parent_flag, formatting.
* testsuite/libgomp.fortran/retval2.f90: New test.
From-SVN: r112026
Diffstat (limited to 'gcc/fortran/trans-openmp.c')
-rw-r--r-- | gcc/fortran/trans-openmp.c | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index df8723b..56d8829 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -182,40 +182,56 @@ gfc_trans_add_clause (tree node, tree tail) return node; } -/* TODO make references to parent function results, as done in - gfc_conv_variable. */ - static tree gfc_trans_omp_variable (gfc_symbol *sym) { tree t = gfc_get_symbol_decl (sym); + tree parent_decl; + int parent_flag; + bool return_value; + bool alternate_entry; + bool entry_master; + + return_value = sym->attr.function && sym->result == sym; + alternate_entry = sym->attr.function && sym->attr.entry + && sym->result == sym; + entry_master = sym->attr.result + && sym->ns->proc_name->attr.entry_master + && !gfc_return_by_reference (sym->ns->proc_name); + parent_decl = DECL_CONTEXT (current_function_decl); + + if ((t == parent_decl && return_value) + || (sym->ns && sym->ns->proc_name + && sym->ns->proc_name->backend_decl == parent_decl + && (alternate_entry || entry_master))) + parent_flag = 1; + else + parent_flag = 0; /* Special case for assigning the return value of a function. Self recursive functions must have an explicit return value. */ - if (t == current_function_decl && sym->attr.function - && (sym->result == sym)) - t = gfc_get_fake_result_decl (sym, 0); + if (return_value && (t == current_function_decl || parent_flag)) + t = gfc_get_fake_result_decl (sym, parent_flag); /* Similarly for alternate entry points. */ - else if (sym->attr.function && sym->attr.entry - && (sym->result == sym) - && sym->ns->proc_name->backend_decl == current_function_decl) + else if (alternate_entry + && (sym->ns->proc_name->backend_decl == current_function_decl + || parent_flag)) { gfc_entry_list *el = NULL; for (el = sym->ns->entries; el; el = el->next) if (sym == el->sym) { - t = gfc_get_fake_result_decl (sym, 0); + t = gfc_get_fake_result_decl (sym, parent_flag); break; } } - else if (sym->attr.result - && sym->ns->proc_name->backend_decl == current_function_decl - && sym->ns->proc_name->attr.entry_master - && !gfc_return_by_reference (sym->ns->proc_name)) - t = gfc_get_fake_result_decl (sym, 0); + else if (entry_master + && (sym->ns->proc_name->backend_decl == current_function_decl + || parent_flag)) + t = gfc_get_fake_result_decl (sym, parent_flag); return t; } @@ -408,7 +424,7 @@ gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where) static tree gfc_trans_omp_reduction_list (gfc_namelist *namelist, tree list, - enum tree_code reduction_code, locus where) + enum tree_code reduction_code, locus where) { for (; namelist != NULL; namelist = namelist->next) if (namelist->sym->attr.referenced) |