From: Tobias Burnus Date: Mon, 4 Oct 2021 07:41:13 +0000 (+0200) Subject: Fortran: Avoid var initialization in interfaces [PR54753] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c003c9c010a29ee910f8395138d2dff9ec35ddb;p=thirdparty%2Fgcc.git 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. (cherry picked from commit 51d9ef7747b2dc439f7456303f0784faf5cdb1d3) --- diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index a7de91c6b311..1832730d20fb 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -12677,7 +12677,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) ); } @@ -12914,7 +12915,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; @@ -16155,7 +16158,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 @@ -16167,6 +16171,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 000000000000..c83aa7de1a39 --- /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 diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp index ca5014c3993c..9d1afda94da3 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,3 +1,13 @@ +2021-10-04 Tobias Burnus + + Backported from master: + 2021-10-04 Tobias Burnus + + * testsuite/libgomp.fortran/order-reproducible-1.f90: New test + based on libgomp.c-c++-common/order-reproducible-1.c. + * testsuite/libgomp.fortran/order-reproducible-2.f90: Likewise. + * testsuite/libgomp.fortran/my-usleep.c: New test. + 2021-10-02 Tobias Burnus Backported from master: