re PR fortran/42335 ([OOP] ICE on CLASS IS (bad_identifier))
authorJanus Weil <janus@gcc.gnu.org>
Fri, 11 Dec 2009 14:40:36 +0000 (15:40 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Fri, 11 Dec 2009 14:40:36 +0000 (15:40 +0100)
gcc/fortran/
2009-12-11 Janus Weil  <janus@gcc.gnu.org>

PR fortran/42335
* symbol.c (select_type_insert_tmp): Add an extra check for
error recovery.

gcc/testsuite/
2009-12-11  Janus Weil  <janus@gcc.gnu.org>

PR fortran/42335
* gfortran.dg/select_type_11.f03: New test.

From-SVN: r155162

gcc/fortran/ChangeLog
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/select_type_11.f03 [new file with mode: 0644]

index 6e588c632d902e7f2822428f4c1290c8069acc2d..7000e25e5f87644e10ba90c40a208943e4606e01 100644 (file)
@@ -1,3 +1,9 @@
+2009-12-11 Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/42335
+       * symbol.c (select_type_insert_tmp): Add an extra check for
+       error recovery.
+
 2009-12-10  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/40287
index 08477c4f577b42f91aeb68725e941f364448944b..1b40d9a549acaa4c6a78962a16d078d907062624 100644 (file)
@@ -2476,7 +2476,7 @@ select_type_insert_tmp (gfc_symtree **st)
 {
   gfc_select_type_stack *stack = select_type_stack;
   for (; stack; stack = stack->prev)
-    if ((*st)->n.sym == stack->selector)
+    if ((*st)->n.sym == stack->selector && stack->tmp)
       *st = stack->tmp;
 }
 
index 18343a27538dc8a22146d80e93b7323ba53e671e..598c1aa20f56175e611039509a99f721fb8b1893 100644 (file)
@@ -1,3 +1,8 @@
+2009-12-11  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/42335
+       * gfortran.dg/select_type_11.f03: New test.
+
 2009-12-11  Dodji Seketeli  <dodji@redhat.com>
 
        PR c++/42225
diff --git a/gcc/testsuite/gfortran.dg/select_type_11.f03 b/gcc/testsuite/gfortran.dg/select_type_11.f03
new file mode 100644 (file)
index 0000000..54501d6
--- /dev/null
@@ -0,0 +1,28 @@
+! { dg-do compile }
+!
+! PR 42335: [OOP] ICE on CLASS IS (bad_identifier)
+!
+! Contributed by Harald Anlauf <anlauf@gmx.de>
+
+  implicit none
+  type, abstract :: vector_class
+  end type vector_class
+
+  type, extends(vector_class) :: trivial_vector_type
+    real :: elements(100)
+  end type trivial_vector_type
+
+contains
+
+  subroutine bar (this,v)
+    class(trivial_vector_type), intent(inout) :: this
+    class(vector_class),        intent(in)    :: v
+
+    select type (v)
+    class is (bad_id)                    ! { dg-error "is not an accessible derived type" }
+       this%elements(:) = v%elements(:)  ! { dg-error "is not a member of" }
+    end select
+
+  end subroutine bar
+
+end