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