Hi Harald,
unfortunately, your email did not arrive at fort...@gcc.gnu.org – nor at my
private address.
I copied it from
https://gcc.gnu.org/pipermail/gcc-patches/2021-October/580794.html
You wrote:
>/I do not see this error. Can you double check that you indeed use the />/posted patch: />//>/https://gcc.gnu.org/pipermail/gcc-patches/2021-September/580483.html
<https://gcc.gnu.org/pipermail/gcc-patches/2021-September/580483.html> – />/and nothing else, e.g., an earlier draft? /
Sandra is right. Actually I do see that regression, too.
The default initialization is missing in F1, see dump-tree:
Look as if I had attached the first/interim version of the patch –
which lacked what I wrote in the patch submission at:
https://gcc.gnu.org/pipermail/gcc-patches/2021-September/580483.html
Namely, I wrote:
Regarding the patch, '!= IFSRC_IFBODY' has to be used; "== IFSRC_DECL"
won't work as the the generatedy ENTRY master function has IFSRC_UNKNOWN.
Thus, no surprise that it passes here – while you see the fail.
Tobias
Fortran: Avoid var initialization in interfaces [PR54753]
Intent(out) implies deallocation/default initialization; however, it is
pointless to do this for dummy-arguments symbols of procedures which are
inside an INTERFACE block. – This also fixes a bogus error for the attached
included testcase, but fixing the non-interface version still has to be done.
PR fortran/54753
gcc/fortran/ChangeLog:
* resolve.c (can_generate_init, resolve_fl_variable_derived,
resolve_symbol): Only do initialization with intent(out) if not
inside of an interface block.
gcc/testsuite/ChangeLog:
* gfortran.dg/assumed_rank_23.f90: New test.
gcc/fortran/resolve.c | 11 ++++++++---
gcc/testsuite/gfortran.dg/assumed_rank_23.f90 | 16 ++++++++++++++++
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 30b96b2f597..511fe3a5e55 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -12676,7 +12676,8 @@ can_generate_init (gfc_symbol *sym)
|| a->cray_pointer
|| sym->assoc
|| (!a->referenced && !a->result)
- || (a->dummy && a->intent != INTENT_OUT)
+ || (a->dummy && (a->intent != INTENT_OUT
+ || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY))
|| (a->function && sym != sym->result)
);
}
@@ -12913,7 +12914,9 @@ resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag)
/* Assign default initializer. */
if (!(sym->value || sym->attr.pointer || sym->attr.allocatable)
- && (!no_init_flag || sym->attr.intent == INTENT_OUT))
+ && (!no_init_flag
+ || (sym->attr.intent == INTENT_OUT
+ && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY)))
sym->value = gfc_generate_initializer (&sym->ts, can_generate_init (sym));
return true;
@@ -16154,7 +16157,8 @@ resolve_symbol (gfc_symbol *sym)
|| sym->ts.u.derived->attr.alloc_comp
|| sym->ts.u.derived->attr.pointer_comp))
&& !(a->function && sym != sym->result))
- || (a->dummy && a->intent == INTENT_OUT && !a->pointer))
+ || (a->dummy && !a->pointer && a->intent == INTENT_OUT
+ && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY))
apply_default_init (sym);
else if (a->function && sym->result && a->access != ACCESS_PRIVATE
&& (sym->ts.u.derived->attr.alloc_comp
@@ -16166,6 +16170,7 @@ resolve_symbol (gfc_symbol *sym)
if (sym->ts.type == BT_CLASS && sym->ns == gfc_current_ns
&& sym->attr.dummy && sym->attr.intent == INTENT_OUT
+ && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY
&& !CLASS_DATA (sym)->attr.class_pointer
&& !CLASS_DATA (sym)->attr.allocatable)
apply_default_init (sym);
diff --git a/gcc/testsuite/gfortran.dg/assumed_rank_23.f90 b/gcc/testsuite/gfortran.dg/assumed_rank_23.f90
new file mode 100644
index 00000000000..c83aa7de1a3
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/assumed_rank_23.f90
@@ -0,0 +1,16 @@
+! { dg-do compile }
+!
+! PR fortran/54753
+! TS29113:C535c
+! F2018:C839
+!
+module m
+
+ interface
+ subroutine s1 (x, y)
+ class(*) :: x(..)
+ class(*), intent (out) :: y(..)
+ end subroutine
+ end interface
+
+end module