https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102456
kargl at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |kargl at gcc dot gnu.org
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
Priority|P3 |P4
Last reconfirmed| |2021-09-22
--- Comment #1 from kargl at gcc dot gnu.org ---
The following diff stops the ICE, which is a null pointer dereference.
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 851af1b30dc..2a250d73a28 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -4589,9 +4589,14 @@ gfc_check_rank (gfc_expr *a)
/* Functions returning pointers are regarded as variable, cf. F2008, R602.
*/
if (a->expr_type == EXPR_FUNCTION)
- is_variable = a->value.function.esym
- ? a->value.function.esym->result->attr.pointer
- : a->symtree->n.sym->result->attr.pointer;
+ {
+ if (a->value.function.esym && a->value.function.esym->result)
+ is_variable = a->value.function.esym->result->attr.pointer;
+ else if (a->symtree->n.sym->result)
+ is_variable = a->symtree->n.sym->result->attr.pointer;
+ else
+ is_variable = false;
+ }
if (a->expr_type == EXPR_OP
|| a->expr_type == EXPR_NULL
But, the patch yields
% gfcx -c -fcoarray=lib a.f90
a.f90:6:17:
6 | print *, rank(x[1])
| 1
Error: The argument of the RANK intrinsic at (1) must be a data object
and Gerhard indicates the code is legal. I don't use coarrays say cannot
confirm or deny this assertion. I do note that if one pokes around in
gdb that one finds
(gdb) p *a->value.function.actual->expr->symtree->n.sym->as
$11 = {rank = 0, corank = 1, type = AS_EXPLICIT, cotype = AS_EXPLICIT,
lower = {0x203627620, 0x0 <repeats 14 times>}, upper = {
0x0 <repeats 15 times>}, cray_pointee = false, cp_was_assumed = false,
resolved = true}
which is the only place I can locate rank and corank info. I'll also
note that we do have
(gdb) p a->rank
$13 = 0