Hi Harald, (Written 17th but left in intray by mistake.) Thanks for the review. I will make sure that the intended changes are incorporated. I haven't applied it yet because I was so heavily engaged in trying to make two pass parsing work that I didn't want the interruption. As it happens, it was obvious by yesterday that it was going to be considerably more difficult than I anticipated. I have posted the patch to PR89645, together with a list of testsuite failures. Many of these are so obscure that I didn't have any idea how to put them right. I reverted to the fix-up patch and, having come at it with fresh eyes, have fixed the problems that I was having with it. It is regesting as I write. My order of work between now and the Christmas break is: 1] Apply the agreed patch for PR112459; -now done 2] -ditto- for PR112834; -now done 3] Generate testcases for PR89645 and all its variants (especially with class replacing derived types); and 4] Prepare the whole lot for submission to the list. My local test for PR87477 now shows " 43 successes out of 43 tests" :-) Regards Paul On Wed, 6 Dec 2023 at 19:35, Harald Anlauf wrote: > Hi Paul, > > On 12/6/23 17:09, Paul Richard Thomas wrote: > > Dear All, > > > > This patch was rescued from my ill-fated and long winded attempt to > provide > > a fix-up for function selector references, where the function is parsed > > after the procedure containing the associate/select type construct (PRs > > 89645 and 99065). The fix-ups broke down completely once these constructs > > were enclosed by another associate construct, where the selector is a > > derived type or class function. My inclination now is to introduce two > pass > > parsing for contained procedures. > > > > Returning to PR112834, the patch is simple enough and is well described > by > > the change logs. PR111853 was fixed as a side effect of the bigger patch. > > Steve Kargl had also posted the same fix on the PR. > > the patch looks good, but could you please check the coding style? > > @@ -6550,7 +6551,19 @@ select_type_set_tmp (gfc_typespec *ts) > sym = tmp->n.sym; > gfc_add_type (sym, ts, NULL); > > - if (selector->ts.type == BT_CLASS && selector->attr.class_ok > + /* If the SELECT TYPE selector is a function we might be able to > obtain > + a typespec from the result. Since the function might not have been > + parsed yet we have to check that there is indeed a result > symbol. */ > + if (selector->ts.type == BT_UNKNOWN > + && gfc_state_stack->construct > + && (expr2 = gfc_state_stack->construct->expr2) > + && expr2->expr_type == EXPR_FUNCTION > + && expr2->symtree > + && expr2->symtree->n.sym && expr2->symtree->n.sym->result) > > Adding a line break before the second '&&' makes it more readable. > > + selector->ts = expr2->symtree->n.sym->result->ts; > > @@ -2037,7 +2038,12 @@ trans_associate_var (gfc_symbol *sym, > gfc_wrapped_block *block) > > /* Class associate-names come this way because they are > unconditionally associate pointers and the symbol is scalar. */ > - if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->attr.dimension) > + if (sym->ts.type == BT_CLASS && e->expr_type ==EXPR_FUNCTION) > > There should be whitespace before AND after '=='. > > + { > + gfc_conv_expr (&se, e); > + se.expr = gfc_evaluate_now (se.expr, &se.pre); > + } > + else if (sym->ts.type == BT_CLASS && CLASS_DATA > (sym)->attr.dimension) > > > Regression tests - OK for trunk and 13-branch? > > > > Paul > > > > Thanks for the patch! > > Harald > >