[OPENMP]Map data field with l-value reference types.
Added initial support dfor the mapping of the data members with l-value
reference types.
Differential Revision: https://reviews.llvm.org/D98812
GitOrigin-RevId: 0411b2331916cc8c7a8be9dd0eb540b731e6d9ce
diff --git a/libomptarget/test/mapping/data_member_ref.cpp b/libomptarget/test/mapping/data_member_ref.cpp
new file mode 100644
index 0000000..44e4d1e
--- /dev/null
+++ b/libomptarget/test/mapping/data_member_ref.cpp
@@ -0,0 +1,69 @@
+// RUN: %libomptarget-compilexx-run-and-check-aarch64-unknown-linux-gnu
+// RUN: %libomptarget-compilexx-run-and-check-powerpc64-ibm-linux-gnu
+// RUN: %libomptarget-compilexx-run-and-check-powerpc64le-ibm-linux-gnu
+// RUN: %libomptarget-compilexx-run-and-check-x86_64-pc-linux-gnu
+// RUN: %libomptarget-compilexx-run-and-check-nvptx64-nvidia-cuda
+
+#include <stdio.h>
+
+struct View {
+ int Data;
+};
+
+struct ViewPtr {
+ int *Data;
+};
+
+template <typename T> struct Foo {
+ Foo(T &V) : VRef(V) {}
+ T &VRef;
+};
+
+int main() {
+ View V;
+ V.Data = 123456;
+ Foo<View> Bar(V);
+ ViewPtr V1;
+ int Data = 123456;
+ V1.Data = &Data;
+ Foo<ViewPtr> Baz(V1);
+
+ // CHECK: Host 123456.
+ printf("Host %d.\n", Bar.VRef.Data);
+#pragma omp target map(Bar.VRef)
+ {
+ // CHECK: Device 123456.
+ printf("Device %d.\n", Bar.VRef.Data);
+ V.Data = 654321;
+ // CHECK: Device 654321.
+ printf("Device %d.\n", Bar.VRef.Data);
+ }
+ // CHECK: Host 654321 654321.
+ printf("Host %d %d.\n", Bar.VRef.Data, V.Data);
+ V.Data = 123456;
+ // CHECK: Host 123456.
+ printf("Host %d.\n", Bar.VRef.Data);
+#pragma omp target map(Bar) map(Bar.VRef)
+ {
+ // CHECK: Device 123456.
+ printf("Device %d.\n", Bar.VRef.Data);
+ V.Data = 654321;
+ // CHECK: Device 654321.
+ printf("Device %d.\n", Bar.VRef.Data);
+ }
+ // CHECK: Host 654321 654321.
+ printf("Host %d %d.\n", Bar.VRef.Data, V.Data);
+ // CHECK: Host 123456.
+ printf("Host %d.\n", *Baz.VRef.Data);
+#pragma omp target map(*Baz.VRef.Data)
+ {
+ // CHECK: Device 123456.
+ printf("Device %d.\n", *Baz.VRef.Data);
+ *V1.Data = 654321;
+ // CHECK: Device 654321.
+ printf("Device %d.\n", *Baz.VRef.Data);
+ }
+ // CHECK: Host 654321 654321 654321.
+ printf("Host %d %d %d.\n", *Baz.VRef.Data, *V1.Data, Data);
+ return 0;
+}