diff options
author | mikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-02-12 15:46:14 +0000 |
---|---|---|
committer | mikael <mikael@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-02-12 15:46:14 +0000 |
commit | 14957629ce851d15710486d4a0bd02a74e13df03 (patch) | |
tree | c1cb93e2a76a420c680b028bbe93cbcd49005b9b /gcc/fortran | |
parent | ff32eb637977f436f83fd2284bc7894f3f76497b (diff) | |
download | gcc-14957629ce851d15710486d4a0bd02a74e13df03.tar.gz |
gcc/fortran/
PR fortran/50981
* trans-stmt.c (gfc_get_proc_ifc_for_call): New function.
(gfc_trans_call): Use gfc_get_proc_ifc_for_call.
gcc/testsuite/
PR fortran/50981
* gfortran.dg/elemental_optional_args_5.f03: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184142 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-stmt.c | 23 |
2 files changed, 28 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 19db403dbf9..defca3f3512 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,11 @@ 2012-02-12 Mikael Morin <mikael@gcc.gnu.org> + PR fortran/50981 + * trans-stmt.c (gfc_get_proc_ifc_for_call): New function. + (gfc_trans_call): Use gfc_get_proc_ifc_for_call. + +2012-02-12 Mikael Morin <mikael@gcc.gnu.org> + * trans-array.c (gfc_walk_elemental_function_args, gfc_walk_function_expr): Move call to gfc_get_proc_ifc_for_expr out of gfc_walk_elemental_function_args. diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index bad0459d3e1..bb3a89084e0 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -348,6 +348,27 @@ gfc_conv_elemental_dependencies (gfc_se * se, gfc_se * loopse, } +/* Get the interface symbol for the procedure corresponding to the given call. + We can't get the procedure symbol directly as we have to handle the case + of (deferred) type-bound procedures. */ + +static gfc_symbol * +get_proc_ifc_for_call (gfc_code *c) +{ + gfc_symbol *sym; + + gcc_assert (c->op == EXEC_ASSIGN_CALL || c->op == EXEC_CALL); + + sym = gfc_get_proc_ifc_for_expr (c->expr1); + + /* Fall back/last resort try. */ + if (sym == NULL) + sym = c->resolved_sym; + + return sym; +} + + /* Translate the CALL statement. Builds a call to an F95 subroutine. */ tree @@ -372,7 +393,7 @@ gfc_trans_call (gfc_code * code, bool dependency_check, ss = gfc_ss_terminator; if (code->resolved_sym->attr.elemental) ss = gfc_walk_elemental_function_args (ss, code->ext.actual, - gfc_get_proc_ifc_for_expr (code->expr1), + get_proc_ifc_for_call (code), GFC_SS_REFERENCE); /* Is not an elemental subroutine call with array valued arguments. */ |