re PR fortran/86545 (ICE in transfer_expr on invalid WRITE statement)
authorJanus Weil <janus@gcc.gnu.org>
Sat, 25 Aug 2018 15:41:34 +0000 (17:41 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 25 Aug 2018 15:41:34 +0000 (17:41 +0200)
fix PR 86545

2018-08-25  Janus Weil  <janus@gcc.gnu.org>

PR fortran/86545
* resolve.c (resolve_transfer): Correctly determine typespec for
generic function calls, in order to throw a proper error.

2018-08-25  Janus Weil  <janus@gcc.gnu.org>

PR fortran/86545
* gfortran.dg/generic_35.f90: New test case.

From-SVN: r263854

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/generic_35.f90 [new file with mode: 0644]

index 0d81a496017833bc7cfb2124f0c32753a5a5e7c5..22c40527bc69b4f4fef0bceb414a3a971f8a03ae 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-25  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/86545
+       * resolve.c (resolve_transfer): Correctly determine typespec for
+       generic function calls, in order to throw a proper error.
+
 2018-08-24  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/86837
index 43a8470e748f2882cfc83f863193f287107af3d6..ded276242833c54b75b917c61cb13db168ad7100 100644 (file)
@@ -9280,7 +9280,6 @@ resolve_select_type (gfc_code *code, gfc_namespace *old_ns)
 static void
 resolve_transfer (gfc_code *code)
 {
-  gfc_typespec *ts;
   gfc_symbol *sym, *derived;
   gfc_ref *ref;
   gfc_expr *exp;
@@ -9316,7 +9315,9 @@ resolve_transfer (gfc_code *code)
                                    _("item in READ")))
     return;
 
-  ts = exp->expr_type == EXPR_STRUCTURE ? &exp->ts : &exp->symtree->n.sym->ts;
+  const gfc_typespec *ts = exp->expr_type == EXPR_STRUCTURE
+                       || exp->expr_type == EXPR_FUNCTION
+                        ? &exp->ts : &exp->symtree->n.sym->ts;
 
   /* Go to actual component transferred.  */
   for (ref = exp->ref; ref; ref = ref->next)
index da37cb11d2658252194f9fe6b269a5e889be0475..13601d2de3bf2bec7366e82f4d3d8a27124d1aef 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-25  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/86545
+       * gfortran.dg/generic_35.f90: New test case.
+
 2018-08-24  David Malcolm  <dmalcolm@redhat.com>
 
        PR 87091
diff --git a/gcc/testsuite/gfortran.dg/generic_35.f90 b/gcc/testsuite/gfortran.dg/generic_35.f90
new file mode 100644 (file)
index 0000000..24ac270
--- /dev/null
@@ -0,0 +1,31 @@
+! { dg-do compile }
+!
+! PR 86545: ICE in transfer_expr on invalid WRITE statement
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+module m
+
+   type tString
+      character(len=:), allocatable :: cs
+   end type
+
+   interface my_trim
+      module procedure trim_string
+   end interface
+
+contains
+
+   elemental function trim_string(self) result(str)
+      type(tString) :: str
+      class(tString), intent(in) :: self
+   end function
+
+end module
+
+
+program p
+   use m
+   type(tString) :: s
+   write(*,*) my_trim(s)   ! { dg-error "cannot have ALLOCATABLE components" }
+end