--- /dev/null
+! { dg-do run }
+!
+! PR fortran/18918
+!
+! Check whether assumed-shape's cobounds are properly handled
+!
+ implicit none
+ integer :: B(1)[*]
+ integer :: C(8:11)[-3:10,43:*]
+ integer, allocatable :: D(:)[:,:]
+
+ allocate (D(20)[2:3,5:*])
+
+ call sub (B,5)
+ call sub (C,3)
+ call sub (D,3)
+
+ call sub2 (B, -3)
+ call sub2 (C, 44)
+ call sub2 (D, 44)
+
+ call sub3 (B)
+ call sub3 (C)
+ call sub3 (D)
+
+ call sub4 (B)
+ call sub4 (C)
+ call sub4 (D)
+
+ call sub5 (D)
+ contains
+
+ subroutine sub(A,n)
+ integer :: n
+ integer :: A(n:)[n:2*n,3*n:*]
+ if (lbound(A,dim=1) /= n) call abort ()
+ if (any (lcobound(A) /= [n, 3*n])) call abort ()
+ if (ucobound(A, dim=1) /= 2*n) call abort()
+ end subroutine sub
+
+ subroutine sub2(A,n)
+ integer :: n
+ integer :: A(:)[-n:*]
+ if (lbound(A,dim=1) /= 1) call abort ()
+ if (lcobound(A, dim=1) /= -n) call abort ()
+ end subroutine sub2
+
+ subroutine sub3(A)
+ integer :: A(:)[0,*]
+ if (lbound(A,dim=1) /= 1) call abort ()
+ if (lcobound(A, dim=1) /= 1) call abort ()
+ if (ucobound(A, dim=1) /= 0) call abort ()
+ if (lcobound(A, dim=2) /= 1) call abort ()
+ end subroutine sub3
+
+ subroutine sub4(A)
+ integer :: A(:)[*]
+ if (lbound(A,dim=1) /= 1) call abort ()
+ if (lcobound(A, dim=1) /= 1) call abort ()
+ end subroutine sub4
+
+ subroutine sub5(A)
+ integer, allocatable :: A(:)[:,:]
+
+ if (lbound(A,dim=1) /= 1) call abort ()
+ if (lcobound(A, dim=1) /= 2) call abort ()
+ if (ucobound(A, dim=1) /= 3) call abort ()
+ if (lcobound(A, dim=2) /= 5) call abort ()
+ end subroutine sub5
+ end