------- Comment #25 from burnus at gcc dot gnu dot org 2010-07-26 17:03 -------
(In reply to comment #23)
> Created an attachment (id=21315)
--> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=21315&action=view) [edit]
> New trans-decl.c patch - seems to work well
Dominique has found a failure (segfault) with PR 31867 comment 6.
If one generates in gfc_get_extern_function_decl the code for "lensum", one
finds that its argument "words" has locally the correct type:
(gdb) p sym->formal->sym->as->type
$4 = AS_ASSUMED_SHAPE
but the gsym has the wrong type
(gdb) p gsym->ns->proc_name->formal->sym->as->type
$10 = AS_DEFERRED
Thus, one enters the code path for descriptor-free arrays and crashes as UBOUND
is NULL.
In principle, this should get fixed in resolve_formal_arglist. One problem is
that if one enters find_arglists sym->ns != gfc_current_ns it fails.
But the actual problems seems to be in resolve_global_procedure. One has:
(gdb) p sym->attr.if_source
$27 = IFSRC_IFBODY
(gdb) p sym->formal->sym->as->type
$28 = AS_ASSUMED_SHAPE
That is: The symbol in the interface block of the module is resolved. But the
gsym is not:
(gdb) p gsym->ns->resolved
$29 = 0
(gdb) p gsym->ns->proc_name->formal->sym->as->type
$30 = AS_DEFERRED
The following patch fixes the program. (Side remark, one could do more argument
checking, cf. PR 45086.)
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c (revision 162538)
+++ gcc/fortran/resolve.c (working copy)
@@ -1816,7 +1816,8 @@ resolve_global_procedure (gfc_symbol *sy
gfc_global_used (gsym, where);
if (gfc_option.flag_whole_file
- && sym->attr.if_source == IFSRC_UNKNOWN
+ && (sym->attr.if_source == IFSRC_UNKNOWN
+ || sym->attr.if_source == IFSRC_IFBODY)
&& gsym->type != GSYM_UNKNOWN
&& gsym->ns
&& gsym->ns->resolved != -1
@@ -1902,7 +1903,7 @@ resolve_global_procedure (gfc_symbol *sy
sym->name, &sym->declared_at, gfc_typename (&sym->ts),
gfc_typename (&def_sym->ts));
- if (def_sym->formal)
+ if (def_sym->formal && sym->attr.if_source != IFSRC_IFBODY)
{
gfc_formal_arglist *arg = def_sym->formal;
for ( ; arg; arg = arg->next)
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40873