1617a3babSopenharmony_ci#version 450
2617a3babSopenharmony_ci
3617a3babSopenharmony_cistruct T {
4617a3babSopenharmony_ci  float f1;
5617a3babSopenharmony_ci  float f2;
6617a3babSopenharmony_ci};
7617a3babSopenharmony_ci
8617a3babSopenharmony_ciout B1 {precise T s; float x;} partial_precise_block;
9617a3babSopenharmony_ciprecise out B2 {T s; float x;} all_precise_block;
10617a3babSopenharmony_ci
11617a3babSopenharmony_cifloat struct_member() {
12617a3babSopenharmony_ci  float a = 1.0;
13617a3babSopenharmony_ci  float b = 2.0;
14617a3babSopenharmony_ci  float c = 3.0;
15617a3babSopenharmony_ci  float d = 4.0;
16617a3babSopenharmony_ci
17617a3babSopenharmony_ci  precise float result;
18617a3babSopenharmony_ci
19617a3babSopenharmony_ci  T S, S2, S3;
20617a3babSopenharmony_ci
21617a3babSopenharmony_ci  S2.f1 = a + 0.2;      // NoContraction
22617a3babSopenharmony_ci  S2.f2 = b + 0.2;      // NOT NoContraction
23617a3babSopenharmony_ci  S3.f1 = a + b;        // NOT NoContraction
24617a3babSopenharmony_ci  S = S2;               // "precise" propagated through parent object nodes
25617a3babSopenharmony_ci  result = S.f1 + 0.1;  // the ADD operation should be NoContraction
26617a3babSopenharmony_ci
27617a3babSopenharmony_ci  return result;
28617a3babSopenharmony_ci}
29617a3babSopenharmony_ci
30617a3babSopenharmony_cifloat complex_array_struct() {
31617a3babSopenharmony_ci  precise float result;
32617a3babSopenharmony_ci  struct T1 {
33617a3babSopenharmony_ci    float t1_array[3];
34617a3babSopenharmony_ci    float t1_scalar;
35617a3babSopenharmony_ci  };
36617a3babSopenharmony_ci  struct T2 {
37617a3babSopenharmony_ci    T1 t1a[5];
38617a3babSopenharmony_ci    T1 t1b[6];
39617a3babSopenharmony_ci    T1 t1c[7];
40617a3babSopenharmony_ci  };
41617a3babSopenharmony_ci  struct T3 {float f; T2 t2; vec4 v; int p;};
42617a3babSopenharmony_ci  T3 t3[10];
43617a3babSopenharmony_ci  for(int i=0; i<10; i++) {
44617a3babSopenharmony_ci    t3[i].f = i / 3.0; // Not NoContraction
45617a3babSopenharmony_ci    t3[i].v = vec4(i * 1.5); // NoContraction
46617a3babSopenharmony_ci    t3[i].p = i + 1;
47617a3babSopenharmony_ci    for(int j=0; j<5; j++) {
48617a3babSopenharmony_ci      for(int k = 0; k<3; k++) {
49617a3babSopenharmony_ci        t3[i].t2.t1a[j].t1_array[k] = i * j + k; // Not NoContraction
50617a3babSopenharmony_ci      }
51617a3babSopenharmony_ci      t3[i].t2.t1a[j].t1_scalar = j * 2.0 / i; // Not NoContration
52617a3babSopenharmony_ci    }
53617a3babSopenharmony_ci
54617a3babSopenharmony_ci    for(int j=0; j<6; j++) {
55617a3babSopenharmony_ci      for(int k = 0; k<3; k++) {
56617a3babSopenharmony_ci        t3[i].t2.t1b[j].t1_array[k] = i * j + k; // Not NoContraction
57617a3babSopenharmony_ci      }
58617a3babSopenharmony_ci      t3[i].t2.t1b[j].t1_scalar = j * 2.0 / i; // NoContraction
59617a3babSopenharmony_ci    }
60617a3babSopenharmony_ci
61617a3babSopenharmony_ci    for(int j=0; j<6; j++) {
62617a3babSopenharmony_ci      for(int k = 0; k<3; k++) {
63617a3babSopenharmony_ci        t3[i].t2.t1c[j].t1_array[k] = i * j + k; // Not NoContraction because all operands are integers
64617a3babSopenharmony_ci      }
65617a3babSopenharmony_ci      t3[i].t2.t1c[j].t1_scalar = j * 2.0 / i; // Not NoContraction
66617a3babSopenharmony_ci    }
67617a3babSopenharmony_ci  }
68617a3babSopenharmony_ci  int i = 2;
69617a3babSopenharmony_ci  result = t3[5].t2.t1c[6].t1_array[1]
70617a3babSopenharmony_ci           + t3[2].t2.t1b[1].t1_scalar
71617a3babSopenharmony_ci           + t3[i - 1].v.xy.x; // NoContraction
72617a3babSopenharmony_ci  return result;
73617a3babSopenharmony_ci}
74617a3babSopenharmony_ci
75617a3babSopenharmony_cifloat out_block() {
76617a3babSopenharmony_ci    float a = 0.1;
77617a3babSopenharmony_ci    float b = 0.2;
78617a3babSopenharmony_ci    partial_precise_block.s.f1 = a + b; // NoContraction
79617a3babSopenharmony_ci    partial_precise_block.s.f2 = a - b; // NoContraction
80617a3babSopenharmony_ci    partial_precise_block.x = a * b; // Not NoContraction
81617a3babSopenharmony_ci
82617a3babSopenharmony_ci    all_precise_block.s.f1 = a + b + 1.0; // NoContraction
83617a3babSopenharmony_ci    all_precise_block.s.f2 = a - b - 1.0; // NoContraction
84617a3babSopenharmony_ci    all_precise_block.x = a * b * 2.0; // Also NoContraction
85617a3babSopenharmony_ci
86617a3babSopenharmony_ci    return a + b; // Not NoContraction
87617a3babSopenharmony_ci}
88617a3babSopenharmony_ci
89617a3babSopenharmony_civoid main(){}
90