[Bug fortran/105012] [12/13 Regression] wrf from SPECCPU2017 ICEs during LTO linking since r12-7692-g8db155ddf8cec9
anlauf at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Aug 24 19:36:30 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105012
--- Comment #17 from anlauf at gcc dot gnu.org ---
(In reply to Richard Biener from comment #11)
> (In reply to Richard Biener from comment #10)
> > likely triggered by the INTENT(out), it looks like gfortran fails to properly
> > name-lookup a variable of the same name as the function? The intent is
> > likely
> > to have the return value assigned by CALERF_r8. So it also looks like
> > gfortran miscompiles such testcase.
[...]
> SUBROUTINE Y (Z)
> real(8), intent(out) :: Z
> Z = 1.
> END SUBROUTINE Y
> FUNCTION X()
> real(8) :: X
> CALL Y (X)
> END FUNCTION X
> PROGRAM TEST
> real(8) :: Z
> Z = X();
> if (Z.ne.1.) STOP 1
> END PROGRAM
>
> but still
>
> t.f90:11:9:
>
> 11 | Z = X();
> | 1
> Error: Return type mismatch of function 'x' at (1) (REAL(4)/REAL(8))
The error message is correct. The main program is missing a decl that
X is real(8) not real(4). E.g. adding
real(8) :: X
resolves the type mismatch.
(Replacing 1. by 1._8 also eliminates some conversions in the dump.)
The dummy argument Z of Y is marked as intent(out):
Namespace: A-H: (REAL 4) I-N: (INTEGER 4) O-Z: (REAL 4)
procedure name = y
symtree: 'y' || symbol: 'y'
type spec : (UNKNOWN 0)
attributes: (PROCEDURE SUBROUTINE)
Formal arglist: z
symtree: 'z' || symbol: 'z'
type spec : (REAL 8)
attributes: (VARIABLE DUMMY(OUT))
A quick glance at trans-expr.cc::gfc_conv_procedure_call suggests that
the logic that determines whether to generate a clobber depends on the
properties of the formal argument being available.
6505 bool add_clobber;
6506 add_clobber = fsym && fsym->attr.intent ==
INTENT_OUT
6507 && !fsym->attr.allocatable &&
!fsym->attr.pointer
6508 && e->symtree && e->symtree->n.sym
6509 && !e->symtree->n.sym->attr.dimension
6510 && !e->symtree->n.sym->attr.pointer
6511 && !e->symtree->n.sym->attr.allocatable
6512 /* See PR 41453. */
6513 && !e->symtree->n.sym->attr.dummy
6514 /* FIXME - PR 87395 and PR 41453 */
6515 && e->symtree->n.sym->attr.save == SAVE_NONE
6516 && !e->symtree->n.sym->attr.associate_var
6517 && e->ts.type != BT_CHARACTER && e->ts.type !=
BT_DERIVED
6518 && e->ts.type != BT_CLASS &&
!sym->attr.elemental;
6519
6520 gfc_conv_expr_reference (&parmse, e,
add_clobber);
(gdb) p fsym
$7 = (gfc_symbol *) 0x0
Without an explicit interface, stone-age-style code is not supported here yet.
More information about the Gcc-bugs
mailing list