1// RUN: %Slang %s
2
3// RUN: %rs-filecheck-wrapper %s --check-prefix=CHECK-SET
4//     Check rsSetObject() calls are properly added.
5
6// CHECK-SET-NOT: call void @_Z11rsSetObject{{.*}}({{.*}} %.rs.param.a{{[02]}}, {{.*}})
7// CHECK-SET:     call void @_Z11rsSetObjectP10rs_elementS_(%struct.rs_element{{.*}}* nonnull %.rs.param.a1, {{.*}})
8// CHECK-SET-NOT: call void @_Z11rsSetObject{{.*}}({{.*}} %.rs.param.a{{[02]}}, {{.*}})
9
10// CHECK-SET:    %[[F1:[A-Za-z][A-Za-z0-9]*]] = getelementptr inbounds %struct.Wrapper{{.*}}, %struct.Wrapper{{.*}}* %.rs.param.a3, i{{(32|64)}} 0, i32 0
11// CHECK-SET-NOT: call void @_Z11rsSetObject{{.*}}({{.*}} %.rs.param.a{{[02]}}, {{.*}})
12// CHECK-SET:     call void @_Z11rsSetObjectP13rs_allocationS_(%struct.rs_allocation{{.*}}* %[[F1]], {{.*}})
13// CHECK-SET-NOT: call void @_Z11rsSetObject{{.*}}({{.*}} %.rs.param.a{{[02]}}, {{.*}})
14// CHECK-SET:    %[[F2:[A-Za-z][A-Za-z0-9]*]] = getelementptr inbounds %struct.Wrapper{{.*}}, %struct.Wrapper{{.*}}* %.rs.param.a3, i{{(32|64)}} 0, i32 1
15// CHECK-SET-NOT: call void @_Z11rsSetObject{{.*}}({{.*}} %.rs.param.a{{[02]}}, {{.*}})
16// CHECK-SET:     call void @_Z11rsSetObjectP7rs_typeS_(%struct.rs_type{{.*}}* %[[F2]], {{.*}})
17// CHECK-SET-NOT: call void @_Z11rsSetObject{{.*}}({{.*}} %.rs.param.a{{[02]}}, {{.*}})
18
19// RUN: %rs-filecheck-wrapper %s --check-prefix=CHECK-CLR
20//     Check rsClearObject() calls are properly added.
21
22// CHECK-CLR-DAG:    %[[F10:[A-Za-z][A-Za-z0-9\.]*]] = getelementptr inbounds %struct.Wrapper{{.*}}, %struct.Wrapper{{.*}}* %a3, i{{(32|64)}} 0, i32 0
23// CHECK-CLR-DAG:    %[[F20:[A-Za-z][A-Za-z0-9\.]*]] = getelementptr inbounds %struct.Wrapper{{.*}}, %struct.Wrapper{{.*}}* %a3, i{{(32|64)}} 0, i32 1
24
25// CHECK-CLR-NOT: call void @_Z13rsClearObject{{.*}}({{.*}}* %.rs.param.a{{[02]}})
26// CHECK-CLR:     call void @_Z13rsClearObjectP10rs_element(%struct.rs_element{{.*}}* nonnull %x)
27// CHECK-CLR-NOT: call void @_Z13rsClearObject{{.*}}({{.*}}* %.rs.param.a{{[02]}})
28// CHECK-CLR:     call void @_Z13rsClearObjectP10rs_element(%struct.rs_element{{.*}}* {{.*}}%a1)
29// CHECK-CLR-NOT: call void @_Z13rsClearObject{{.*}}({{.*}}* %.rs.param.a{{[02]}})
30// CHECK-CLR:     call void @_Z13rsClearObjectP13rs_allocation(%struct.rs_allocation{{.*}}* %[[F10]])
31// CHECK-CLR-NOT: call void @_Z13rsClearObject{{.*}}({{.*}}* %.rs.param.a{{[02]}})
32// CHECK-CLR:     call void @_Z13rsClearObjectP7rs_type(%struct.rs_type{{.*}}* %[[F20]])
33// CHECK-CLR-NOT: call void @_Z13rsClearObject{{.*}}({{.*}}* %.rs.param.a{{[02]}})
34
35#pragma version(1)
36#pragma rs java_package_name(ref_count)
37
38static int g0;
39static float g2;
40
41struct Wrapper {
42  rs_allocation f1;
43  rs_type f2;
44  int f3;
45};
46
47static void bar(int a0, rs_element a1, float a2, struct Wrapper a3) {
48  rs_element x = {0};
49  struct Wrapper y = {0};
50  g0 = a0;
51  a1 = x;
52  g2 = a2;
53  a3 = y;
54}
55
56void entrypoint() {
57  rs_element e = {0};
58  struct Wrapper w = {0};
59  bar(3, e, 2.718f, w);
60  if (rsIsObject(e) && rsIsObject(w.f1) && rsIsObject(w.f2)) {
61    rsDebug("good objects", 0);
62  }
63}
64
65
66