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 }