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] PR32088 - Fix implicit typing of RESULT variables


:ADDPATCH fortran:

The following program gave an ICE:

subroutine dummy
contains
  function quadric(a,b) result(c)
    dimension a(0:3),b(0:3),c(0:9)
    c(0)=1.1
  end function
end

the problem was that the dimension of the result variable was not set to
the function symbol itself. (Thanks to Paul for the patch
gfc_check_function_type, which he could not attach to the PR as
gcc.gnu.org is very slow/unreachable.)

I changed to error message to match the other implicitly typing errors,
which I think is also a bit clearer.

While debugging the problem (also called playing around), I saw that the
message printed by resolve_contained_fntype was a bit misleading
(function name vs. result variable name), I therefore changed the
message. (Note: sym == sym->result if no RESULT is present, see decl.c)

Build and check-gfortran tested on x86_64-unknown-linux-gnu, OK for the
trunk? (This is a 4.3 regression)

Tobias

PS: We are down to currently 46
wrong-code/rejects-valid/ice-on-valid-code PRs; of which 21 have the
wrong-code keyword and 4 are only in <= 4.2.
fortran/
2007-05-27 Paul Thomas  <pault@gcc.gnu.org>
	   Tobias Burnus  <burnus@net-b.de>

	PR fortran/32088
	* symbol.c (gfc_check_function_type): Copy dimensions of
	  result variable.
	* resolve.c (resolve_contained_fntype): Improve symbol output in
 	  the error message.

testsuite/
2007-05-27  Tobias Burnus  <burnus@net-b.de>

	PR fortran/32088
	* gfortran.dg/func_result_3.f90: New.

Index: gcc/fortran/symbol.c
===================================================================
--- gcc/fortran/symbol.c	(revision 125113)
+++ gcc/fortran/symbol.c	(working copy)
@@ -271,13 +271,18 @@ gfc_check_function_type (gfc_namespace *
 		== SUCCESS)
 	{
 	  if (proc->result != proc)
-	    proc->ts = proc->result->ts;
+	    {
+	      proc->ts = proc->result->ts;
+	      proc->as = gfc_copy_array_spec (proc->result->as);
+	      proc->attr.dimension = proc->result->attr.dimension;
+	      proc->attr.pointer = proc->result->attr.pointer;
+	      proc->attr.allocatable = proc->result->attr.allocatable;
+	    }
 	}
       else
 	{
-	  gfc_error ("unable to implicitly type the function result "
-		     "'%s' at %L", proc->result->name,
-		     &proc->result->declared_at);
+	  gfc_error ("Function result '%s' at %L has no IMPLICIT type",
+		     proc->result->name, &proc->result->declared_at);
 	  proc->result->attr.untyped = 1;
 	}
     }
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c	(revision 125113)
+++ gcc/fortran/resolve.c	(working copy)
@@ -289,18 +289,20 @@ resolve_contained_fntype (gfc_symbol *sy
     return;
 
   /* Try to find out of what the return type is.  */
-  if (sym->result != NULL)
-    sym = sym->result;
-
-  if (sym->ts.type == BT_UNKNOWN)
+  if (sym->result->ts.type == BT_UNKNOWN)
     {
-      t = gfc_set_default_type (sym, 0, ns);
+      t = gfc_set_default_type (sym->result, 0, ns);
 
-      if (t == FAILURE && !sym->attr.untyped)
+      if (t == FAILURE && !sym->result->attr.untyped)
 	{
-	  gfc_error ("Contained function '%s' at %L has no IMPLICIT type",
-		     sym->name, &sym->declared_at); /* FIXME */
-	  sym->attr.untyped = 1;
+	  if (sym->result == sym)
+	    gfc_error ("Contained function '%s' at %L has no IMPLICIT type",
+		       sym->name, &sym->declared_at);
+	  else
+	    gfc_error ("Result '%s' of contained function '%s' at %L has "
+		       "no IMPLICIT type", sym->result->name, sym->name,
+		       &sym->result->declared_at);
+	  sym->result->attr.untyped = 1;
 	}
     }
 
@@ -310,9 +312,9 @@ resolve_contained_fntype (gfc_symbol *sy
      in external functions.  Internal function results are not on that list;
      ergo, not permitted.  */
 
-  if (sym->ts.type == BT_CHARACTER)
+  if (sym->result->ts.type == BT_CHARACTER)
     {
-      gfc_charlen *cl = sym->ts.cl;
+      gfc_charlen *cl = sym->result->ts.cl;
       if (!cl || !cl->length)
 	gfc_error ("Character-valued internal function '%s' at %L must "
 		   "not be assumed length", sym->name, &sym->declared_at);
Index: gcc/testsuite/gfortran.dg/func_result_3.f90
===================================================================
--- gcc/testsuite/gfortran.dg/func_result_3.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/func_result_3.f90	(revision 0)
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! PR fortran/32088
+!
+! Test implicitly defined result variables
+!
+subroutine dummy
+contains
+  function quadric(a,b) result(c)
+  intent(in) a,b; dimension a(0:3),b(0:3),c(0:9)
+    c(0)=a(0)*b(0); c(1:3)=a(1:)*b(0)+a(0)*b(1:); c(4:6)=a(1:)*b(1:)
+    c(7:9)=(/a(1)*b(2)+b(1)*a(2),a(1)*b(3)+b(1)*a(3),a(2)*b(3)+b(2)*a(3)/)
+  end function
+end subroutine dummy
+
+subroutine dummy2
+implicit none
+contains
+  function quadric(a,b) result(c) ! { dg-error "no IMPLICIT type" }
+  real :: a, b
+  intent(in) a,b; dimension a(0:3),b(0:3),c(0:9)
+    c(0)=a(0)*b(0); c(1:3)=a(1:)*b(0)+a(0)*b(1:); c(4:6)=a(1:)*b(1:)
+    c(7:9)=(/a(1)*b(2)+b(1)*a(2),a(1)*b(3)+b(1)*a(3),a(2)*b(3)+b(2)*a(3)/)
+  end function
+end subroutine dummy2
+end

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