This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]