cuelang.org/go@v0.10.1/cue/testdata/eval/issue2146.txtar (about)

     1  // Issue #2146
     2  //
     3  // Ensure that let expressions are uniqued not only per Environment, but also
     4  // per arc. This is relevant for disjunctions. Without it, an incorrect
     5  // result may be cached for an arbitrary Environment.
     6  -- in.cue --
     7  p1: {
     8  	#A: {
     9  		x?: int
    10  		y?: int
    11  
    12  		let list = [x, y]
    13  		all:  [for v in list if v != _|_ {v}]
    14  
    15  		*{
    16  			x?: _|_
    17  			y:  1
    18  		} | _
    19  	}
    20  
    21  	a: #A & { x: 3 }
    22  	b: #A & a
    23  }
    24  p2: {
    25  	#A: {
    26  		x?: int
    27  		y?: int
    28  
    29  		let list = [x, y]
    30  		all:  [for v in list if v != _|_ {v}]
    31  
    32  		_ | *{
    33  			x?: _|_
    34  			y:  1
    35  		}
    36  	}
    37  
    38  	a: #A & { x: 3, y: 2 }
    39  	b: #A & a
    40  }
    41  
    42  -- out/eval/stats --
    43  Leaks:  18
    44  Freed:  171
    45  Reused: 163
    46  Allocs: 26
    47  Retain: 18
    48  
    49  Unifications: 173
    50  Conjuncts:    557
    51  Disjuncts:    189
    52  -- out/evalalpha --
    53  (struct){
    54    p1: (struct){
    55      #A: (#struct){
    56        x?: (int){ int }
    57        y?: (int){ int }
    58        let list#1 = (#list){
    59          0: (int){ int }
    60          1: (int){ int }
    61        }
    62        all: (#list){
    63        }
    64      }
    65      a: (#struct){
    66        x: (int){ 3 }
    67        y?: (int){ int }
    68        let list#1 = (#list){
    69          0: (int){ 3 }
    70          1: (int){ int }
    71        }
    72        all: (#list){
    73          0: (int){ 3 }
    74        }
    75      }
    76      b: (#struct){
    77        x: (int){ 3 }
    78        y?: (int){ int }
    79        let list#1 = (#list){
    80          0: (int){ 3 }
    81          1: (int){ int }
    82        }
    83        all: (#list){
    84          0: (int){ 3 }
    85        }
    86      }
    87    }
    88    p2: (struct){
    89      #A: (#struct){
    90        x?: (int){ int }
    91        y?: (int){ int }
    92        let list#2 = (#list){
    93          0: (int){ int }
    94          1: (int){ int }
    95        }
    96        all: (#list){
    97        }
    98      }
    99      a: (#struct){
   100        x: (int){ 3 }
   101        y: (int){ 2 }
   102        let list#2 = (#list){
   103          0: (int){ 3 }
   104          1: (int){ 2 }
   105        }
   106        all: (#list){
   107          0: (int){ 3 }
   108          1: (int){ 2 }
   109        }
   110      }
   111      b: (#struct){
   112        x: (int){ 3 }
   113        y: (int){ 2 }
   114        let list#2 = (#list){
   115          0: (int){ 3 }
   116          1: (int){ 2 }
   117        }
   118        all: (#list){
   119          0: (int){ 3 }
   120          1: (int){ 2 }
   121        }
   122      }
   123    }
   124  }
   125  -- diff/-out/evalalpha<==>+out/eval --
   126  diff old new
   127  --- old
   128  +++ new
   129  @@ -1,58 +1,33 @@
   130   (struct){
   131     p1: (struct){
   132  -    #A: (#struct){ |(*(#struct){
   133  -        x?: (_|_){
   134  -          // [user] explicit error (_|_ literal) in source:
   135  -          //     ./in.cue:10:8
   136  -        }
   137  -        y: (int){ 1 }
   138  -        let list#1 = (#list){
   139  -          0: (_|_){
   140  -            // [incomplete] p1.#A.list.0: cannot reference optional field: x:
   141  -            //     ./in.cue:6:15
   142  -          }
   143  -          1: (int){ 1 }
   144  -        }
   145  -        all: (#list){
   146  -          0: (int){ 1 }
   147  -        }
   148  -      }, (#struct){
   149  -        x?: (int){ int }
   150  -        y?: (int){ int }
   151  -        let list#1 = (#list){
   152  -          0: (_|_){
   153  -            // [incomplete] p1.#A.list.0: cannot reference optional field: x:
   154  -            //     ./in.cue:6:15
   155  -          }
   156  -          1: (_|_){
   157  -            // [incomplete] p1.#A.list.1: cannot reference optional field: y:
   158  -            //     ./in.cue:6:18
   159  -          }
   160  -        }
   161  -        all: (#list){
   162  -        }
   163  -      }) }
   164  -    a: (#struct){
   165  -      x: (int){ 3 }
   166  -      y?: (int){ int }
   167  -      let list#1 = (#list){
   168  -        0: (int){ 3 }
   169  -        1: (_|_){
   170  -          // [incomplete] p1.a.list.1: cannot reference optional field: y:
   171  -          //     ./in.cue:6:18
   172  -        }
   173  -      }
   174  -      all: (#list){
   175  -        0: (int){ 3 }
   176  -      }
   177  -    }
   178  -    b: (#struct){
   179  -      x: (int){ 3 }
   180  -      y?: (int){ int }
   181  -      let list#1multi = [
   182  -        〈1;x〉,
   183  -        〈1;y〉,
   184  -      ]
   185  +    #A: (#struct){
   186  +      x?: (int){ int }
   187  +      y?: (int){ int }
   188  +      let list#1 = (#list){
   189  +        0: (int){ int }
   190  +        1: (int){ int }
   191  +      }
   192  +      all: (#list){
   193  +      }
   194  +    }
   195  +    a: (#struct){
   196  +      x: (int){ 3 }
   197  +      y?: (int){ int }
   198  +      let list#1 = (#list){
   199  +        0: (int){ 3 }
   200  +        1: (int){ int }
   201  +      }
   202  +      all: (#list){
   203  +        0: (int){ 3 }
   204  +      }
   205  +    }
   206  +    b: (#struct){
   207  +      x: (int){ 3 }
   208  +      y?: (int){ int }
   209  +      let list#1 = (#list){
   210  +        0: (int){ 3 }
   211  +        1: (int){ int }
   212  +      }
   213         all: (#list){
   214           0: (int){ 3 }
   215         }
   216  @@ -59,57 +34,35 @@
   217       }
   218     }
   219     p2: (struct){
   220  -    #A: (#struct){ |(*(#struct){
   221  -        x?: (_|_){
   222  -          // [user] explicit error (_|_ literal) in source:
   223  -          //     ./in.cue:27:8
   224  -        }
   225  -        y: (int){ 1 }
   226  -        let list#2 = (#list){
   227  -          0: (_|_){
   228  -            // [incomplete] p2.#A.list.0: cannot reference optional field: x:
   229  -            //     ./in.cue:23:15
   230  -          }
   231  -          1: (int){ 1 }
   232  -        }
   233  -        all: (#list){
   234  -          0: (int){ 1 }
   235  -        }
   236  -      }, (#struct){
   237  -        x?: (int){ int }
   238  -        y?: (int){ int }
   239  -        let list#2 = (#list){
   240  -          0: (_|_){
   241  -            // [incomplete] p2.#A.list.0: cannot reference optional field: x:
   242  -            //     ./in.cue:23:15
   243  -          }
   244  -          1: (_|_){
   245  -            // [incomplete] p2.#A.list.1: cannot reference optional field: y:
   246  -            //     ./in.cue:23:18
   247  -          }
   248  -        }
   249  -        all: (#list){
   250  -        }
   251  -      }) }
   252  -    a: (#struct){
   253  -      x: (int){ 3 }
   254  -      y: (int){ 2 }
   255  -      let list#2 = (#list){
   256  -        0: (int){ 3 }
   257  -        1: (int){ 2 }
   258  -      }
   259  -      all: (#list){
   260  -        0: (int){ 3 }
   261  -        1: (int){ 2 }
   262  -      }
   263  -    }
   264  -    b: (#struct){
   265  -      x: (int){ 3 }
   266  -      y: (int){ 2 }
   267  -      let list#2multi = [
   268  -        〈1;x〉,
   269  -        〈1;y〉,
   270  -      ]
   271  +    #A: (#struct){
   272  +      x?: (int){ int }
   273  +      y?: (int){ int }
   274  +      let list#2 = (#list){
   275  +        0: (int){ int }
   276  +        1: (int){ int }
   277  +      }
   278  +      all: (#list){
   279  +      }
   280  +    }
   281  +    a: (#struct){
   282  +      x: (int){ 3 }
   283  +      y: (int){ 2 }
   284  +      let list#2 = (#list){
   285  +        0: (int){ 3 }
   286  +        1: (int){ 2 }
   287  +      }
   288  +      all: (#list){
   289  +        0: (int){ 3 }
   290  +        1: (int){ 2 }
   291  +      }
   292  +    }
   293  +    b: (#struct){
   294  +      x: (int){ 3 }
   295  +      y: (int){ 2 }
   296  +      let list#2 = (#list){
   297  +        0: (int){ 3 }
   298  +        1: (int){ 2 }
   299  +      }
   300         all: (#list){
   301           0: (int){ 3 }
   302           1: (int){ 2 }
   303  -- diff/todo/p1 --
   304  p1: missing disjuncts in result.
   305  -- diff/todo/p3 --
   306  Let expressions encoded differently.
   307  -- out/eval --
   308  (struct){
   309    p1: (struct){
   310      #A: (#struct){ |(*(#struct){
   311          x?: (_|_){
   312            // [user] explicit error (_|_ literal) in source:
   313            //     ./in.cue:10:8
   314          }
   315          y: (int){ 1 }
   316          let list#1 = (#list){
   317            0: (_|_){
   318              // [incomplete] p1.#A.list.0: cannot reference optional field: x:
   319              //     ./in.cue:6:15
   320            }
   321            1: (int){ 1 }
   322          }
   323          all: (#list){
   324            0: (int){ 1 }
   325          }
   326        }, (#struct){
   327          x?: (int){ int }
   328          y?: (int){ int }
   329          let list#1 = (#list){
   330            0: (_|_){
   331              // [incomplete] p1.#A.list.0: cannot reference optional field: x:
   332              //     ./in.cue:6:15
   333            }
   334            1: (_|_){
   335              // [incomplete] p1.#A.list.1: cannot reference optional field: y:
   336              //     ./in.cue:6:18
   337            }
   338          }
   339          all: (#list){
   340          }
   341        }) }
   342      a: (#struct){
   343        x: (int){ 3 }
   344        y?: (int){ int }
   345        let list#1 = (#list){
   346          0: (int){ 3 }
   347          1: (_|_){
   348            // [incomplete] p1.a.list.1: cannot reference optional field: y:
   349            //     ./in.cue:6:18
   350          }
   351        }
   352        all: (#list){
   353          0: (int){ 3 }
   354        }
   355      }
   356      b: (#struct){
   357        x: (int){ 3 }
   358        y?: (int){ int }
   359        let list#1multi = [
   360          〈1;x〉,
   361          〈1;y〉,
   362        ]
   363        all: (#list){
   364          0: (int){ 3 }
   365        }
   366      }
   367    }
   368    p2: (struct){
   369      #A: (#struct){ |(*(#struct){
   370          x?: (_|_){
   371            // [user] explicit error (_|_ literal) in source:
   372            //     ./in.cue:27:8
   373          }
   374          y: (int){ 1 }
   375          let list#2 = (#list){
   376            0: (_|_){
   377              // [incomplete] p2.#A.list.0: cannot reference optional field: x:
   378              //     ./in.cue:23:15
   379            }
   380            1: (int){ 1 }
   381          }
   382          all: (#list){
   383            0: (int){ 1 }
   384          }
   385        }, (#struct){
   386          x?: (int){ int }
   387          y?: (int){ int }
   388          let list#2 = (#list){
   389            0: (_|_){
   390              // [incomplete] p2.#A.list.0: cannot reference optional field: x:
   391              //     ./in.cue:23:15
   392            }
   393            1: (_|_){
   394              // [incomplete] p2.#A.list.1: cannot reference optional field: y:
   395              //     ./in.cue:23:18
   396            }
   397          }
   398          all: (#list){
   399          }
   400        }) }
   401      a: (#struct){
   402        x: (int){ 3 }
   403        y: (int){ 2 }
   404        let list#2 = (#list){
   405          0: (int){ 3 }
   406          1: (int){ 2 }
   407        }
   408        all: (#list){
   409          0: (int){ 3 }
   410          1: (int){ 2 }
   411        }
   412      }
   413      b: (#struct){
   414        x: (int){ 3 }
   415        y: (int){ 2 }
   416        let list#2multi = [
   417          〈1;x〉,
   418          〈1;y〉,
   419        ]
   420        all: (#list){
   421          0: (int){ 3 }
   422          1: (int){ 2 }
   423        }
   424      }
   425    }
   426  }
   427  -- out/compile --
   428  --- in.cue
   429  {
   430    p1: {
   431      #A: {
   432        x?: int
   433        y?: int
   434        let list#1 = [
   435          〈1;x〉,
   436          〈1;y〉,
   437        ]
   438        all: [
   439          for _, v in 〈1;let list#1〉 if (〈0;v〉 != _|_(explicit error (_|_ literal) in source)) {
   440            〈1;v〉
   441          },
   442        ]
   443        (*{
   444          x?: _|_(explicit error (_|_ literal) in source)
   445          y: 1
   446        }|_)
   447      }
   448      a: (〈0;#A〉 & {
   449        x: 3
   450      })
   451      b: (〈0;#A〉 & 〈0;a〉)
   452    }
   453    p2: {
   454      #A: {
   455        x?: int
   456        y?: int
   457        let list#2 = [
   458          〈1;x〉,
   459          〈1;y〉,
   460        ]
   461        all: [
   462          for _, v in 〈1;let list#2〉 if (〈0;v〉 != _|_(explicit error (_|_ literal) in source)) {
   463            〈1;v〉
   464          },
   465        ]
   466        (_|*{
   467          x?: _|_(explicit error (_|_ literal) in source)
   468          y: 1
   469        })
   470      }
   471      a: (〈0;#A〉 & {
   472        x: 3
   473        y: 2
   474      })
   475      b: (〈0;#A〉 & 〈0;a〉)
   476    }
   477  }