re PR fortran/62125 (Nested select type not accepted (rejects valid))
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 15 Jul 2016 19:58:55 +0000 (19:58 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 15 Jul 2016 19:58:55 +0000 (19:58 +0000)
2016-07-15  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
    Marco Restelli <mrestelli@gmail.com>

PR fortran/62125
* symbol.c (select_type_insert_tmp): Recursively call self to take care
of nested select type.

* gfortran.dg/pr62125.f90: New test.

Co-Authored-By: Marco Restelli <mrestelli@gmail.com>
From-SVN: r238400

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

index 51e8e2e55ef02decd5f66dec495ca7fff9d0185b..82e90da0236eadae4e750ef213c6f77b278a0b57 100644 (file)
@@ -1,3 +1,10 @@
+2016-07-15  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+           Marco Restelli <mrestelli@gmail.com>
+
+       PR fortran/62125
+       * symbol.c (select_type_insert_tmp): Recursively call self to take care
+       of nested select type.
+
 2016-07-15  Cesar Philippidis  <cesar@codesourcery.com>
 
        * openmp.c (gfc_match_omp_clauses): Scan for clause vector_length
index 0ee7decffd4b67e29d191fdd052d429bd3afabca..c967f25c85822b25c89f4d44e224d18ae73f72a2 100644 (file)
@@ -2930,7 +2930,11 @@ 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 && stack->tmp)
-      *st = stack->tmp;
+      {
+        *st = stack->tmp;
+        select_type_insert_tmp (st);
+        return;
+      }
 }
 
 
index 9608c2b735c68a5d32f291dfe3d5b8d246cb7caa..2793b344fa1e59e99212d94e388882e4c9a02f65 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-15  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+           Marco Restelli <mrestelli@gmail.com>
+
+       PR fortran/62125
+       * gfortran.dg/pr62125.f90: New test.
+
 2016-07-15  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/divkc3-1.c: Require p8vector support.
diff --git a/gcc/testsuite/gfortran.dg/pr62125.f90 b/gcc/testsuite/gfortran.dg/pr62125.f90
new file mode 100644 (file)
index 0000000..3256d05
--- /dev/null
@@ -0,0 +1,32 @@
+! { dg-do run }
+! PR62125  Nested select type not accepted (rejects valid) 
+module m
+ implicit none
+ type, abstract :: t1
+  logical :: l
+ end type t1
+ type, extends(t1), abstract :: t2
+  integer :: i
+ end type t2
+ type, extends(t2) :: t3
+  real :: x
+ end type t3
+contains
+ subroutine s(u)
+  class(t1), intent(in) :: u
+  if(.not.u%l) call abort()
+   select type(u); class is(t2)
+     if(u%i.ne.2) call abort()
+     select type(u); class is(t3)
+       if(u%x.ne.3.5) call abort()
+     end select
+   end select
+ end subroutine s
+end module m
+
+program p
+ use m
+ implicit none
+ type(t3) :: var = t3( l=.true. , i=2 , x=3.5 )
+ call s(var)
+end program p