This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, fortran] PR45743 - [4.6 Regression] gfortran.dg/whole_file_3.f90 ICE: verify_stmts failed: invalid conversion in gimple call with -finline-small-functions
- From: Paul Richard Thomas <paul dot richard dot thomas at gmail dot com>
- To: fortran at gcc dot gnu dot org, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 22 Feb 2011 20:15:31 +0100
- Subject: [Patch, fortran] PR45743 - [4.6 Regression] gfortran.dg/whole_file_3.f90 ICE: verify_stmts failed: invalid conversion in gimple call with -finline-small-functions
This patch fixes the regression in this PR. Frankly, I think that
fixing the warning versus error issue on an obsolescent language
feature is a waste of effort. For me it is a WONTFIX. That said, the
invalid conversion in gimple is fundamental. It comes about because,
in the testcase, the procedure 'r' is passed as an actual argument to
'phload' without otherwise being referenced in the main program. This
means that two different declarations are floating around for the
actual and formal arguments, which clash during inlining. The most
economic fix here is to not try to inline such procedures :-)
Undoubtedly, the actual and formal arguments could be connected but
this really seems more trouble than it is worth for a procedure
without an explicit interface.
Bootstrapped and regtested on Ubuntu-10.1/i686 - OK for trunk?
Paul
2011-02-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/45743
* trans-decl.c (gfc_get_extern_function_decl): Don't use the
gsymbol backend_decl if the procedure has a formal argument
that is a procedure.
2011-02-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/45743
* gfortran.dg/whole_file_32.f90 : New test.
Index: gcc/fortran/trans-decl.c
===================================================================
*** gcc/fortran/trans-decl.c (revision 170356)
--- gcc/fortran/trans-decl.c (working copy)
*************** gfc_get_extern_function_decl (gfc_symbol
*** 1495,1500 ****
--- 1495,1501 ----
tree name;
tree mangled_name;
gfc_gsymbol *gsym;
+ bool proc_formal_arg;
if (sym->backend_decl)
return sym->backend_decl;
*************** gfc_get_extern_function_decl (gfc_symbol
*** 1511,1520 ****
--- 1512,1538 ----
return the backend_decl. */
gsym = gfc_find_gsymbol (gfc_gsym_root, sym->name);
+ /* Do not use procedures that have a procedure argument because this
+ can result in problems of multiple decls during inlining. */
+ proc_formal_arg = false;
+ if (gsym && gsym->ns && gsym->ns->proc_name)
+ {
+ gfc_formal_arglist *formal = gsym->ns->proc_name->formal;
+ for (; formal; formal = formal->next)
+ {
+ if (formal->sym && formal->sym->attr.flavor == FL_PROCEDURE)
+ {
+ proc_formal_arg = true;
+ break;
+ }
+ }
+ }
+
if (gfc_option.flag_whole_file
&& (!sym->attr.use_assoc || sym->attr.if_source != IFSRC_DECL)
&& !sym->backend_decl
&& gsym && gsym->ns
+ && !proc_formal_arg
&& ((gsym->type == GSYM_SUBROUTINE) || (gsym->type == GSYM_FUNCTION))
&& (gsym->ns->proc_name->backend_decl || !sym->attr.intrinsic))
{
Index: gcc/testsuite/gfortran.dg/whole_file_32.f90
===================================================================
*** gcc/testsuite/gfortran.dg/whole_file_32.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/whole_file_32.f90 (revision 0)
***************
*** 0 ****
--- 1,20 ----
+ ! { dg-do compile }
+ ! { dg-options "-O -finline-small-functions" }
+ ! Tests the fix for PR45743 in which the compilation failed with an ICE
+ ! internal compiler error: verify_stmts failed. The source is the essential
+ ! part of whole_file_3.f90.
+ !
+ ! Contributed by Zdenek Sojka <zsojka@seznam.cz>
+ !
+ SUBROUTINE PHLOAD (READER,*)
+ IMPLICIT NONE
+ EXTERNAL READER
+ CALL READER (*1)
+ 1 RETURN 1
+ END SUBROUTINE
+
+ program test
+ EXTERNAL R
+ CALL PHLOAD (R, *999) ! This one is OK
+ 999 continue
+ END program test