flattened_function_and_inline_matches.adl
1 /* 2 seed = 123456789 3 min_height = 16 4 5 [case] 6 program = "test.alpha" 7 function = "bar" 8 input = ["true", "true", "1u8", "0u8"] 9 [case] 10 program = "test.alpha" 11 function = "bar" 12 input = ["true", "false", "1u8", "1u8"] 13 [case] 14 program = "test.alpha" 15 function = "bar" 16 input = ["false", "true", "2u8", "1u8"] 17 [case] 18 program = "test.alpha" 19 function = "bar" 20 input = ["false", "false", "2u8", "2u8"] 21 [case] 22 program = "test.alpha" 23 function = "blar" 24 input = ["true", "true", "1u8", "0u8"] 25 [case] 26 program = "test.alpha" 27 function = "blar" 28 input = ["true", "false", "1u8", "1u8"] 29 [case] 30 program = "test.alpha" 31 function = "blar" 32 input = ["false", "true", "2u8", "1u8"] 33 [case] 34 program = "test.alpha" 35 function = "blar" 36 input = ["false", "false", "2u8", "2u8"] 37 */ 38 39 // In this test, we expect bar and blar to produce the same result for all inputs. 40 41 program test.alpha { 42 struct Extra { 43 c: u8, 44 } 45 46 struct Data { 47 a: u8, 48 b: u8, 49 c: Extra, 50 } 51 52 inline foo(a: u8, b: u8, input: Data) -> (u8, u8, Data) { 53 let extra: Extra = Extra { c: a }; 54 let data: Data = Data { a: a, b: b, c: extra }; 55 if (a == b) { 56 return (a, b, data); 57 } 58 let c: u8 = a + b; 59 let d: u8 = a - b; 60 c = c + input.a; 61 d = d + input.b; 62 63 return (c, d, data); 64 } 65 66 function floo(a: u8, b: u8, input: Data) -> (u8, u8, Data) { 67 let extra: Extra = Extra { c: a }; 68 let data: Data = Data { a: a, b: b, c: extra }; 69 if (a == b) { 70 return (a, b, data); 71 } 72 let c: u8 = a + b; 73 let d: u8 = a - b; 74 c = c + input.a; 75 d = d + input.b; 76 77 return (c, d, data); 78 } 79 80 transition bar(flag1: bool, flag2: bool, a: u8, b: u8) -> (u8, u8, Data) { 81 let data: Data = Data { a: a, b: b, c: Extra { c: a } }; 82 let start: (u8, u8, Data) = foo(a, b, data); 83 // (2, 1, Data { a: 1, b: 0, c: Extra { c: 1 } }) 84 if flag1 { 85 // foo (2, 1, Data { a: 1, b: 0, c: Extra { c: 1 } }) 86 start = foo(start.0, start.2.c.c, start.2); 87 // 88 } else { 89 if flag2 { 90 // foo (1, 0, Data { a: 1, b: 0, c: Extra { c: 1 } }) 91 start = foo(start.1, start.2.b, start.2); 92 } else { 93 // foo (1, 1, Data { a: 1, b: 0, c: Extra { c: 1 } }) 94 start = foo(start.2.a, start.1, start.2); 95 } 96 } 97 return start; 98 } 99 100 transition blar(flag1: bool, flag2: bool, a: u8, b: u8) -> (u8, u8, Data) { 101 let data: Data = Data { a: a, b: b, c: Extra { c: a } }; 102 103 let start: (u8, u8, Data) = floo(a, b, data); 104 if flag1 { 105 start = floo(start.0, start.2.c.c, start.2); 106 } else { 107 if flag2 { 108 start = floo(start.1, start.2.b, start.2); 109 } else { 110 start = floo(start.2.a, start.1, start.2); 111 } 112 } 113 return start; 114 } 115 116 @noupgrade 117 async constructor() {} 118 119 }