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-expr.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-expr.c')
| -rw-r--r-- | gcc/fortran/trans-expr.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 890b880..783583c 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -324,34 +324,31 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr) /* Deal with references to a parent results or entries by storing the current_function_decl and moving to the parent_decl. */ - parent_flag = 0; - return_value = sym->attr.function && sym->result == sym; alternate_entry = sym->attr.function && sym->attr.entry - && sym->result == sym; + && sym->result == sym; entry_master = sym->attr.result - && sym->ns->proc_name->attr.entry_master - && !gfc_return_by_reference (sym->ns->proc_name); + && sym->ns->proc_name->attr.entry_master + && !gfc_return_by_reference (sym->ns->proc_name); parent_decl = DECL_CONTEXT (current_function_decl); if ((se->expr == parent_decl && return_value) - || (sym->ns && sym->ns->proc_name - && sym->ns->proc_name->backend_decl == parent_decl - && (alternate_entry || entry_master))) + || (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 (sym->attr.function && sym->result == sym - && (se->expr == current_function_decl || parent_flag)) + if (return_value && (se->expr == current_function_decl || parent_flag)) se_expr = gfc_get_fake_result_decl (sym, parent_flag); /* Similarly for alternate entry points. */ else if (alternate_entry - && (sym->ns->proc_name->backend_decl == current_function_decl - || parent_flag)) + && (sym->ns->proc_name->backend_decl == current_function_decl + || parent_flag)) { gfc_entry_list *el = NULL; @@ -364,8 +361,8 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr) } else if (entry_master - && (sym->ns->proc_name->backend_decl == current_function_decl - || parent_flag)) + && (sym->ns->proc_name->backend_decl == current_function_decl + || parent_flag)) se_expr = gfc_get_fake_result_decl (sym, parent_flag); if (se_expr) |
