gomp_mutex_unlock (&devicep->lock);
gomp_fatal ("always pointer not mapped");
}
- if ((get_kind (short_mapkind, kinds, i - 1) & typemask)
- != GOMP_MAP_ALWAYS_POINTER)
+ if (i > 0
+ && ((get_kind (short_mapkind, kinds, i - 1) & typemask)
+ != GOMP_MAP_ALWAYS_POINTER))
cur_node.tgt_offset = gomp_map_val (tgt, hostaddrs, i - 1);
if (cur_node.tgt_offset)
cur_node.tgt_offset -= sizes[i];
GOMP_MAP_VARS_ENTER_DATA);
i += j - i - 1;
}
- else if (i + 1 < mapnum && (kinds[i + 1] & 0xff) == GOMP_MAP_ATTACH)
+ else if (i + 1 < mapnum
+ && ((kinds[i + 1] & 0xff) == GOMP_MAP_ATTACH
+ || ((kinds[i + 1] & 0xff) == GOMP_MAP_ALWAYS_POINTER
+ && (kinds[i] & 0xff) != GOMP_MAP_ALWAYS_POINTER)))
{
/* An attach operation must be processed together with the mapped
base-pointer list item. */
--- /dev/null
+implicit none
+type t
+ integer :: dummy
+ integer, pointer :: p1(:), p2(:)
+ integer :: dummy2
+end type t
+type(t) :: var
+integer :: i
+allocate(var%p1(5),var%p2(2:4))
+var%p1 = [22,53,28,6,4]
+var%p2 = [46,679,54]
+
+!$omp target enter data map(to:var%p1, var%p2)
+!$omp target
+ if (.not.associated(var%p1).or.lbound(var%p1,1)/=1.or.ubound(var%p1,1)/=5) stop 1
+ if (.not.associated(var%p2).or.lbound(var%p2,1)/=2.or.ubound(var%p2,1)/=4) stop 2
+ if (any (var%p1 /= [22,53,28,6,4])) stop 3
+ if (any (var%p2 /= [46,679,54])) stop 4
+!$omp end target
+!!$omp target exit data map(from:var%p1, var%p2)
+end
+