re PR fortran/71862 (ICE in gfc_add_component_ref, at fortran/class.c:241)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Tue, 26 Jul 2016 22:42:49 +0000 (22:42 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Tue, 26 Jul 2016 22:42:49 +0000 (22:42 +0000)
2016-07-22  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/71862
* class.c: Remove assert.  Iterate over component only if non-null.

2016-07-22  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/71862
* gfortran.dg/pr71862.f90: New test.

From-SVN: r238774

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

index b056e0e..0847e64 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-26  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/71862
+       * class.c: Remove assert.  Iterate over component only if non-null.
+
 2016-07-22  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/71935
index a627448..6d324a6 100644 (file)
@@ -238,12 +238,14 @@ gfc_add_component_ref (gfc_expr *e, const char *name)
     /* Avoid losing memory.  */
     gfc_free_ref_list (*tail);
   c = gfc_find_component (derived, name, true, true, tail);
-  gcc_assert (c);
-  for (ref = *tail; ref->next; ref = ref->next)
-    ;
-  ref->next = next;
-  if (!next)
-    e->ts = c->ts;
+
+  if (c) {
+    for (ref = *tail; ref->next; ref = ref->next)
+      ;
+    ref->next = next;
+    if (!next)
+      e->ts = c->ts;
+  }
 }
 
 
index 23a3062..3c335c6 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-26  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/71862
+       * gfortran.dg/pr71862.f90: New test.
+
 2016-07-26  Martin Sebor  <msebor@redhat.com>
 
        * gcc.dg/atomic/pr71675.c: Replace the unsupported c11 target
diff --git a/gcc/testsuite/gfortran.dg/pr71862.f90 b/gcc/testsuite/gfortran.dg/pr71862.f90
new file mode 100644 (file)
index 0000000..411bfc2
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do compile }
+program p
+   type t
+      integer :: n = 0
+      integer, pointer :: q => null()
+   end type
+   type(t) :: x
+   print *, associated(x%q)
+   x = f()
+   print *, associated(x%q)
+contains
+   function f() result (z)    ! { dg-error "must be dummy, allocatable or pointer" }
+      class(t) :: z
+      print *, associated(z%q)
+   end
+end