1/*#pragma settings DebugTrace*/ 2 3uniform half4 colorRed, colorGreen; 4 5// Should return 5 6const int kZero = 0; 7int return_loop(int five) { 8 for (int i = kZero; i < 10; ++i) { 9 if (i == five) { return i; } 10 } 11 return 0; 12} 13 14// Should return 35 15const int kTen = kZero + 10; 16int continue_loop(int five) { 17 int sum = 0; 18 for (int i = 0; i < kTen; ++i) { 19 if (i < five) { continue; } 20 sum += i; 21 } 22 return sum; 23} 24 25// Should return 15 26int break_loop(int five) { 27 int sum = 0; 28 const int kOne = 1; 29 for (int i = 0; i < 10; i += kOne) { 30 if (i > five) { break; } 31 sum += i; 32 } 33 return sum; 34} 35 36bool loop_operator_le() { 37 // These loops are inside-out and execute zero times. 38 for (int i = 3; i <= 1; ++i) { return false; } 39 for (int i = 3; i <= 1; --i) { return false; } 40 for (int i = 1; i <= 0; ++i) { return false; } 41 42 // This loop is not inside-out and should execute exactly one time. 43 int4 result = int4(8); 44 for (int i = 0; i <= 0; ++i) { result += int4(1); } 45 46 // This loop executes three times. 47 for (int i = 1; i <= 3; ++i) { 48 result = int4(result.yzw, i); 49 } 50 return result == int4(9, 1, 2, 3); 51} 52 53bool loop_operator_lt() { 54 // These loops are inside-out and execute zero times. 55 for (int i = 4; i < 1; ++i) { return false; } 56 for (int i = 4; i < 1; --i) { return false; } 57 for (int i = 1; i < 1; ++i) { return false; } 58 59 // This loop is not inside-out and should execute exactly one time. 60 int4 result = int4(8); 61 for (int i = 0; i < 1; ++i) { result += int4(1); } 62 63 // This loop executes three times. 64 for (int i = 1; i < 4; ++i) { 65 result = int4(result.yzw, i); 66 } 67 return result == int4(9, 1, 2, 3); 68} 69 70bool loop_operator_ge() { 71 // These loops are inside-out and execute zero times. 72 for (int i = 1; i >= 3; ++i) { return false; } 73 for (int i = 1; i >= 3; --i) { return false; } 74 for (int i = 0; i >= 1; --i) { return false; } 75 76 // This loop is not inside-out and should execute exactly one time. 77 int4 result = int4(8); 78 for (int i = 0; i >= 0; --i) { result += int4(1); } 79 80 // This loop executes three times. 81 for (int i = 3; i >= 1; --i) { 82 result = int4(result.yzw, i); 83 } 84 return result == int4(9, 3, 2, 1); 85} 86 87bool loop_operator_gt() { 88 // These loops are inside-out and execute zero times. 89 for (int i = 0; i > 3; ++i) { return false; } 90 for (int i = 0; i > 3; --i) { return false; } 91 for (int i = 1; i > 1; --i) { return false; } 92 93 // This loop is not inside-out and should execute exactly one time. 94 int4 result = int4(8); 95 for (int i = 1; i > 0; --i) { result += int4(1); } 96 97 for (int i = 3; i > 0; --i) { 98 result = int4(result.yzw, i); 99 } 100 return result == int4(9, 3, 2, 1); 101} 102 103bool loop_operator_ne() { 104 // This loop executes zero times. 105 for (int i = 1; i != 1; ++i) { return false; } 106 107 // This loop should execute exactly one time. 108 int4 result = int4(8); 109 for (int i = 1; i != 2; ++i) { result += int4(1); } 110 111 for (int i = 1; i != 4; ++i) { 112 result = int4(result.yzw, i); 113 } 114 return result == int4(9, 1, 2, 3); 115} 116 117bool loop_operator_eq() { 118 // This loop executes zero times. 119 for (int i = 1; i == 2; ++i) { return false; } 120 121 // This loop should execute exactly one time. 122 int4 result = int4(9); 123 for (int i = 1; i == 1; ++i) { 124 result = int4(result.yzw, i); 125 } 126 return result == int4(9, 9, 9, 1); 127} 128 129half4 main(float2 pos) { 130 int five = int(clamp(pos.x, colorGreen.g, colorGreen.a)) * 5; 131 132 // We pass a literal 5 into `break_loop` instead of the variable `five` as a workaround for 133 // a Metal crash bug in macOS 12. (skia:13005; Apple FB9937818) 134 return (return_loop(five) == 5 && continue_loop(five) == 35 && break_loop(5) == 15 && 135 loop_operator_le() && loop_operator_lt() && 136 loop_operator_ge() && loop_operator_gt() && 137 loop_operator_eq() && loop_operator_ne()) ? colorGreen : colorRed; 138} 139