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