cuelang.org/go@v0.13.0/cue/testdata/cycle/051_resolved_self-reference_cycles_with_disjunction.txtar (about) 1 #name: resolved self-reference cycles with disjunction 2 #evalPartial 3 4 // TODO(cycle) 5 // 6 // Some of these examples used to work, but the changes corresponding to this 7 // addition, it ceased to do so. Fixing these cycle issues seemed more 8 // important than keeping this esoteric case working, which was already broken 9 // in the last release anyway. 10 // 11 // Reproducer of underlying problem. Still works, but triggers unexpected 12 // condition. 13 // 14 // xb1: xb2 15 // xb2: xb3 16 // xb3: xb2 + 0 17 18 -- in.cue -- 19 // The second disjunct in xa1 is not resolvable and can be 20 // eliminated: 21 // xa4 & 9 22 // (xa2 + 2) & 9 23 // ((xa3 + 2) + 2) & 9 24 // (((6 & xa1-2) + 2) + 2) & 9 25 // ((6 + 2) + 2) & 9 // 6 == xa1-2 26 // 10 & 9 => _|_ 27 // The remaining values resolve. 28 xa1: (xa2 & 8) | (xa4 & 9) 29 xa2: xa3 + 2 30 xa3: 6 & xa1-2 31 xa4: xa2 + 2 32 33 xb1: (xb2 & 8) | (xb4 & 9) 34 xb2: xb3 + 2 35 xb3: (6 & (xb1 - 2)) | (xb4 & 9) 36 xb4: xb2 + 2 37 38 // Another variant with more disjunctions. xc1 remains with two 39 // possibilities. Technically, only the first value is valid. 40 // However, to fully determine that, all options of the remaining 41 // disjunction will have to be evaluated algebraically, which is 42 // not done. 43 xc1: xc2 & 8 | xc4 & 9 | xc5 & 9 44 xc2: xc3 + 2 45 xc3: 6 & xc1-2 46 xc4: xc2 + 1 47 xc5: xc2 + 2 48 49 // The below is resolved by setting xd1 explicitly. 50 xd1: xd2 & 8 | xd4 & 9 | xd5 & 9 51 xd2: xd3 + 2 52 xd3: 6 & xd1-2 53 xd4: xd2 + 1 54 xd5: xd2 + 2 55 xd1: 8 56 57 // The below is resolved by setting xd1 explicitly to the wrong 58 // value, resulting in an error. 59 xe1: xe2 & 8 | xe4 & 9 | xe5 & 9 60 xe2: xe3 + 2 61 xe3: 6 & xe1-2 62 xe4: xe2 + 1 63 xe5: xe2 + 2 64 xe1: 9 65 66 xf1: xf2 & 8 | xf4 & 9 67 xf2: xf3 + 2 68 xf3: 6 & xf1-2 | xf4 & 9 69 xf4: xf2 + 2 70 71 z1: z2+1 | z3+5 // +3 for fun 72 z2: z3 + 2 73 z3: z1 - 3 74 z3: 8 75 -- out/def -- 76 // The second disjunct in xa1 is not resolvable and can be 77 // eliminated: 78 // xa4 & 9 79 // (xa2 + 2) & 9 80 // ((xa3 + 2) + 2) & 9 81 // (((6 & xa1-2) + 2) + 2) & 9 82 // ((6 + 2) + 2) & 9 // 6 == xa1-2 83 // 10 & 9 => _|_ 84 // The remaining values resolve. 85 xa1: 8 86 xa2: 8 87 xa4: 10 88 xa3: 6 89 90 // The second disjunct in xb4 can be eliminated as both disjuncts 91 // of xb3 result in an incompatible sum when substituted. 92 xb1: 8 93 xb2: 8 94 xb4: 10 95 xb3: 6 96 97 // Another variant with more disjunctions. xc1 remains with two 98 // possibilities. Technically, only the first value is valid. 99 // However, to fully determine that, all options of the remaining 100 // disjunction will have to be evaluated algebraically, which is 101 // not done. 102 xc1: xc2 & 8 | xc4 & 9 | xc5 & 9 103 xc2: xc3 + 2 104 xc4: xc2 + 1 105 xc5: xc2 + 2 106 xc3: 6 & xc1-2 107 108 // The above is resolved by setting xd1 explicitly. 109 xd1: 8 110 xd2: 8 111 xd4: 9 112 xd5: 10 113 xd3: 6 114 115 // The above is resolved by setting xd1 explicitly to the wrong 116 // value, resulting in an error. 117 xe1: _|_ // conflicting values 6 and 7 118 xe2: _|_ // conflicting values 6 and 7 119 xe4: _|_ // conflicting values 6 and 7 120 xe5: _|_ // conflicting values 6 and 7 121 xe3: _|_ // conflicting values 6 and 7 122 123 // Only one solution. 124 xf1: 8 125 xf2: 8 126 xf4: 10 127 xf3: 6 128 z1: z2+1 | z3+5 129 z2: z3 + 2 130 z3: z1-3 & 8 131 -- out/legacy-debug -- 132 <0>{xa1: 8, xa2: 8, xa4: 10, xa3: 6, xb1: 8, xb2: 8, xb4: 10, xb3: 6, xc1: ((<1>.xc2 & 8) | (<1>.xc4 & 9) | (<1>.xc5 & 9)), xc2: (<1>.xc3 + 2), xc4: (<1>.xc2 + 1), xc5: (<1>.xc2 + 2), xc3: (6 & (<1>.xc1 - 2)), xd1: 8, xd2: 8, xd4: 9, xd5: 10, xd3: 6, xe1: _|_((6 & 7):conflicting values 6 and 7), xe2: _|_((6 & 7):conflicting values 6 and 7), xe4: _|_((6 & 7):conflicting values 6 and 7), xe5: _|_((6 & 7):conflicting values 6 and 7), xe3: _|_((6 & 7):conflicting values 6 and 7), xf1: 8, xf2: 8, xf4: 10, xf3: 6, z1: ((<1>.z2 + 1) | (<1>.z3 + 5)), z2: (<1>.z3 + 2), z3: ((<1>.z1 - 3) & 8)} 133 -- out/compile -- 134 --- in.cue 135 { 136 xa1: ((〈0;xa2〉 & 8)|(〈0;xa4〉 & 9)) 137 xa2: (〈0;xa3〉 + 2) 138 xa3: (6 & (〈0;xa1〉 - 2)) 139 xa4: (〈0;xa2〉 + 2) 140 xb1: ((〈0;xb2〉 & 8)|(〈0;xb4〉 & 9)) 141 xb2: (〈0;xb3〉 + 2) 142 xb3: ((6 & (〈0;xb1〉 - 2))|(〈0;xb4〉 & 9)) 143 xb4: (〈0;xb2〉 + 2) 144 xc1: ((〈0;xc2〉 & 8)|(〈0;xc4〉 & 9)|(〈0;xc5〉 & 9)) 145 xc2: (〈0;xc3〉 + 2) 146 xc3: (6 & (〈0;xc1〉 - 2)) 147 xc4: (〈0;xc2〉 + 1) 148 xc5: (〈0;xc2〉 + 2) 149 xd1: ((〈0;xd2〉 & 8)|(〈0;xd4〉 & 9)|(〈0;xd5〉 & 9)) 150 xd2: (〈0;xd3〉 + 2) 151 xd3: (6 & (〈0;xd1〉 - 2)) 152 xd4: (〈0;xd2〉 + 1) 153 xd5: (〈0;xd2〉 + 2) 154 xd1: 8 155 xe1: ((〈0;xe2〉 & 8)|(〈0;xe4〉 & 9)|(〈0;xe5〉 & 9)) 156 xe2: (〈0;xe3〉 + 2) 157 xe3: (6 & (〈0;xe1〉 - 2)) 158 xe4: (〈0;xe2〉 + 1) 159 xe5: (〈0;xe2〉 + 2) 160 xe1: 9 161 xf1: ((〈0;xf2〉 & 8)|(〈0;xf4〉 & 9)) 162 xf2: (〈0;xf3〉 + 2) 163 xf3: ((6 & (〈0;xf1〉 - 2))|(〈0;xf4〉 & 9)) 164 xf4: (〈0;xf2〉 + 2) 165 z1: ((〈0;z2〉 + 1)|(〈0;z3〉 + 5)) 166 z2: (〈0;z3〉 + 2) 167 z3: (〈0;z1〉 - 3) 168 z3: 8 169 } 170 -- out/eval/stats -- 171 Leaks: 0 172 Freed: 52 173 Reused: 44 174 Allocs: 8 175 Retain: 24 176 177 Unifications: 31 178 Conjuncts: 128 179 Disjuncts: 60 180 -- out/evalalpha -- 181 Errors: 182 xe3: conflicting values 7 and 6: 183 ./in.cue:43:6 184 ./in.cue:43:10 185 186 Result: 187 (_|_){ 188 // [eval] 189 xa1: (int){ 8 } 190 xa2: (int){ 8 } 191 xa3: (int){ 6 } 192 xa4: (int){ 10 } 193 xb1: (_|_){ 194 // [cycle] xb1: 4 errors in empty disjunction: 195 // xb2: unresolved disjunction: xb3: 196 // ./in.cue:16:6 197 // xb3: 3 errors in empty disjunction:: 198 // ./in.cue:16:6 199 // xb3: unresolved disjunction: xb1: 200 // ./in.cue:17:12 201 // xb3: cycle with field: xb2: 202 // ./in.cue:18:6 203 } 204 xb2: (_|_){ 205 // [cycle] xb2: unresolved disjunction: xb3: 206 // ./in.cue:16:6 207 // xb3: cycle with field: xb2: 208 // ./in.cue:18:6 209 } 210 xb3: (_|_){ 211 // [cycle] xb2: unresolved disjunction: xb3: 212 // ./in.cue:16:6 213 // xb3: 3 errors in empty disjunction:: 214 // ./in.cue:16:6 215 // xb3: unresolved disjunction: xb1: 216 // ./in.cue:17:12 217 // xb3: cycle with field: xb2: 218 // ./in.cue:18:6 219 } 220 xb4: (_|_){ 221 // [cycle] xb2: unresolved disjunction: xb3: 222 // ./in.cue:16:6 223 // xb3: cycle with field: xb2: 224 // ./in.cue:18:6 225 } 226 xc1: (int){ |((int){ 8 }, (int){ 9 }) } 227 xc2: (int){ 8 } 228 xc3: (_|_){ 229 // [incomplete] xc3: unresolved disjunction 8 | 9 (type int): 230 // ./in.cue:27:10 231 } 232 xc4: (int){ 9 } 233 xc5: (int){ 10 } 234 xd1: (int){ 8 } 235 xd2: (int){ 8 } 236 xd3: (int){ 6 } 237 xd4: (int){ 9 } 238 xd5: (int){ 10 } 239 xe1: (int){ 9 } 240 xe2: (int){ 8 } 241 xe3: (_|_){ 242 // [eval] xe3: conflicting values 7 and 6: 243 // ./in.cue:43:6 244 // ./in.cue:43:10 245 } 246 xe4: (int){ 9 } 247 xe5: (int){ 10 } 248 xf1: (_|_){ 249 // [cycle] xf1: 4 errors in empty disjunction: 250 // xf2: unresolved disjunction: xf3: 251 // ./in.cue:49:6 252 // xf3: 3 errors in empty disjunction:: 253 // ./in.cue:49:6 254 // xf3: unresolved disjunction: xf1: 255 // ./in.cue:50:10 256 // xf3: cycle with field: xf2: 257 // ./in.cue:51:6 258 } 259 xf2: (_|_){ 260 // [cycle] xf2: unresolved disjunction: xf3: 261 // ./in.cue:49:6 262 // xf3: cycle with field: xf2: 263 // ./in.cue:51:6 264 } 265 xf3: (_|_){ 266 // [cycle] xf2: unresolved disjunction: xf3: 267 // ./in.cue:49:6 268 // xf3: 3 errors in empty disjunction:: 269 // ./in.cue:49:6 270 // xf3: unresolved disjunction: xf1: 271 // ./in.cue:50:10 272 // xf3: cycle with field: xf2: 273 // ./in.cue:51:6 274 } 275 xf4: (_|_){ 276 // [cycle] xf2: unresolved disjunction: xf3: 277 // ./in.cue:49:6 278 // xf3: cycle with field: xf2: 279 // ./in.cue:51:6 280 } 281 z1: (int){ |((int){ 11 }, (int){ 13 }) } 282 z2: (int){ 10 } 283 z3: (_|_){ 284 // [incomplete] z3: unresolved disjunction 11 | 13 (type int): 285 // ./in.cue:55:5 286 } 287 } 288 -- diff/-out/evalalpha<==>+out/eval -- 289 diff old new 290 --- old 291 +++ new 292 @@ -11,20 +11,37 @@ 293 xa3: (int){ 6 } 294 xa4: (int){ 10 } 295 xb1: (_|_){ 296 - // [incomplete] xb1: 2 errors in empty disjunction: 297 - // xb1: unresolved disjunction 6 | 9 (type int): 298 - // ./in.cue:16:6 299 - // xb2: unresolved disjunction 6 | 9 (type int): 300 - // ./in.cue:16:6 301 + // [cycle] xb1: 4 errors in empty disjunction: 302 + // xb2: unresolved disjunction: xb3: 303 + // ./in.cue:16:6 304 + // xb3: 3 errors in empty disjunction:: 305 + // ./in.cue:16:6 306 + // xb3: unresolved disjunction: xb1: 307 + // ./in.cue:17:12 308 + // xb3: cycle with field: xb2: 309 + // ./in.cue:18:6 310 } 311 xb2: (_|_){ 312 - // [incomplete] xb2: unresolved disjunction 6 | 9 (type int): 313 - // ./in.cue:16:6 314 - } 315 - xb3: (int){ |((int){ 6 }, (int){ 9 }) } 316 + // [cycle] xb2: unresolved disjunction: xb3: 317 + // ./in.cue:16:6 318 + // xb3: cycle with field: xb2: 319 + // ./in.cue:18:6 320 + } 321 + xb3: (_|_){ 322 + // [cycle] xb2: unresolved disjunction: xb3: 323 + // ./in.cue:16:6 324 + // xb3: 3 errors in empty disjunction:: 325 + // ./in.cue:16:6 326 + // xb3: unresolved disjunction: xb1: 327 + // ./in.cue:17:12 328 + // xb3: cycle with field: xb2: 329 + // ./in.cue:18:6 330 + } 331 xb4: (_|_){ 332 - // [incomplete] xb2: unresolved disjunction 6 | 9 (type int): 333 - // ./in.cue:16:6 334 + // [cycle] xb2: unresolved disjunction: xb3: 335 + // ./in.cue:16:6 336 + // xb3: cycle with field: xb2: 337 + // ./in.cue:18:6 338 } 339 xc1: (int){ |((int){ 8 }, (int){ 9 }) } 340 xc2: (int){ 8 } 341 @@ -49,20 +66,37 @@ 342 xe4: (int){ 9 } 343 xe5: (int){ 10 } 344 xf1: (_|_){ 345 - // [incomplete] xf1: 2 errors in empty disjunction: 346 - // xf1: unresolved disjunction 6 | 9 (type int): 347 - // ./in.cue:49:6 348 - // xf2: unresolved disjunction 6 | 9 (type int): 349 - // ./in.cue:49:6 350 + // [cycle] xf1: 4 errors in empty disjunction: 351 + // xf2: unresolved disjunction: xf3: 352 + // ./in.cue:49:6 353 + // xf3: 3 errors in empty disjunction:: 354 + // ./in.cue:49:6 355 + // xf3: unresolved disjunction: xf1: 356 + // ./in.cue:50:10 357 + // xf3: cycle with field: xf2: 358 + // ./in.cue:51:6 359 } 360 xf2: (_|_){ 361 - // [incomplete] xf2: unresolved disjunction 6 | 9 (type int): 362 - // ./in.cue:49:6 363 - } 364 - xf3: (int){ |((int){ 6 }, (int){ 9 }) } 365 + // [cycle] xf2: unresolved disjunction: xf3: 366 + // ./in.cue:49:6 367 + // xf3: cycle with field: xf2: 368 + // ./in.cue:51:6 369 + } 370 + xf3: (_|_){ 371 + // [cycle] xf2: unresolved disjunction: xf3: 372 + // ./in.cue:49:6 373 + // xf3: 3 errors in empty disjunction:: 374 + // ./in.cue:49:6 375 + // xf3: unresolved disjunction: xf1: 376 + // ./in.cue:50:10 377 + // xf3: cycle with field: xf2: 378 + // ./in.cue:51:6 379 + } 380 xf4: (_|_){ 381 - // [incomplete] xf2: unresolved disjunction 6 | 9 (type int): 382 - // ./in.cue:49:6 383 + // [cycle] xf2: unresolved disjunction: xf3: 384 + // ./in.cue:49:6 385 + // xf3: cycle with field: xf2: 386 + // ./in.cue:51:6 387 } 388 z1: (int){ |((int){ 11 }, (int){ 13 }) } 389 z2: (int){ 10 } 390 -- out/eval -- 391 Errors: 392 xe3: conflicting values 7 and 6: 393 ./in.cue:43:6 394 ./in.cue:43:10 395 396 Result: 397 (_|_){ 398 // [eval] 399 xa1: (int){ 8 } 400 xa2: (int){ 8 } 401 xa3: (int){ 6 } 402 xa4: (int){ 10 } 403 xb1: (_|_){ 404 // [incomplete] xb1: 2 errors in empty disjunction: 405 // xb1: unresolved disjunction 6 | 9 (type int): 406 // ./in.cue:16:6 407 // xb2: unresolved disjunction 6 | 9 (type int): 408 // ./in.cue:16:6 409 } 410 xb2: (_|_){ 411 // [incomplete] xb2: unresolved disjunction 6 | 9 (type int): 412 // ./in.cue:16:6 413 } 414 xb3: (int){ |((int){ 6 }, (int){ 9 }) } 415 xb4: (_|_){ 416 // [incomplete] xb2: unresolved disjunction 6 | 9 (type int): 417 // ./in.cue:16:6 418 } 419 xc1: (int){ |((int){ 8 }, (int){ 9 }) } 420 xc2: (int){ 8 } 421 xc3: (_|_){ 422 // [incomplete] xc3: unresolved disjunction 8 | 9 (type int): 423 // ./in.cue:27:10 424 } 425 xc4: (int){ 9 } 426 xc5: (int){ 10 } 427 xd1: (int){ 8 } 428 xd2: (int){ 8 } 429 xd3: (int){ 6 } 430 xd4: (int){ 9 } 431 xd5: (int){ 10 } 432 xe1: (int){ 9 } 433 xe2: (int){ 8 } 434 xe3: (_|_){ 435 // [eval] xe3: conflicting values 7 and 6: 436 // ./in.cue:43:6 437 // ./in.cue:43:10 438 } 439 xe4: (int){ 9 } 440 xe5: (int){ 10 } 441 xf1: (_|_){ 442 // [incomplete] xf1: 2 errors in empty disjunction: 443 // xf1: unresolved disjunction 6 | 9 (type int): 444 // ./in.cue:49:6 445 // xf2: unresolved disjunction 6 | 9 (type int): 446 // ./in.cue:49:6 447 } 448 xf2: (_|_){ 449 // [incomplete] xf2: unresolved disjunction 6 | 9 (type int): 450 // ./in.cue:49:6 451 } 452 xf3: (int){ |((int){ 6 }, (int){ 9 }) } 453 xf4: (_|_){ 454 // [incomplete] xf2: unresolved disjunction 6 | 9 (type int): 455 // ./in.cue:49:6 456 } 457 z1: (int){ |((int){ 11 }, (int){ 13 }) } 458 z2: (int){ 10 } 459 z3: (_|_){ 460 // [incomplete] z3: unresolved disjunction 11 | 13 (type int): 461 // ./in.cue:55:5 462 } 463 }