blob: f194e63b5b7f7101ff97fa6e7f2d75d4bb7c378b [file] [log] [blame]
// { dg-do run }
#include <cstdlib>
#include <cassert>
struct S {
int *myarr;
};
#pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:20])
namespace A {
#pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:100])
}
namespace B {
#pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[100:100])
}
namespace A
{
void incr_a (S &my_s)
{
#pragma omp target
{
for (int i = 0; i < 100; i++)
my_s.myarr[i]++;
}
}
}
namespace B
{
void incr_b (S &my_s)
{
#pragma omp target
{
for (int i = 100; i < 200; i++)
my_s.myarr[i]++;
}
}
}
int main (int argc, char *argv[])
{
S my_s;
my_s.myarr = (int *) calloc (200, sizeof (int));
#pragma omp target
{
for (int i = 0; i < 20; i++)
my_s.myarr[i]++;
}
A::incr_a (my_s);
B::incr_b (my_s);
for (int i = 0; i < 200; i++)
assert (my_s.myarr[i] == (i < 20) ? 2 : 1);
return 0;
}