cuelang.org/go@v0.13.0/cue/testdata/cycle/023_reentrance.txtar (about) 1 #name: reentrance 2 #evalFull 3 -- in.cue -- 4 // This indirection is needed to avoid binding references to fib 5 // within fib to the instantiated version. 6 fibRec: {nn: int, out: (fib & {n: nn}).out} 7 fib: { 8 n: int 9 10 if n >= 2 { 11 out: (fibRec & {nn: n - 2}).out + (fibRec & {nn: n - 1}).out 12 } 13 if n < 2 { 14 out: n 15 } 16 } 17 fib1: (fib & {n: 1}).out // MAY NOT be an error 18 fib2: (fib & {n: 2}).out // MAY be an error 19 fib3: (fib & {n: 3}).out // SHOULD be an error 20 fib7: (fib & {n: 7}).out // Error 21 fib12: (fib & {n: 12}).out // Error 22 23 -- out/legacy-debug -- 24 <0>{fibRec: <1>{nn: int, out: (<2>.fib & <3>{n: <4>.nn}).out}, fib: <5>{n: int if (<6>.n >= 2) yield <7>{out: ((<2>.fibRec & <8>{nn: (<6>.n - 2)}).out + (<2>.fibRec & <9>{nn: (<6>.n - 1)}).out)}, if (<6>.n < 2) yield <10>{out: <6>.n}}, fib2: 1, fib7: 13, fib12: 144} 25 -- out/compile -- 26 --- in.cue 27 { 28 fibRec: { 29 nn: int 30 out: (〈1;fib〉 & { 31 n: 〈1;nn〉 32 }).out 33 } 34 fib: { 35 n: int 36 if (〈0;n〉 >= 2) { 37 out: ((〈2;fibRec〉 & { 38 nn: (〈2;n〉 - 2) 39 }).out + (〈2;fibRec〉 & { 40 nn: (〈2;n〉 - 1) 41 }).out) 42 } 43 if (〈0;n〉 < 2) { 44 out: 〈1;n〉 45 } 46 } 47 fib1: (〈0;fib〉 & { 48 n: 1 49 }).out 50 fib2: (〈0;fib〉 & { 51 n: 2 52 }).out 53 fib3: (〈0;fib〉 & { 54 n: 3 55 }).out 56 fib7: (〈0;fib〉 & { 57 n: 7 58 }).out 59 fib12: (〈0;fib〉 & { 60 n: 12 61 }).out 62 } 63 -- out/evalalpha/stats -- 64 Leaks: 78 65 Freed: 0 66 Reused: 0 67 Allocs: 78 68 Retain: 0 69 70 Unifications: 62 71 Conjuncts: 140 72 Disjuncts: 0 73 74 CloseIDElems: 0 75 NumCloseIDs: 41 76 -- out/evalalpha -- 77 Errors: 78 structural cycle: 79 ./in.cue:8:9 80 structural cycle: 81 ./in.cue:8:38 82 83 Result: 84 (_|_){ 85 // [structural cycle] 86 fibRec: (struct){ 87 nn: (int){ int } 88 out: (_|_){ 89 // [incomplete] non-concrete value int in operand to >=: 90 // ./in.cue:7:5 91 // ./in.cue:3:35 92 // ./in.cue:5:5 93 // non-concrete value int in operand to <: 94 // ./in.cue:10:5 95 // ./in.cue:3:35 96 // ./in.cue:5:5 97 } 98 } 99 fib: (_|_){ 100 // [incomplete] fib: non-concrete value int in operand to >=: 101 // ./in.cue:7:5 102 // ./in.cue:5:5 103 // fib: non-concrete value int in operand to <: 104 // ./in.cue:10:5 105 // ./in.cue:5:5 106 n: (int){ int } 107 } 108 fib1: (int){ 1 } 109 fib2: (int){ 1 } 110 fib3: (_|_){ 111 // [structural cycle] structural cycle: 112 // ./in.cue:8:9 113 // structural cycle: 114 // ./in.cue:8:38 115 } 116 fib7: (_|_){ 117 // [structural cycle] structural cycle: 118 // ./in.cue:8:9 119 // structural cycle: 120 // ./in.cue:8:38 121 } 122 fib12: (_|_){ 123 // [structural cycle] structural cycle: 124 // ./in.cue:8:9 125 // structural cycle: 126 // ./in.cue:8:38 127 } 128 } 129 -- diff/-out/evalalpha/stats<==>+out/eval/stats -- 130 diff old new 131 --- old 132 +++ new 133 @@ -1,9 +1,12 @@ 134 -Leaks: 16 135 -Freed: 180 136 -Reused: 170 137 -Allocs: 26 138 -Retain: 148 139 - 140 -Unifications: 196 141 -Conjuncts: 464 142 -Disjuncts: 268 143 +Leaks: 78 144 +Freed: 0 145 +Reused: 0 146 +Allocs: 78 147 +Retain: 0 148 + 149 +Unifications: 62 150 +Conjuncts: 140 151 +Disjuncts: 0 152 + 153 +CloseIDElems: 0 154 +NumCloseIDs: 41 155 -- diff/-out/evalalpha<==>+out/eval -- 156 diff old new 157 --- old 158 +++ new 159 @@ -1,7 +1,5 @@ 160 Errors: 161 structural cycle: 162 - ./in.cue:3:25 163 -structural cycle: 164 ./in.cue:8:9 165 structural cycle: 166 ./in.cue:8:38 167 @@ -35,14 +33,12 @@ 168 fib2: (int){ 1 } 169 fib3: (_|_){ 170 // [structural cycle] structural cycle: 171 - // ./in.cue:3:25 172 + // ./in.cue:8:9 173 // structural cycle: 174 // ./in.cue:8:38 175 } 176 fib7: (_|_){ 177 // [structural cycle] structural cycle: 178 - // ./in.cue:3:25 179 - // structural cycle: 180 // ./in.cue:8:9 181 // structural cycle: 182 // ./in.cue:8:38 183 @@ -49,8 +45,6 @@ 184 } 185 fib12: (_|_){ 186 // [structural cycle] structural cycle: 187 - // ./in.cue:3:25 188 - // structural cycle: 189 // ./in.cue:8:9 190 // structural cycle: 191 // ./in.cue:8:38 192 -- diff/todo/p3 -- 193 Note that it is okay for fib2 to fail. 194 -- out/eval/stats -- 195 Leaks: 16 196 Freed: 180 197 Reused: 170 198 Allocs: 26 199 Retain: 148 200 201 Unifications: 196 202 Conjuncts: 464 203 Disjuncts: 268 204 -- out/eval -- 205 Errors: 206 structural cycle: 207 ./in.cue:3:25 208 structural cycle: 209 ./in.cue:8:9 210 structural cycle: 211 ./in.cue:8:38 212 213 Result: 214 (_|_){ 215 // [structural cycle] 216 fibRec: (struct){ 217 nn: (int){ int } 218 out: (_|_){ 219 // [incomplete] non-concrete value int in operand to >=: 220 // ./in.cue:7:5 221 // ./in.cue:3:35 222 // ./in.cue:5:5 223 // non-concrete value int in operand to <: 224 // ./in.cue:10:5 225 // ./in.cue:3:35 226 // ./in.cue:5:5 227 } 228 } 229 fib: (_|_){ 230 // [incomplete] fib: non-concrete value int in operand to >=: 231 // ./in.cue:7:5 232 // ./in.cue:5:5 233 // fib: non-concrete value int in operand to <: 234 // ./in.cue:10:5 235 // ./in.cue:5:5 236 n: (int){ int } 237 } 238 fib1: (int){ 1 } 239 fib2: (int){ 1 } 240 fib3: (_|_){ 241 // [structural cycle] structural cycle: 242 // ./in.cue:3:25 243 // structural cycle: 244 // ./in.cue:8:38 245 } 246 fib7: (_|_){ 247 // [structural cycle] structural cycle: 248 // ./in.cue:3:25 249 // structural cycle: 250 // ./in.cue:8:9 251 // structural cycle: 252 // ./in.cue:8:38 253 } 254 fib12: (_|_){ 255 // [structural cycle] structural cycle: 256 // ./in.cue:3:25 257 // structural cycle: 258 // ./in.cue:8:9 259 // structural cycle: 260 // ./in.cue:8:38 261 } 262 } 263 -- diff/todo/p2 -- 264 Elimination of unnecessary, but potentially useful, errors.