Committed as r14-2022-g577223aebc7acdd31e62b33c1682fe54a622ae27 Thanks for the help and the review Harald. Thanks to Steve too for picking up Neil Carlson's bugs.
Cheers Paul On Tue, 20 Jun 2023 at 22:57, Harald Anlauf <anl...@gmx.de> wrote: > > Hi Paul, > > On 6/20/23 12:54, Paul Richard Thomas via Gcc-patches wrote: > > Hi Harald, > > > > Fixing the original testcase in this PR turned out to be slightly more > > involved than I expected. However, it resulted in an open door to fix > > some other PRs and the attached much larger patch. > > > > This time, I did remember to include the testcases in the .diff :-) > > indeed! :-) > > I've only had a superficial look so far although it looks very good. > (I have to trust your experience with unlimited polymorphism.) > > However, I was wondering about the following helper function: > > +bool > +gfc_is_ptr_fcn (gfc_expr *e) > +{ > + return e != NULL && e->expr_type == EXPR_FUNCTION > + && (gfc_expr_attr (e).pointer > + || (e->ts.type == BT_CLASS > + && CLASS_DATA (e)->attr.class_pointer)); > +} > + > + > /* Copy a shape array. */ > > Is there a case where gfc_expr_attr (e).pointer returns false > and you really need the || part? Looking at gfc_expr_attr > and the present context, it might just not be necessary. > > > I believe that, between the Change.Logs and the comments, it is > > reasonably self-explanatory. > > > > OK for trunk? > > OK from my side. > > Thanks for the patch! > > Harald > > > Regards > > > > Paul > > > > Fortran: Fix some bugs in associate [PR87477] > > > > 2023-06-20 Paul Thomas <pa...@gcc.gnu.org> > > > > gcc/fortran > > PR fortran/87477 > > PR fortran/88688 > > PR fortran/94380 > > PR fortran/107900 > > PR fortran/110224 > > * decl.cc (char_len_param_value): Fix memory leak. > > (resolve_block_construct): Remove unnecessary static decls. > > * expr.cc (gfc_is_ptr_fcn): New function. > > (gfc_check_vardef_context): Use it to permit pointer function > > result selectors to be used for associate names in variable > > definition context. > > * gfortran.h: Prototype for gfc_is_ptr_fcn. > > * match.cc (build_associate_name): New function. > > (gfc_match_select_type): Use the new function to replace inline > > version and to build a new associate name for the case where > > the supplied associate name is already used for that purpose. > > * resolve.cc (resolve_assoc_var): Call gfc_is_ptr_fcn to allow > > associate names with pointer function targets to be used in > > variable definition context. > > * trans-decl.cc (gfc_get_symbol_decl): Unlimited polymorphic > > variables need deferred initialisation of the vptr. > > (gfc_trans_deferred_vars): Do the vptr initialisation. > > * trans-stmt.cc (trans_associate_var): Ensure that a pointer > > associate name points to the target of the selector and not > > the selector itself. > > > > gcc/testsuite/ > > PR fortran/87477 > > PR fortran/107900 > > * gfortran.dg/pr107900.f90 : New test > > > > PR fortran/110224 > > * gfortran.dg/pr110224.f90 : New test > > > > PR fortran/88688 > > * gfortran.dg/pr88688.f90 : New test > > > > PR fortran/94380 > > * gfortran.dg/pr94380.f90 : New test > > > > PR fortran/95398 > > * gfortran.dg/pr95398.f90 : Set -std=f2008, bump the line > > numbers in the error tests by two and change the text in two. > -- "If you can't explain it simply, you don't understand it well enough" - Albert Einstein