aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorJosé Rui Faustino de Sousa <jrfsousa@gmail.com>2021-04-28 11:20:25 +0000
committerJosé Rui Faustino de Sousa <jrfsousa@gmail.com>2021-04-28 11:20:25 +0000
commitb020cee5af4cb40b9971bfb943d7bd2795b2a3eb (patch)
tree48d6bd53ac6db605935d1f01f665a7f3cccb1242 /gcc/fortran
parentea3d2e3c164cb4a32f5c82aa49693de260db3501 (diff)
downloadgcc-b020cee5af4cb40b9971bfb943d7bd2795b2a3eb.zip
gcc-b020cee5af4cb40b9971bfb943d7bd2795b2a3eb.tar.gz
gcc-b020cee5af4cb40b9971bfb943d7bd2795b2a3eb.tar.bz2
Fortran: Fix double function call with -fcheck=pointer [PR]
gcc/fortran/ChangeLog: PR fortran/82376 * trans-expr.c (gfc_conv_procedure_call): Evaluate function result and then pass a pointer. gcc/testsuite/ChangeLog: PR fortran/82376 * gfortran.dg/PR82376.f90: New test.
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/trans-expr.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 213f32b..b83b021 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -6014,11 +6014,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
|| (!e->value.function.esym
&& e->symtree->n.sym->attr.pointer))
&& fsym && fsym->attr.target)
- {
- gfc_conv_expr (&parmse, e);
- parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
- }
-
+ /* Make sure the function only gets called once. */
+ gfc_conv_expr_reference (&parmse, e, false);
else if (e->expr_type == EXPR_FUNCTION
&& e->symtree->n.sym->result
&& e->symtree->n.sym->result != e->symtree->n.sym