Hi Mikael, Am 08.11.22 um 11:32 schrieb Mikael Morin: > this is mostly good. > There is one last corner case that is not properly handled: > >> diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc >> index 63515b9072a..94988b8690e 100644 >> --- a/gcc/fortran/trans-decl.cc >> +++ b/gcc/fortran/trans-decl.cc > (...) >> @@ -2619,6 +2620,15 @@ create_function_arglist (gfc_symbol * sym) >>      if (f->sym != NULL)    /* Ignore alternate returns.  */ >>        hidden_typelist = TREE_CHAIN (hidden_typelist); >> >> +  /* Advance hidden_typelist over optional+value argument presence >> flags.  */ >> +  optval_typelist = hidden_typelist; >> +  for (f = gfc_sym_get_dummy_args (sym); f; f = f->next) >> +    if (f->sym != NULL >> +    && f->sym->attr.optional && f->sym->attr.value >> +    && !f->sym->attr.dimension && f->sym->ts.type != BT_CLASS >> +    && !gfc_bt_struct (f->sym->ts.type)) >> +      hidden_typelist = TREE_CHAIN (hidden_typelist); >> + > > This new loop copies the condition guarding the handling of optional > value presence arguments, except that the condition is in an "else if", > and the complement of the condition in the corresponding "if" is > missing, to have strictly the same conditions. I know, and I left that intentionally, as it is related to PR107444, assuming that it doesn't lead to a new ICE. Bad idea. > Admittedly, it only makes a difference for character optional value > arguments, which are hardly working.  At least they work as long as one > doesn't try to query their presence.  Below is a case regressing with > your patch. > With that fixed, I think it's good for mainline. > Thanks for your patience. > > > ! { dg-do compile } > ! > ! PR fortran/107441 > ! Check that procedure types and procedure decls match when the procedure > ! has both character-typed and character-typed optional value args. > ! > ! Contributed by M.Morin > > program p >   interface >     subroutine i(c, o) >       character(*) :: c >       character(3), optional, value :: o >     end subroutine i >   end interface >   procedure(i), pointer :: pp >   pp => s >   call pp("abcd", "xyz") > contains >   subroutine s(c, o) >     character(*) :: c >     character(3), optional, value :: o >     if (o /= "xyz") stop 1 >     if (c /= "abcd") stop 2 >   end subroutine s > end program p Well, that testcase may compile with 12-branch, but it gives wrong code. Furthermore, it is arguably invalid, as you are currently unable to check the presence of the optional argument due to PR107444. I am therefore reluctant to have that testcase now. To fix that, we may have to bite the bullet and break the documented ABI, or rather update it, as character,value,optional is broken in all current gfortran versions, and the documentation is not completely consistent. I had planned to do this with the fix for PR107444, which want to keep separate from the current patch for good reasons. I have modified my patch so that your testcase above compiles and runs. But as explained, I don't want to add it now. Regtested again. What do you think? Thanks, Harald