| module m | 
 |   implicit none (type, external) | 
 |   type t | 
 |     integer, allocatable :: arr(:,:) | 
 |     integer :: var | 
 |     integer, allocatable :: slr | 
 |   end type t | 
 |  | 
 | contains | 
 |  | 
 |   subroutine check_it (is_present, dummy_alloced, inner_alloc, & | 
 |                        scalar, array, a_scalar, a_array, & | 
 |                        l_scalar, l_array, la_scalar, la_array, & | 
 |                        opt_scalar, opt_array, a_opt_scalar, a_opt_array) | 
 |     type(t), intent(inout) :: & | 
 |             scalar, array(:,:), opt_scalar, opt_array(:,:), a_scalar, a_array(:,:), & | 
 |             a_opt_scalar, a_opt_array(:,:), & | 
 |             l_scalar, l_array(:,:), la_scalar, la_array(:,:) | 
 |     optional :: opt_scalar, opt_array, a_opt_scalar, a_opt_array | 
 |     allocatable :: a_scalar, a_array, a_opt_scalar, a_opt_array, la_scalar, la_array | 
 |     logical, value :: is_present, dummy_alloced, inner_alloc | 
 |     integer :: i, j, k, l | 
 |  | 
 |     ! CHECK VALUE | 
 |     if (scalar%var /= 42) stop 1 | 
 |     if (l_scalar%var /= 42) stop 1 | 
 |     if (is_present) then | 
 |       if (opt_scalar%var /= 42) stop 2 | 
 |     end if | 
 |     if (any (shape(array) /= [3,2])) stop 1 | 
 |     if (any (shape(l_array) /= [3,2])) stop 1 | 
 |     if (is_present) then | 
 |       if (any (shape(opt_array) /= [3,2])) stop 1 | 
 |     end if | 
 |     do j = 1, 2 | 
 |       do i = 1, 3 | 
 |         if (array(i,j)%var /= i*97 + 100*41*j) stop 3 | 
 |         if (l_array(i,j)%var /= i*97 + 100*41*j) stop 3 | 
 |         if (is_present) then | 
 |           if (opt_array(i,j)%var /= i*97 + 100*41*j) stop 4 | 
 |         end if | 
 |       end do | 
 |     end do | 
 |  | 
 |     if (dummy_alloced) then | 
 |       if (a_scalar%var /= 42) stop 1 | 
 |       if (la_scalar%var /= 42) stop 1 | 
 |       if (is_present) then | 
 |         if (a_opt_scalar%var /= 42) stop 1 | 
 |       end if | 
 |       if (any (shape(a_array) /= [3,2])) stop 1 | 
 |       if (any (shape(la_array) /= [3,2])) stop 1 | 
 |       if (is_present) then | 
 |         if (any (shape(a_opt_array) /= [3,2])) stop 1 | 
 |       end if | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           if (a_array(i,j)%var /= i*97 + 100*41*j) stop 1 | 
 |           if (la_array(i,j)%var /= i*97 + 100*41*j) stop 1 | 
 |           if (is_present) then | 
 |             if (a_opt_array(i,j)%var /= i*97 + 100*41*j) stop 1 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |     else | 
 |       if (allocated (a_scalar)) stop 1 | 
 |       if (allocated (la_scalar)) stop 1 | 
 |       if (allocated (a_array)) stop 1 | 
 |       if (allocated (la_array)) stop 1 | 
 |       if (is_present) then | 
 |         if (allocated (a_opt_scalar)) stop 1 | 
 |         if (allocated (a_opt_array)) stop 1 | 
 |       end if | 
 |     end if | 
 |  | 
 |     if (inner_alloc) then | 
 |       if (scalar%slr /= 467) stop 5 | 
 |       if (l_scalar%slr /= 467) stop 5 | 
 |       if (a_scalar%slr /= 467) stop 6 | 
 |       if (la_scalar%slr /= 467) stop 6 | 
 |       if (is_present) then | 
 |         if (opt_scalar%slr /= 467) stop 7 | 
 |         if (a_opt_scalar%slr /= 467) stop 8 | 
 |       end if | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           if (array(i,j)%slr /= (i*97 + 100*41*j)  + 467) stop 9 | 
 |           if (l_array(i,j)%slr /= (i*97 + 100*41*j)  + 467) stop 9 | 
 |           if (a_array(i,j)%slr /= (i*97 + 100*41*j)  + 467) stop 10 | 
 |           if (la_array(i,j)%slr /= (i*97 + 100*41*j)  + 467) stop 10 | 
 |           if (is_present) then | 
 |             if (opt_array(i,j)%slr /= (i*97 + 100*41*j)  + 467) stop 11 | 
 |             if (a_opt_array(i,j)%slr /= (i*97 + 100*41*j)  + 467) stop 12 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |  | 
 |       do l = 1, 5 | 
 |         do k = 1, 4 | 
 |           if (any (shape(scalar%arr) /= [4,5])) stop 1 | 
 |           if (any (shape(l_scalar%arr) /= [4,5])) stop 1 | 
 |           if (any (shape(a_scalar%arr) /= [4,5])) stop 1 | 
 |           if (any (shape(la_scalar%arr) /= [4,5])) stop 1 | 
 |           if (scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 13 | 
 |           if (l_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 13 | 
 |           if (a_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 14 | 
 |           if (la_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 14 | 
 |           if (is_present) then | 
 |             if (any (shape(opt_scalar%arr) /= [4,5])) stop 1 | 
 |             if (any (shape(a_opt_scalar%arr) /= [4,5])) stop 1 | 
 |             if (opt_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 15 | 
 |             if (a_opt_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 16 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           if (any (shape(array(i,j)%arr) /= [i,j])) stop 1 | 
 |           if (any (shape(l_array(i,j)%arr) /= [i,j])) stop 1 | 
 |           if (any (shape(a_array(i,j)%arr) /= [i,j])) stop 1 | 
 |           if (any (shape(la_array(i,j)%arr) /= [i,j])) stop 1 | 
 |           if (is_present) then | 
 |             if (any (shape(opt_array(i,j)%arr) /= [i,j])) stop 1 | 
 |             if (any (shape(a_opt_array(i,j)%arr) /= [i,j])) stop 1 | 
 |           endif | 
 |           do l = 1, j | 
 |             do k = 1, i | 
 |               if (array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 17 | 
 |               if (l_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 17 | 
 |               if (a_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 18 | 
 |               if (la_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 18 | 
 |               if (is_present) then | 
 |                 if (opt_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 19 | 
 |                 if (a_opt_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 20 | 
 |               end if | 
 |             end do | 
 |           end do | 
 |         end do | 
 |       end do | 
 |     else if (dummy_alloced) then | 
 |       if (allocated (scalar%slr)) stop 1 | 
 |       if (allocated (l_scalar%slr)) stop 1 | 
 |       if (allocated (a_scalar%slr)) stop 1 | 
 |       if (allocated (la_scalar%slr)) stop 1 | 
 |       if (is_present) then | 
 |         if (allocated (opt_scalar%slr)) stop 1 | 
 |         if (allocated (a_opt_scalar%slr)) stop 1 | 
 |       endif | 
 |       if (allocated (scalar%arr)) stop 1 | 
 |       if (allocated (l_scalar%arr)) stop 1 | 
 |       if (allocated (a_scalar%arr)) stop 1 | 
 |       if (allocated (la_scalar%arr)) stop 1 | 
 |       if (is_present) then | 
 |         if (allocated (opt_scalar%arr)) stop 1 | 
 |         if (allocated (a_opt_scalar%arr)) stop 1 | 
 |       endif | 
 |     end if | 
 |  | 
 |     ! SET VALUE | 
 |     scalar%var = 42 + 13 | 
 |     l_scalar%var = 42 + 13 | 
 |     if (is_present) then | 
 |       opt_scalar%var = 42 + 13 | 
 |     endif | 
 |     do j = 1, 2 | 
 |       do i = 1, 3 | 
 |         array(i,j)%var = i*97 + 100*41*j + 13 | 
 |         l_array(i,j)%var = i*97 + 100*41*j + 13 | 
 |         if (is_present) then | 
 |           opt_array(i,j)%var = i*97 + 100*41*j + 13 | 
 |         end if | 
 |       end do | 
 |     end do | 
 |  | 
 |     if (dummy_alloced) then | 
 |       a_scalar%var = 42 + 13 | 
 |       la_scalar%var = 42 + 13 | 
 |       if (is_present) then | 
 |         a_opt_scalar%var = 42 + 13 | 
 |       endif | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           a_array(i,j)%var = i*97 + 100*41*j + 13 | 
 |           la_array(i,j)%var = i*97 + 100*41*j + 13 | 
 |           if (is_present) then | 
 |             a_opt_array(i,j)%var = i*97 + 100*41*j + 13 | 
 |           endif | 
 |         end do | 
 |       end do | 
 |     end if | 
 |  | 
 |     if (inner_alloc) then | 
 |       scalar%slr = 467 + 13 | 
 |       l_scalar%slr = 467 + 13 | 
 |       a_scalar%slr = 467 + 13 | 
 |       la_scalar%slr = 467 + 13 | 
 |       if (is_present) then | 
 |         opt_scalar%slr = 467 + 13 | 
 |         a_opt_scalar%slr = 467 + 13 | 
 |       end if | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           array(i,j)%slr = (i*97 + 100*41*j)  + 467 + 13 | 
 |           l_array(i,j)%slr = (i*97 + 100*41*j)  + 467 + 13 | 
 |           a_array(i,j)%slr = (i*97 + 100*41*j)  + 467 + 13 | 
 |           la_array(i,j)%slr = (i*97 + 100*41*j)  + 467 + 13 | 
 |           if (is_present) then | 
 |             opt_array(i,j)%slr = (i*97 + 100*41*j)  + 467 + 13 | 
 |             a_opt_array(i,j)%slr = (i*97 + 100*41*j)  + 467 + 13 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |  | 
 |       do l = 1, 5 | 
 |         do k = 1, 4 | 
 |           scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 | 
 |           l_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 | 
 |           a_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 | 
 |           la_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 | 
 |           if (is_present) then | 
 |             opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 | 
 |             a_opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           do l = 1, j | 
 |             do k = 1, i | 
 |               array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 | 
 |               l_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 | 
 |               a_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 | 
 |               la_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 | 
 |               if (is_present) then | 
 |                 opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 | 
 |                 a_opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 | 
 |               end if | 
 |             end do | 
 |           end do | 
 |         end do | 
 |       end do | 
 |     end if | 
 |  | 
 |   end subroutine | 
 |   subroutine check_reset (is_present, dummy_alloced, inner_alloc, & | 
 |                           scalar, array, a_scalar, a_array, & | 
 |                           l_scalar, l_array, la_scalar, la_array, & | 
 |                           opt_scalar, opt_array, a_opt_scalar, a_opt_array) | 
 |     type(t), intent(inout) :: & | 
 |             scalar, array(:,:), opt_scalar, opt_array(:,:), a_scalar, a_array(:,:), & | 
 |             a_opt_scalar, a_opt_array(:,:), & | 
 |             l_scalar, l_array(:,:), la_scalar, la_array(:,:) | 
 |     optional :: opt_scalar, opt_array, a_opt_scalar, a_opt_array | 
 |     allocatable :: a_scalar, a_array, a_opt_scalar, a_opt_array, la_scalar, la_array | 
 |     logical, value :: is_present, dummy_alloced, inner_alloc | 
 |     integer :: i, j, k, l | 
 |  | 
 |     ! CHECK VALUE | 
 |     if (scalar%var /= 42 + 13) stop 1 | 
 |     if (l_scalar%var /= 42 + 13) stop 1 | 
 |     if (is_present) then | 
 |       if (opt_scalar%var /= 42 + 13) stop 2 | 
 |     end if | 
 |     if (any (shape(array) /= [3,2])) stop 1 | 
 |     if (any (shape(l_array) /= [3,2])) stop 1 | 
 |     if (is_present) then | 
 |       if (any (shape(opt_array) /= [3,2])) stop 1 | 
 |     end if | 
 |     do j = 1, 2 | 
 |       do i = 1, 3 | 
 |         if (array(i,j)%var /= i*97 + 100*41*j + 13) stop 3 | 
 |         if (l_array(i,j)%var /= i*97 + 100*41*j + 13) stop 3 | 
 |         if (is_present) then | 
 |           if (opt_array(i,j)%var /= i*97 + 100*41*j + 13) stop 4 | 
 |         end if | 
 |       end do | 
 |     end do | 
 |  | 
 |     if (dummy_alloced) then | 
 |       if (a_scalar%var /= 42 + 13) stop 1 | 
 |       if (la_scalar%var /= 42 + 13) stop 1 | 
 |       if (is_present) then | 
 |         if (a_opt_scalar%var /= 42 + 13) stop 1 | 
 |       end if | 
 |       if (any (shape(a_array) /= [3,2])) stop 1 | 
 |       if (any (shape(la_array) /= [3,2])) stop 1 | 
 |       if (is_present) then | 
 |         if (any (shape(a_opt_array) /= [3,2])) stop 1 | 
 |       end if | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           if (a_array(i,j)%var /= i*97 + 100*41*j + 13) stop 1 | 
 |           if (la_array(i,j)%var /= i*97 + 100*41*j + 13) stop 1 | 
 |           if (is_present) then | 
 |             if (a_opt_array(i,j)%var /= i*97 + 100*41*j + 13) stop 1 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |     else | 
 |       if (allocated (a_scalar)) stop 1 | 
 |       if (allocated (la_scalar)) stop 1 | 
 |       if (allocated (a_array)) stop 1 | 
 |       if (allocated (la_array)) stop 1 | 
 |       if (is_present) then | 
 |         if (allocated (a_opt_scalar)) stop 1 | 
 |         if (allocated (a_opt_array)) stop 1 | 
 |       end if | 
 |     end if | 
 |  | 
 |     if (inner_alloc) then | 
 |       if (scalar%slr /= 467 + 13) stop 5 | 
 |       if (l_scalar%slr /= 467 + 13) stop 5 | 
 |       if (a_scalar%slr /= 467 + 13) stop 6 | 
 |       if (la_scalar%slr /= 467 + 13) stop 6 | 
 |       if (is_present) then | 
 |         if (opt_scalar%slr /= 467 + 13) stop 7 | 
 |         if (a_opt_scalar%slr /= 467 + 13) stop 8 | 
 |       end if | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           if (array(i,j)%slr /= (i*97 + 100*41*j)  + 467 + 13) stop 9 | 
 |           if (l_array(i,j)%slr /= (i*97 + 100*41*j)  + 467 + 13) stop 9 | 
 |           if (a_array(i,j)%slr /= (i*97 + 100*41*j)  + 467 + 13) stop 10 | 
 |           if (la_array(i,j)%slr /= (i*97 + 100*41*j)  + 467 + 13) stop 10 | 
 |           if (is_present) then | 
 |             if (opt_array(i,j)%slr /= (i*97 + 100*41*j)  + 467 + 13) stop 11 | 
 |             if (a_opt_array(i,j)%slr /= (i*97 + 100*41*j)  + 467 + 13) stop 12 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |  | 
 |       do l = 1, 5 | 
 |         do k = 1, 4 | 
 |           if (any (shape(scalar%arr) /= [4,5])) stop 1 | 
 |           if (any (shape(l_scalar%arr) /= [4,5])) stop 1 | 
 |           if (any (shape(a_scalar%arr) /= [4,5])) stop 1 | 
 |           if (any (shape(la_scalar%arr) /= [4,5])) stop 1 | 
 |           if (scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 13 | 
 |           if (l_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 13 | 
 |           if (a_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 14 | 
 |           if (la_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 14 | 
 |           if (is_present) then | 
 |             if (any (shape(opt_scalar%arr) /= [4,5])) stop 1 | 
 |             if (any (shape(a_opt_scalar%arr) /= [4,5])) stop 1 | 
 |             if (opt_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 15 | 
 |             if (a_opt_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 16 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           if (any (shape(array(i,j)%arr) /= [i,j])) stop 1 | 
 |           if (any (shape(l_array(i,j)%arr) /= [i,j])) stop 1 | 
 |           if (any (shape(a_array(i,j)%arr) /= [i,j])) stop 1 | 
 |           if (any (shape(la_array(i,j)%arr) /= [i,j])) stop 1 | 
 |           if (is_present) then | 
 |             if (any (shape(opt_array(i,j)%arr) /= [i,j])) stop 1 | 
 |             if (any (shape(a_opt_array(i,j)%arr) /= [i,j])) stop 1 | 
 |           endif | 
 |           do l = 1, j | 
 |             do k = 1, i | 
 |               if (array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 17 | 
 |               if (l_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 17 | 
 |               if (a_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 18 | 
 |               if (la_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 18 | 
 |               if (is_present) then | 
 |                 if (opt_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 19 | 
 |                 if (a_opt_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 20 | 
 |               end if | 
 |             end do | 
 |           end do | 
 |         end do | 
 |       end do | 
 |     else if (dummy_alloced) then | 
 |       if (allocated (scalar%slr)) stop 1 | 
 |       if (allocated (l_scalar%slr)) stop 1 | 
 |       if (allocated (a_scalar%slr)) stop 1 | 
 |       if (allocated (la_scalar%slr)) stop 1 | 
 |       if (is_present) then | 
 |         if (allocated (opt_scalar%slr)) stop 1 | 
 |         if (allocated (a_opt_scalar%slr)) stop 1 | 
 |       endif | 
 |       if (allocated (scalar%arr)) stop 1 | 
 |       if (allocated (l_scalar%arr)) stop 1 | 
 |       if (allocated (a_scalar%arr)) stop 1 | 
 |       if (allocated (la_scalar%arr)) stop 1 | 
 |       if (is_present) then | 
 |         if (allocated (opt_scalar%arr)) stop 1 | 
 |         if (allocated (a_opt_scalar%arr)) stop 1 | 
 |       endif | 
 |     end if | 
 |  | 
 |     ! (RE)SET VALUE | 
 |     scalar%var = 42 | 
 |     l_scalar%var = 42 | 
 |     if (is_present) then | 
 |       opt_scalar%var = 42 | 
 |     endif | 
 |     do j = 1, 2 | 
 |       do i = 1, 3 | 
 |         array(i,j)%var = i*97 + 100*41*j | 
 |         l_array(i,j)%var = i*97 + 100*41*j | 
 |         if (is_present) then | 
 |           opt_array(i,j)%var = i*97 + 100*41*j | 
 |         end if | 
 |       end do | 
 |     end do | 
 |  | 
 |     if (dummy_alloced) then | 
 |       a_scalar%var = 42 | 
 |       la_scalar%var = 42 | 
 |       if (is_present) then | 
 |         a_opt_scalar%var = 42 | 
 |       endif | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           a_array(i,j)%var = i*97 + 100*41*j | 
 |           la_array(i,j)%var = i*97 + 100*41*j | 
 |           if (is_present) then | 
 |             a_opt_array(i,j)%var = i*97 + 100*41*j | 
 |           endif | 
 |         end do | 
 |       end do | 
 |     end if | 
 |  | 
 |     if (inner_alloc) then | 
 |       scalar%slr = 467 | 
 |       l_scalar%slr = 467 | 
 |       a_scalar%slr = 467 | 
 |       la_scalar%slr = 467 | 
 |       if (is_present) then | 
 |         opt_scalar%slr = 467 | 
 |         a_opt_scalar%slr = 467 | 
 |       end if | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |           l_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |           a_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |           la_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |           if (is_present) then | 
 |             opt_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |             a_opt_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |  | 
 |       do l = 1, 5 | 
 |         do k = 1, 4 | 
 |           scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |           l_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |           a_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |           la_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |           if (is_present) then | 
 |             opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |             a_opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |           end if | 
 |         end do | 
 |       end do | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           do l = 1, j | 
 |             do k = 1, i | 
 |               array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |               l_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |               a_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |               la_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |               if (is_present) then | 
 |                 opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |                 a_opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |               end if | 
 |             end do | 
 |           end do | 
 |         end do | 
 |       end do | 
 |     end if | 
 |   end subroutine | 
 |  | 
 |   subroutine test(scalar, array, a_scalar, a_array, opt_scalar, opt_array, & | 
 |                   a_opt_scalar, a_opt_array) | 
 |     type(t) :: scalar, array(:,:), opt_scalar, opt_array(:,:), a_scalar, a_array(:,:) | 
 |     type(t) :: a_opt_scalar, a_opt_array(:,:) | 
 |     type(t) :: l_scalar, l_array(3,2), la_scalar, la_array(:,:) | 
 |     allocatable :: a_scalar, a_array, a_opt_scalar, a_opt_array, la_scalar, la_array | 
 |     optional :: opt_scalar, opt_array, a_opt_scalar, a_opt_array | 
 |  | 
 |     integer :: i, j, k, l | 
 |     logical :: is_present, dummy_alloced, local_alloced, inner_alloc | 
 |     is_present = present(opt_scalar) | 
 |     dummy_alloced = allocated(a_scalar) | 
 |     inner_alloc = allocated(scalar%slr) | 
 |  | 
 |     l_scalar%var = 42 | 
 |     do j = 1, 2 | 
 |       do i = 1, 3 | 
 |         l_array(i,j)%var = i*97 + 100*41*j | 
 |       end do | 
 |     end do | 
 |  | 
 |     if (dummy_alloced) then | 
 |       allocate(la_scalar, la_array(3,2)) | 
 |       a_scalar%var = 42 | 
 |       la_scalar%var = 42 | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           l_array(i,j)%var = i*97 + 100*41*j | 
 |           la_array(i,j)%var = i*97 + 100*41*j | 
 |         end do | 
 |       end do | 
 |     end if | 
 |  | 
 |     if (inner_alloc) then | 
 |       l_scalar%slr = 467 | 
 |       la_scalar%slr = 467 | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           l_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |           la_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |         end do | 
 |       end do | 
 |  | 
 |       allocate(l_scalar%arr(4,5), la_scalar%arr(4,5)) | 
 |       do l = 1, 5 | 
 |         do k = 1, 4 | 
 |           l_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |           la_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |         end do | 
 |       end do | 
 |       do j = 1, 2 | 
 |         do i = 1, 3 | 
 |           allocate(l_array(i,j)%arr(i,j), la_array(i,j)%arr(i,j)) | 
 |           do l = 1, j | 
 |             do k = 1, i | 
 |               l_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |               la_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |             end do | 
 |           end do | 
 |         end do | 
 |       end do | 
 |     end if | 
 |  | 
 |     ! implicit mapping | 
 |     !$omp target | 
 |       if (is_present) then | 
 |         call check_it (is_present, dummy_alloced, inner_alloc, & | 
 |                        scalar, array, a_scalar, a_array, & | 
 |                        l_scalar, l_array, la_scalar, la_array, & | 
 |                        opt_scalar, opt_array, a_opt_scalar, a_opt_array) | 
 |       else | 
 |         call check_it (is_present, dummy_alloced, inner_alloc, & | 
 |                        scalar, array, a_scalar, a_array, & | 
 |                        l_scalar, l_array, la_scalar, la_array) | 
 |       end if | 
 |     !$omp end target | 
 |  | 
 |     if (is_present) then | 
 |       call check_reset (is_present, dummy_alloced, inner_alloc, & | 
 |                         scalar, array, a_scalar, a_array, & | 
 |                         l_scalar, l_array, la_scalar, la_array, & | 
 |                         opt_scalar, opt_array, a_opt_scalar, a_opt_array) | 
 |     else | 
 |       call check_reset (is_present, dummy_alloced, inner_alloc, & | 
 |                         scalar, array, a_scalar, a_array, & | 
 |                         l_scalar, l_array, la_scalar, la_array) | 
 |     endif | 
 |  | 
 |     ! explicit mapping | 
 |     !$omp target map(scalar, array, opt_scalar, opt_array, a_scalar, a_array) & | 
 |     !$omp&       map(a_opt_scalar, a_opt_array) & | 
 |     !$omp&       map(l_scalar, l_array, la_scalar, la_array) | 
 |       if (is_present) then | 
 |         call check_it (is_present, dummy_alloced, inner_alloc, & | 
 |                        scalar, array, a_scalar, a_array, & | 
 |                        l_scalar, l_array, la_scalar, la_array, & | 
 |                        opt_scalar, opt_array, a_opt_scalar, a_opt_array) | 
 |       else | 
 |         call check_it (is_present, dummy_alloced, inner_alloc, & | 
 |                        scalar, array, a_scalar, a_array, & | 
 |                        l_scalar, l_array, la_scalar, la_array) | 
 |       endif | 
 |     !$omp end target | 
 |  | 
 |     if (is_present) then | 
 |       call check_reset (is_present, dummy_alloced, inner_alloc, & | 
 |                         scalar, array, a_scalar, a_array, & | 
 |                         l_scalar, l_array, la_scalar, la_array, & | 
 |                         opt_scalar, opt_array, a_opt_scalar, a_opt_array) | 
 |     else | 
 |       call check_reset (is_present, dummy_alloced, inner_alloc, & | 
 |                         scalar, array, a_scalar, a_array, & | 
 |                         l_scalar, l_array, la_scalar, la_array) | 
 |     endif | 
 |   end subroutine | 
 | end module | 
 |  | 
 | program main | 
 |   use m | 
 |   implicit none (type, external) | 
 |   type(t) :: scalar, array(3,2), opt_scalar, opt_array(3,2), a_scalar, a_array(:,:) | 
 |   type(t) :: a_opt_scalar, a_opt_array(:,:) | 
 |   allocatable :: a_scalar, a_array, a_opt_scalar, a_opt_array | 
 |   integer :: i, j, k, l, n | 
 |  | 
 |   scalar%var = 42 | 
 |   opt_scalar%var = 42 | 
 |   do j = 1, 2 | 
 |     do i = 1, 3 | 
 |       array(i,j)%var = i*97 + 100*41*j | 
 |       opt_array(i,j)%var = i*97 + 100*41*j | 
 |     end do | 
 |   end do | 
 |  | 
 |   ! unallocated | 
 |   call test (scalar, array, a_scalar, a_array) | 
 |   call test (scalar, array, a_scalar, a_array, opt_scalar, opt_array, a_opt_scalar, a_opt_array) | 
 |  | 
 |   ! allocated | 
 |   allocate(a_scalar, a_opt_scalar, a_array(3,2), a_opt_array(3,2)) | 
 |   a_scalar%var = 42 | 
 |   a_opt_scalar%var = 42 | 
 |   do j = 1, 2 | 
 |     do i = 1, 3 | 
 |       a_array(i,j)%var = i*97 + 100*41*j | 
 |       a_opt_array(i,j)%var = i*97 + 100*41*j | 
 |     end do | 
 |   end do | 
 |  | 
 |   call test (scalar, array, a_scalar, a_array) | 
 |   call test (scalar, array, a_scalar, a_array, opt_scalar, opt_array, a_opt_scalar, a_opt_array) | 
 |  | 
 |   ! comps allocated | 
 |   scalar%slr = 467 | 
 |   a_scalar%slr = 467 | 
 |   opt_scalar%slr = 467 | 
 |   a_opt_scalar%slr = 467 | 
 |   do j = 1, 2 | 
 |     do i = 1, 3 | 
 |       array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |       a_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |       opt_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |       a_opt_array(i,j)%slr = (i*97 + 100*41*j)  + 467 | 
 |     end do | 
 |   end do | 
 |  | 
 |   allocate(scalar%arr(4,5), a_scalar%arr(4,5), opt_scalar%arr(4,5), a_opt_scalar%arr(4,5)) | 
 |   do l = 1, 5 | 
 |     do k = 1, 4 | 
 |       scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |       a_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |       opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |       a_opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 | 
 |     end do | 
 |   end do | 
 |   do j = 1, 2 | 
 |     do i = 1, 3 | 
 |       allocate(array(i,j)%arr(i,j), a_array(i,j)%arr(i,j), opt_array(i,j)%arr(i,j), a_opt_array(i,j)%arr(i,j)) | 
 |       do l = 1, j | 
 |         do k = 1, i | 
 |           array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |           a_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |           opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |           a_opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l | 
 |         end do | 
 |       end do | 
 |     end do | 
 |   end do | 
 |  | 
 |   call test (scalar, array, a_scalar, a_array) | 
 |   call test (scalar, array, a_scalar, a_array, opt_scalar, opt_array, a_opt_scalar, a_opt_array) | 
 |  | 
 |   deallocate(a_scalar, a_opt_scalar, a_array, a_opt_array) | 
 | end |