OSDN Git Service

gcc/fortran/
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Dec 2009 14:40:36 +0000 (14:40 +0000)
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Dec 2009 14:40:36 +0000 (14:40 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155162 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 6e588c6..7000e25 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 08477c4..1b40d9a 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 18343a2..598c1aa 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