cuelang.org/go@v0.13.0/cue/testdata/cycle/freeze.txtar (about) 1 // This files tests that values are properly "frozen" in case of mutual 2 // references. Non-structural cyclic references are okay, as long a property 3 // that is dependended upon in the cycle is not changed after the fact, 4 // that is, a value may not become more specific after it is used. 5 -- in.cue -- 6 freezing: t1: ok: { 7 #a: x: "a" 8 len(#a) // 1 9 } 10 11 -- comprehension.cue -- 12 // This should be an incomplete error, as z is inserted in x, over which the 13 // comprehension loops. Adding a field z to x would fix this. 14 // This test would fail in the old evaluator, depending on ordering. 15 comprehension: t1: _ 16 comprehension: t1: ok: p0: { 17 x: y: {} 18 // order of comprehensions matter in old evaluator. 19 for _ in x { 20 if true { x: z: a: {} } 21 } 22 if true { 23 if true { x: z: a: {} } 24 } 25 } 26 27 comprehension: t1: ok: p1: { 28 for _ in x { 29 if true { x: z: a: {} } 30 } 31 x: y: {} 32 if true { 33 if true { x: z: a: {} } 34 } 35 } 36 37 comprehension: t1: ok: p2: { 38 for _ in x { 39 if true { x: z: a: {} } 40 } 41 if true { 42 if true { x: z: a: {} } 43 } 44 x: y: {} 45 } 46 47 comprehension: t1: ok: p3: { 48 x: y: {} 49 if true { 50 if true { x: z: a: {} } 51 } 52 for _ in x { 53 if true { x: z: a: {} } 54 } 55 } 56 57 comprehension: t1: ok: p4: { 58 if true { 59 if true { x: z: a: {} } 60 } 61 x: y: {} 62 for _ in x { 63 if true { x: z: a: {} } 64 } 65 } 66 67 comprehension: t1: ok: p5: { 68 if true { 69 if true { x: z: a: {} } 70 } 71 for _ in x { 72 if true { x: z: a: {} } 73 } 74 x: y: {} 75 } 76 77 78 comprehension: t2: err: { 79 a: { 80 x: 1 81 for k, v in a { 82 (k+"q"): v // This increases the set of fields in a. 83 } 84 } 85 } 86 87 comprehension: t3: err: { 88 // mutual dependencies not okay in this case, as the set of fields grows. 89 a: x: 1 90 b: y: 1 91 a: { 92 for k, v in b { 93 (k+"q"): v 94 } 95 } 96 b: { 97 for k, v in a { 98 (k): v 99 } 100 } 101 } 102 103 comprehension: t4: ok: { 104 // It is okay to make x more specific as long as no fields are added. 105 x: y: {} 106 for _ in x { 107 if true { x: y: a: {} } 108 } 109 } 110 111 comprehension: moreSpecific: ok: { 112 a: { 113 x: int 114 for k, v in a { 115 (k): 1 116 } 117 } 118 } 119 120 comprehension: moreSpecific: err: { 121 a: { 122 x: {y: 1} 123 // len(v) should free the size of x. 124 for k, v in a if len(v) > 0 { 125 (k): {z: 1} 126 } 127 } 128 } 129 -- issue3178.cue -- 130 issue3178: { 131 // This should pass. Reasoning: 132 // - second comprehension runs 133 // - in order to satisfy, first comprehension must run 134 // - first comprehension runs and completes 135 input: [ "Value" ] 136 output: {...} 137 for name in input { 138 output: "\(name)": true 139 } 140 for name, v in output { 141 } 142 } 143 -- out/eval/stats -- 144 Leaks: 14 145 Freed: 58 146 Reused: 51 147 Allocs: 21 148 Retain: 15 149 150 Unifications: 72 151 Conjuncts: 127 152 Disjuncts: 83 153 -- out/evalalpha -- 154 Errors: 155 comprehension.t2.err.a: adding field xq not allowed as field set was already referenced: 156 ./comprehension.cue:71:13 157 comprehension.t3.err.a: adding field xq not allowed as field set was already referenced: 158 ./comprehension.cue:82:13 159 comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced: 160 ./comprehension.cue:114:9 161 162 Result: 163 (_|_){ 164 // [eval] 165 comprehension: (_|_){ 166 // [eval] 167 t1: (struct){ 168 ok: (struct){ 169 p0: (struct){ 170 x: (struct){ 171 y: (struct){ 172 } 173 z: (struct){ 174 a: (struct){ 175 } 176 } 177 } 178 } 179 p1: (struct){ 180 x: (struct){ 181 y: (struct){ 182 } 183 z: (struct){ 184 a: (struct){ 185 } 186 } 187 } 188 } 189 p2: (struct){ 190 x: (struct){ 191 y: (struct){ 192 } 193 z: (struct){ 194 a: (struct){ 195 } 196 } 197 } 198 } 199 p3: (struct){ 200 x: (struct){ 201 y: (struct){ 202 } 203 z: (struct){ 204 a: (struct){ 205 } 206 } 207 } 208 } 209 p4: (struct){ 210 x: (struct){ 211 y: (struct){ 212 } 213 z: (struct){ 214 a: (struct){ 215 } 216 } 217 } 218 } 219 p5: (struct){ 220 x: (struct){ 221 y: (struct){ 222 } 223 z: (struct){ 224 a: (struct){ 225 } 226 } 227 } 228 } 229 } 230 } 231 t2: (_|_){ 232 // [eval] 233 err: (_|_){ 234 // [eval] 235 a: (_|_){ 236 // [eval] comprehension.t2.err.a: adding field xq not allowed as field set was already referenced: 237 // ./comprehension.cue:71:13 238 x: (int){ 1 } 239 } 240 } 241 } 242 t3: (_|_){ 243 // [eval] 244 err: (_|_){ 245 // [eval] 246 a: (_|_){ 247 // [eval] comprehension.t3.err.a: adding field xq not allowed as field set was already referenced: 248 // ./comprehension.cue:82:13 249 x: (int){ 1 } 250 } 251 b: (struct){ 252 y: (int){ 1 } 253 x: (int){ 1 } 254 } 255 } 256 } 257 t4: (struct){ 258 ok: (struct){ 259 x: (struct){ 260 y: (struct){ 261 a: (struct){ 262 } 263 } 264 } 265 } 266 } 267 moreSpecific: (_|_){ 268 // [eval] 269 ok: (struct){ 270 a: (struct){ 271 x: (int){ 1 } 272 } 273 } 274 err: (_|_){ 275 // [eval] 276 a: (_|_){ 277 // [eval] comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced: 278 // ./comprehension.cue:114:9 279 x: (struct){ 280 y: (int){ 1 } 281 } 282 } 283 } 284 } 285 } 286 freezing: (struct){ 287 t1: (struct){ 288 ok: (int){ 289 1 290 #a: (#struct){ 291 x: (string){ "a" } 292 } 293 } 294 } 295 } 296 issue3178: (struct){ 297 input: (#list){ 298 0: (string){ "Value" } 299 } 300 output: (struct){ 301 Value: (bool){ true } 302 } 303 } 304 } 305 -- diff/-out/evalalpha<==>+out/eval -- 306 diff old new 307 --- old 308 +++ new 309 @@ -1,11 +1,10 @@ 310 Errors: 311 -comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle 312 -comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle 313 -comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle 314 -comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle 315 -comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle 316 -comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle 317 -comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle 318 +comprehension.t2.err.a: adding field xq not allowed as field set was already referenced: 319 + ./comprehension.cue:71:13 320 +comprehension.t3.err.a: adding field xq not allowed as field set was already referenced: 321 + ./comprehension.cue:82:13 322 +comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced: 323 + ./comprehension.cue:114:9 324 325 Result: 326 (_|_){ 327 @@ -12,38 +11,30 @@ 328 // [eval] 329 comprehension: (_|_){ 330 // [eval] 331 - t1: (_|_){ 332 - // [eval] 333 - ok: (_|_){ 334 - // [eval] 335 - p0: (_|_){ 336 - // [eval] 337 - x: (_|_){ 338 - // [eval] comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle 339 - y: (struct){ 340 - } 341 - z: (struct){ 342 - a: (struct){ 343 - } 344 - } 345 - } 346 - } 347 - p1: (_|_){ 348 - // [eval] 349 - x: (_|_){ 350 - // [eval] comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle 351 - y: (struct){ 352 - } 353 - z: (struct){ 354 - a: (struct){ 355 - } 356 - } 357 - } 358 - } 359 - p2: (_|_){ 360 - // [eval] 361 - x: (_|_){ 362 - // [eval] comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle 363 + t1: (struct){ 364 + ok: (struct){ 365 + p0: (struct){ 366 + x: (struct){ 367 + y: (struct){ 368 + } 369 + z: (struct){ 370 + a: (struct){ 371 + } 372 + } 373 + } 374 + } 375 + p1: (struct){ 376 + x: (struct){ 377 + y: (struct){ 378 + } 379 + z: (struct){ 380 + a: (struct){ 381 + } 382 + } 383 + } 384 + } 385 + p2: (struct){ 386 + x: (struct){ 387 y: (struct){ 388 } 389 z: (struct){ 390 @@ -89,9 +80,9 @@ 391 err: (_|_){ 392 // [eval] 393 a: (_|_){ 394 - // [eval] comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle 395 - x: (int){ 1 } 396 - xq: (int){ 1 } 397 + // [eval] comprehension.t2.err.a: adding field xq not allowed as field set was already referenced: 398 + // ./comprehension.cue:71:13 399 + x: (int){ 1 } 400 } 401 } 402 } 403 @@ -99,16 +90,14 @@ 404 // [eval] 405 err: (_|_){ 406 // [eval] 407 - a: (struct){ 408 - x: (int){ 1 } 409 - yq: (int){ 1 } 410 - } 411 - b: (_|_){ 412 - // [eval] comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle 413 - // comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle 414 + a: (_|_){ 415 + // [eval] comprehension.t3.err.a: adding field xq not allowed as field set was already referenced: 416 + // ./comprehension.cue:82:13 417 + x: (int){ 1 } 418 + } 419 + b: (struct){ 420 y: (int){ 1 } 421 x: (int){ 1 } 422 - yq: (int){ 1 } 423 } 424 } 425 } 426 @@ -132,10 +121,10 @@ 427 err: (_|_){ 428 // [eval] 429 a: (_|_){ 430 - // [eval] comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle 431 + // [eval] comprehension.moreSpecific.err.a.x: adding field z not allowed as field set was already referenced: 432 + // ./comprehension.cue:114:9 433 x: (struct){ 434 y: (int){ 1 } 435 - z: (int){ 1 } 436 } 437 } 438 } 439 -- diff/explanation -- 440 v0.7 fixes bugs in v0.6: 441 - comprehension.t1 should be at most an incomplete error, as it is fixable. 442 Arguably they should pass, though, as there is a predictable path to its 443 resolution. 444 -- out/eval -- 445 Errors: 446 comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle 447 comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle 448 comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle 449 comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle 450 comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle 451 comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle 452 comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle 453 454 Result: 455 (_|_){ 456 // [eval] 457 comprehension: (_|_){ 458 // [eval] 459 t1: (_|_){ 460 // [eval] 461 ok: (_|_){ 462 // [eval] 463 p0: (_|_){ 464 // [eval] 465 x: (_|_){ 466 // [eval] comprehension.t1.ok.p0.x: field z not allowed by earlier comprehension or reference cycle 467 y: (struct){ 468 } 469 z: (struct){ 470 a: (struct){ 471 } 472 } 473 } 474 } 475 p1: (_|_){ 476 // [eval] 477 x: (_|_){ 478 // [eval] comprehension.t1.ok.p1.x: field z not allowed by earlier comprehension or reference cycle 479 y: (struct){ 480 } 481 z: (struct){ 482 a: (struct){ 483 } 484 } 485 } 486 } 487 p2: (_|_){ 488 // [eval] 489 x: (_|_){ 490 // [eval] comprehension.t1.ok.p2.x: field z not allowed by earlier comprehension or reference cycle 491 y: (struct){ 492 } 493 z: (struct){ 494 a: (struct){ 495 } 496 } 497 } 498 } 499 p3: (struct){ 500 x: (struct){ 501 y: (struct){ 502 } 503 z: (struct){ 504 a: (struct){ 505 } 506 } 507 } 508 } 509 p4: (struct){ 510 x: (struct){ 511 y: (struct){ 512 } 513 z: (struct){ 514 a: (struct){ 515 } 516 } 517 } 518 } 519 p5: (struct){ 520 x: (struct){ 521 y: (struct){ 522 } 523 z: (struct){ 524 a: (struct){ 525 } 526 } 527 } 528 } 529 } 530 } 531 t2: (_|_){ 532 // [eval] 533 err: (_|_){ 534 // [eval] 535 a: (_|_){ 536 // [eval] comprehension.t2.err.a: field xq not allowed by earlier comprehension or reference cycle 537 x: (int){ 1 } 538 xq: (int){ 1 } 539 } 540 } 541 } 542 t3: (_|_){ 543 // [eval] 544 err: (_|_){ 545 // [eval] 546 a: (struct){ 547 x: (int){ 1 } 548 yq: (int){ 1 } 549 } 550 b: (_|_){ 551 // [eval] comprehension.t3.err.b: field x not allowed by earlier comprehension or reference cycle 552 // comprehension.t3.err.b: field yq not allowed by earlier comprehension or reference cycle 553 y: (int){ 1 } 554 x: (int){ 1 } 555 yq: (int){ 1 } 556 } 557 } 558 } 559 t4: (struct){ 560 ok: (struct){ 561 x: (struct){ 562 y: (struct){ 563 a: (struct){ 564 } 565 } 566 } 567 } 568 } 569 moreSpecific: (_|_){ 570 // [eval] 571 ok: (struct){ 572 a: (struct){ 573 x: (int){ 1 } 574 } 575 } 576 err: (_|_){ 577 // [eval] 578 a: (_|_){ 579 // [eval] comprehension.moreSpecific.err.a: field z not allowed by earlier comprehension or reference cycle 580 x: (struct){ 581 y: (int){ 1 } 582 z: (int){ 1 } 583 } 584 } 585 } 586 } 587 } 588 freezing: (struct){ 589 t1: (struct){ 590 ok: (int){ 591 1 592 #a: (#struct){ 593 x: (string){ "a" } 594 } 595 } 596 } 597 } 598 issue3178: (struct){ 599 input: (#list){ 600 0: (string){ "Value" } 601 } 602 output: (struct){ 603 Value: (bool){ true } 604 } 605 } 606 } 607 -- out/compile -- 608 --- comprehension.cue 609 { 610 comprehension: { 611 t1: _ 612 } 613 comprehension: { 614 t1: { 615 ok: { 616 p0: { 617 x: { 618 y: {} 619 } 620 for _, _ in 〈0;x〉 { 621 if true { 622 x: { 623 z: { 624 a: {} 625 } 626 } 627 } 628 } 629 if true { 630 if true { 631 x: { 632 z: { 633 a: {} 634 } 635 } 636 } 637 } 638 } 639 } 640 } 641 } 642 comprehension: { 643 t1: { 644 ok: { 645 p1: { 646 for _, _ in 〈0;x〉 { 647 if true { 648 x: { 649 z: { 650 a: {} 651 } 652 } 653 } 654 } 655 x: { 656 y: {} 657 } 658 if true { 659 if true { 660 x: { 661 z: { 662 a: {} 663 } 664 } 665 } 666 } 667 } 668 } 669 } 670 } 671 comprehension: { 672 t1: { 673 ok: { 674 p2: { 675 for _, _ in 〈0;x〉 { 676 if true { 677 x: { 678 z: { 679 a: {} 680 } 681 } 682 } 683 } 684 if true { 685 if true { 686 x: { 687 z: { 688 a: {} 689 } 690 } 691 } 692 } 693 x: { 694 y: {} 695 } 696 } 697 } 698 } 699 } 700 comprehension: { 701 t1: { 702 ok: { 703 p3: { 704 x: { 705 y: {} 706 } 707 if true { 708 if true { 709 x: { 710 z: { 711 a: {} 712 } 713 } 714 } 715 } 716 for _, _ in 〈0;x〉 { 717 if true { 718 x: { 719 z: { 720 a: {} 721 } 722 } 723 } 724 } 725 } 726 } 727 } 728 } 729 comprehension: { 730 t1: { 731 ok: { 732 p4: { 733 if true { 734 if true { 735 x: { 736 z: { 737 a: {} 738 } 739 } 740 } 741 } 742 x: { 743 y: {} 744 } 745 for _, _ in 〈0;x〉 { 746 if true { 747 x: { 748 z: { 749 a: {} 750 } 751 } 752 } 753 } 754 } 755 } 756 } 757 } 758 comprehension: { 759 t1: { 760 ok: { 761 p5: { 762 if true { 763 if true { 764 x: { 765 z: { 766 a: {} 767 } 768 } 769 } 770 } 771 for _, _ in 〈0;x〉 { 772 if true { 773 x: { 774 z: { 775 a: {} 776 } 777 } 778 } 779 } 780 x: { 781 y: {} 782 } 783 } 784 } 785 } 786 } 787 comprehension: { 788 t2: { 789 err: { 790 a: { 791 x: 1 792 for k, v in 〈1;a〉 { 793 (〈1;k〉 + "q"): 〈1;v〉 794 } 795 } 796 } 797 } 798 } 799 comprehension: { 800 t3: { 801 err: { 802 a: { 803 x: 1 804 } 805 b: { 806 y: 1 807 } 808 a: { 809 for k, v in 〈1;b〉 { 810 (〈1;k〉 + "q"): 〈1;v〉 811 } 812 } 813 b: { 814 for k, v in 〈1;a〉 { 815 〈1;k〉: 〈1;v〉 816 } 817 } 818 } 819 } 820 } 821 comprehension: { 822 t4: { 823 ok: { 824 x: { 825 y: {} 826 } 827 for _, _ in 〈0;x〉 { 828 if true { 829 x: { 830 y: { 831 a: {} 832 } 833 } 834 } 835 } 836 } 837 } 838 } 839 comprehension: { 840 moreSpecific: { 841 ok: { 842 a: { 843 x: int 844 for k, v in 〈1;a〉 { 845 〈1;k〉: 1 846 } 847 } 848 } 849 } 850 } 851 comprehension: { 852 moreSpecific: { 853 err: { 854 a: { 855 x: { 856 y: 1 857 } 858 for k, v in 〈1;a〉 if (len(〈0;v〉) > 0) { 859 〈1;k〉: { 860 z: 1 861 } 862 } 863 } 864 } 865 } 866 } 867 } 868 --- in.cue 869 { 870 freezing: { 871 t1: { 872 ok: { 873 #a: { 874 x: "a" 875 } 876 len(〈0;#a〉) 877 } 878 } 879 } 880 } 881 --- issue3178.cue 882 { 883 issue3178: { 884 input: [ 885 "Value", 886 ] 887 output: { 888 ... 889 } 890 for _, name in 〈0;input〉 { 891 output: { 892 "\(〈2;name〉)": true 893 } 894 } 895 for name, v in 〈0;output〉 {} 896 } 897 }