Patchwork [fortran] PR45743 - [4.6 Regression] gfortran.dg/whole_file_3.f90 ICE: verify_stmts failed: invalid conversion in gimple call with -finline-small-functions

login
register
mail settings
Submitter Paul Richard Thomas
Date Feb. 22, 2011, 7:15 p.m.
Message ID <AANLkTinc0AEHFmUN_Q5-7tt55n0vHX-9=TJDM20oFJFE@mail.gmail.com>
Download mbox | patch
Permalink /patch/83992/
State New
Headers show

Comments

Paul Richard Thomas - Feb. 22, 2011, 7:15 p.m.
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.
Steve Kargl - Feb. 22, 2011, 7:51 p.m.
On Tue, Feb 22, 2011 at 08:15:31PM +0100, Paul Richard Thomas wrote:
> 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?
> 

OK.

PS: FWIW, I agree with yout WONTFIX assessment.

Patch

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