! { dg-do run }
!
! This tests the improved version of the patch for PR16861.  Testing
! after committing the first version, revealed that this test did
! not work but was not regtested for, either.
!
! Contributed by Paul Thomas <pault@gcc.gnu.org>
!
MODULE foo
  TYPE type1
    INTEGER i1
  END TYPE type1
END MODULE

MODULE bar
CONTAINS
  SUBROUTINE sub1 (x, y)
    USE foo
    TYPE (type1)  :: x
    INTEGER  :: y(x%i1)
    y = 1
  END SUBROUTINE SUB1
  SUBROUTINE sub2 (u, v)
    USE foo
    TYPE (type1)  :: u
    INTEGER  :: v(u%i1)
    v = 2
  END SUBROUTINE SUB2
END MODULE

MODULE foobar
  USE foo
  USE bar
CONTAINS
  SUBROUTINE sub3 (s, t)
    USE foo
    TYPE (type1)  :: s
    INTEGER  :: t(s%i1)
    t = 3
  END SUBROUTINE SUB3
END MODULE foobar

PROGRAM use_foobar
  USE foo
  USE foobar
  INTEGER :: j(3) = 0
  TYPE (type1)   :: z
  z%i1 = 3
  CALL sub1 (z, j)
  z%i1 = 2
  CALL sub2 (z, j)
  z%i1 = 1
  CALL sub3 (z, j)
  IF (ALL (j.ne.(/3,2,1/))) CALL abort ()
END PROGRAM use_foobar
