cuelang.org/go@v0.10.1/cue/testdata/cycle/disjunction.txtar (about) 1 # TODO(fmt): first line indented when it should not be: cuelang.org/issue/722 2 3 -- in.cue -- 4 // cycle is a structural cycle 5 cycle: a: cycle 6 7 // reference to outside structural cycle 8 r1a: cycle | int 9 r1b: int | cycle 10 11 r2a: cycle | 1 12 r2b: 1 | cycle 13 14 r3a: cycle | null 15 r3b: null | cycle 16 17 r4a: cycle | {} 18 r4b: {} | cycle 19 20 r5a: cycle | [] 21 r5b: [] | cycle 22 23 // reference to ancestor node 24 s1a: x: s1a | int 25 s1b: x: int | s1b 26 27 s2a: x: s2a | 1 28 s2b: x: 1 | s2b 29 30 s3a: x: s3a | null 31 s3b: x: null | s3b 32 33 s4a: x: s4a | {} 34 s4b: x: {} | s4b 35 36 s5a: x: s5a | [] 37 s5b: x: [] | s5b 38 39 -- issue3042.cue -- 40 issue3042: { 41 // Recursively, any field named "name" should begin with "foo". 42 // The data value below should then fail. 43 #foo: =~"^foo" 44 #nesting: string | {name?: #foo, [string]: #nesting} | [...#nesting] 45 46 data: #nesting & { 47 secret: { 48 infra: [ 49 {name: "bar1"} 50 ] 51 } 52 } 53 } 54 -- out/eval/stats -- 55 Leaks: 0 56 Freed: 199 57 Reused: 181 58 Allocs: 18 59 Retain: 0 60 61 Unifications: 93 62 Conjuncts: 280 63 Disjuncts: 199 64 -- out/eval -- 65 Errors: 66 cycle.a: structural cycle 67 68 Result: 69 (_|_){ 70 // [structural cycle] 71 cycle: (_|_){ 72 // [structural cycle] 73 a: (_|_){ 74 // [structural cycle] cycle.a: structural cycle 75 } 76 } 77 r1a: (int){ int } 78 r1b: (int){ int } 79 r2a: (int){ 1 } 80 r2b: (int){ 1 } 81 r3a: (null){ null } 82 r3b: (null){ null } 83 r4a: (struct){ 84 } 85 r4b: (struct){ 86 } 87 r5a: (#list){ 88 } 89 r5b: (#list){ 90 } 91 s1a: (struct){ 92 x: (int){ int } 93 } 94 s1b: (struct){ 95 x: (int){ int } 96 } 97 s2a: (struct){ 98 x: (int){ 1 } 99 } 100 s2b: (struct){ 101 x: (int){ 1 } 102 } 103 s3a: (struct){ 104 x: (null){ null } 105 } 106 s3b: (struct){ 107 x: (null){ null } 108 } 109 s4a: (struct){ 110 x: (struct){ 111 } 112 } 113 s4b: (struct){ 114 x: (struct){ 115 } 116 } 117 s5a: (struct){ 118 x: (#list){ 119 } 120 } 121 s5b: (struct){ 122 x: (#list){ 123 } 124 } 125 issue3042: (struct){ 126 #foo: (string){ =~"^foo" } 127 #nesting: ((string|list|struct)){ |((string){ string }, (#struct){ 128 name?: (string){ =~"^foo" } 129 }, (list){ 130 }) } 131 data: (#struct){ 132 secret: (#struct){ 133 infra: (#list){ 134 0: (struct){ 135 name: (string){ "bar1" } 136 } 137 } 138 name?: (string){ =~"^foo" } 139 } 140 name?: (string){ =~"^foo" } 141 } 142 } 143 } 144 -- out/evalalpha -- 145 Errors: 146 cycle.a: structural cycle 147 issue3042.data: conflicting values [...#nesting] and {secret:{infra:[{name:"bar1"}]}} (mismatched types list and struct): 148 ./issue3042.cue:5:57 149 ./issue3042.cue:7:19 150 issue3042.data: conflicting values string and {secret:{infra:[{name:"bar1"}]}} (mismatched types string and struct): 151 ./issue3042.cue:5:12 152 ./issue3042.cue:7:19 153 issue3042.data.secret: conflicting values [...#nesting] and {infra:[{name:"bar1"}]} (mismatched types list and struct): 154 ./issue3042.cue:5:57 155 ./issue3042.cue:8:11 156 issue3042.data.secret: conflicting values string and {infra:[{name:"bar1"}]} (mismatched types string and struct): 157 ./issue3042.cue:5:12 158 ./issue3042.cue:8:11 159 issue3042.data.secret: field not allowed: 160 ./issue3042.cue:8:3 161 issue3042.data.secret.infra: adding field name not allowed as field set was already referenced 162 issue3042.data.secret.infra: conflicting values [{name:"bar1"}] and string (mismatched types list and string): 163 ./issue3042.cue:5:12 164 ./issue3042.cue:9:11 165 issue3042.data.secret.infra: conflicting values [{name:"bar1"}] and {name?:#foo,[string]:#nesting} (mismatched types list and struct): 166 ./issue3042.cue:5:21 167 ./issue3042.cue:9:11 168 issue3042.data.secret.infra: field not allowed: 169 ./issue3042.cue:9:4 170 issue3042.data.secret.infra.0: conflicting values [...#nesting] and {name:"bar1"} (mismatched types list and struct): 171 ./issue3042.cue:5:57 172 ./issue3042.cue:10:5 173 issue3042.data.secret.infra.0: conflicting values string and {name:"bar1"} (mismatched types string and struct): 174 ./issue3042.cue:5:12 175 ./issue3042.cue:10:5 176 issue3042.data.secret.infra.0: field not allowed: 177 ./issue3042.cue:10:5 178 issue3042.data.secret.infra.0.name: conflicting values "bar1" and [...#nesting] (mismatched types string and list): 179 ./issue3042.cue:5:57 180 ./issue3042.cue:10:12 181 issue3042.data.secret.infra.0.name: conflicting values "bar1" and {name?:#foo,[string]:#nesting} (mismatched types string and struct): 182 ./issue3042.cue:5:21 183 ./issue3042.cue:10:12 184 issue3042.data.secret.infra.0.name: field not allowed: 185 ./issue3042.cue:10:6 186 issue3042.data.secret.infra.0.name: invalid value "bar1" (out of bound =~"^foo"): 187 ./issue3042.cue:4:8 188 ./issue3042.cue:10:12 189 issue3042.data.secret.infra.name: cyclic reference to field name: 190 ./issue3042.cue:5:22 191 issue3042.data.secret: field not allowed: 192 ./issue3042.cue:5:57 193 ./issue3042.cue:8:3 194 issue3042.data.secret.infra: field not allowed: 195 ./issue3042.cue:5:57 196 ./issue3042.cue:9:4 197 issue3042.data.secret.infra.0.name: field not allowed: 198 ./issue3042.cue:5:57 199 ./issue3042.cue:10:6 200 201 Result: 202 (_|_){ 203 // [eval] 204 cycle: (_|_){ 205 // [structural cycle] 206 a: (_|_){ 207 // [structural cycle] cycle.a: structural cycle 208 } 209 } 210 r1a: (int){ int } 211 r1b: (int){ int } 212 r2a: (int){ 1 } 213 r2b: (int){ 1 } 214 r3a: (null){ null } 215 r3b: (null){ null } 216 r4a: (struct){ 217 } 218 r4b: (struct){ 219 } 220 r5a: (#list){ 221 } 222 r5b: (#list){ 223 } 224 s1a: (struct){ 225 x: (int){ int } 226 } 227 s1b: (struct){ 228 x: (int){ int } 229 } 230 s2a: (struct){ 231 x: (int){ 1 } 232 } 233 s2b: (struct){ 234 x: (int){ 1 } 235 } 236 s3a: (struct){ 237 x: (null){ null } 238 } 239 s3b: (struct){ 240 x: (null){ null } 241 } 242 s4a: (struct){ 243 x: (struct){ 244 } 245 } 246 s4b: (struct){ 247 x: (struct){ 248 } 249 } 250 s5a: (struct){ 251 x: (#list){ 252 } 253 } 254 s5b: (struct){ 255 x: (#list){ 256 } 257 } 258 issue3042: (_|_){ 259 // [eval] 260 #foo: (string){ =~"^foo" } 261 #nesting: ((string|list|struct)){ |((string){ string }, (#struct){ 262 name?: (_|_){ 263 // [structural cycle] issue3042.#nesting.name: structural cycle 264 } 265 }, (list){ 266 }) } 267 data: (_|_){ 268 // [eval] issue3042.data: conflicting values [...#nesting] and {secret:{infra:[{name:"bar1"}]}} (mismatched types list and struct): 269 // ./issue3042.cue:5:57 270 // ./issue3042.cue:7:19 271 // issue3042.data: conflicting values string and {secret:{infra:[{name:"bar1"}]}} (mismatched types string and struct): 272 // ./issue3042.cue:5:12 273 // ./issue3042.cue:7:19 274 // issue3042.data.secret: conflicting values [...#nesting] and {infra:[{name:"bar1"}]} (mismatched types list and struct): 275 // ./issue3042.cue:5:57 276 // ./issue3042.cue:8:11 277 // issue3042.data.secret: conflicting values string and {infra:[{name:"bar1"}]} (mismatched types string and struct): 278 // ./issue3042.cue:5:12 279 // ./issue3042.cue:8:11 280 // issue3042.data.secret: field not allowed: 281 // ./issue3042.cue:8:3 282 // issue3042.data.secret.infra: adding field name not allowed as field set was already referenced 283 // issue3042.data.secret.infra: conflicting values [{name:"bar1"}] and string (mismatched types list and string): 284 // ./issue3042.cue:5:12 285 // ./issue3042.cue:9:11 286 // issue3042.data.secret.infra: conflicting values [{name:"bar1"}] and {name?:#foo,[string]:#nesting} (mismatched types list and struct): 287 // ./issue3042.cue:5:21 288 // ./issue3042.cue:9:11 289 // issue3042.data.secret.infra: field not allowed: 290 // ./issue3042.cue:9:4 291 // issue3042.data.secret.infra.0: conflicting values [...#nesting] and {name:"bar1"} (mismatched types list and struct): 292 // ./issue3042.cue:5:57 293 // ./issue3042.cue:10:5 294 // issue3042.data.secret.infra.0: conflicting values string and {name:"bar1"} (mismatched types string and struct): 295 // ./issue3042.cue:5:12 296 // ./issue3042.cue:10:5 297 // issue3042.data.secret.infra.0: field not allowed: 298 // ./issue3042.cue:10:5 299 // issue3042.data.secret.infra.0.name: conflicting values "bar1" and [...#nesting] (mismatched types string and list): 300 // ./issue3042.cue:5:57 301 // ./issue3042.cue:10:12 302 // issue3042.data.secret.infra.0.name: conflicting values "bar1" and {name?:#foo,[string]:#nesting} (mismatched types string and struct): 303 // ./issue3042.cue:5:21 304 // ./issue3042.cue:10:12 305 // issue3042.data.secret.infra.0.name: field not allowed: 306 // ./issue3042.cue:10:6 307 // issue3042.data.secret.infra.0.name: invalid value "bar1" (out of bound =~"^foo"): 308 // ./issue3042.cue:4:8 309 // ./issue3042.cue:10:12 310 // issue3042.data.secret.infra.name: cyclic reference to field name: 311 // ./issue3042.cue:5:22 312 // issue3042.data.secret: field not allowed: 313 // ./issue3042.cue:5:57 314 // ./issue3042.cue:8:3 315 // issue3042.data.secret.infra: field not allowed: 316 // ./issue3042.cue:5:57 317 // ./issue3042.cue:9:4 318 // issue3042.data.secret.infra.0.name: field not allowed: 319 // ./issue3042.cue:5:57 320 // ./issue3042.cue:10:6 321 secret: (struct){ 322 infra: (_){ _ } 323 } 324 } 325 } 326 } 327 -- diff/-out/evalalpha<==>+out/eval -- 328 diff old new 329 --- old 330 +++ new 331 @@ -1,9 +1,62 @@ 332 Errors: 333 cycle.a: structural cycle 334 +issue3042.data: conflicting values [...#nesting] and {secret:{infra:[{name:"bar1"}]}} (mismatched types list and struct): 335 + ./issue3042.cue:5:57 336 + ./issue3042.cue:7:19 337 +issue3042.data: conflicting values string and {secret:{infra:[{name:"bar1"}]}} (mismatched types string and struct): 338 + ./issue3042.cue:5:12 339 + ./issue3042.cue:7:19 340 +issue3042.data.secret: conflicting values [...#nesting] and {infra:[{name:"bar1"}]} (mismatched types list and struct): 341 + ./issue3042.cue:5:57 342 + ./issue3042.cue:8:11 343 +issue3042.data.secret: conflicting values string and {infra:[{name:"bar1"}]} (mismatched types string and struct): 344 + ./issue3042.cue:5:12 345 + ./issue3042.cue:8:11 346 +issue3042.data.secret: field not allowed: 347 + ./issue3042.cue:8:3 348 +issue3042.data.secret.infra: adding field name not allowed as field set was already referenced 349 +issue3042.data.secret.infra: conflicting values [{name:"bar1"}] and string (mismatched types list and string): 350 + ./issue3042.cue:5:12 351 + ./issue3042.cue:9:11 352 +issue3042.data.secret.infra: conflicting values [{name:"bar1"}] and {name?:#foo,[string]:#nesting} (mismatched types list and struct): 353 + ./issue3042.cue:5:21 354 + ./issue3042.cue:9:11 355 +issue3042.data.secret.infra: field not allowed: 356 + ./issue3042.cue:9:4 357 +issue3042.data.secret.infra.0: conflicting values [...#nesting] and {name:"bar1"} (mismatched types list and struct): 358 + ./issue3042.cue:5:57 359 + ./issue3042.cue:10:5 360 +issue3042.data.secret.infra.0: conflicting values string and {name:"bar1"} (mismatched types string and struct): 361 + ./issue3042.cue:5:12 362 + ./issue3042.cue:10:5 363 +issue3042.data.secret.infra.0: field not allowed: 364 + ./issue3042.cue:10:5 365 +issue3042.data.secret.infra.0.name: conflicting values "bar1" and [...#nesting] (mismatched types string and list): 366 + ./issue3042.cue:5:57 367 + ./issue3042.cue:10:12 368 +issue3042.data.secret.infra.0.name: conflicting values "bar1" and {name?:#foo,[string]:#nesting} (mismatched types string and struct): 369 + ./issue3042.cue:5:21 370 + ./issue3042.cue:10:12 371 +issue3042.data.secret.infra.0.name: field not allowed: 372 + ./issue3042.cue:10:6 373 +issue3042.data.secret.infra.0.name: invalid value "bar1" (out of bound =~"^foo"): 374 + ./issue3042.cue:4:8 375 + ./issue3042.cue:10:12 376 +issue3042.data.secret.infra.name: cyclic reference to field name: 377 + ./issue3042.cue:5:22 378 +issue3042.data.secret: field not allowed: 379 + ./issue3042.cue:5:57 380 + ./issue3042.cue:8:3 381 +issue3042.data.secret.infra: field not allowed: 382 + ./issue3042.cue:5:57 383 + ./issue3042.cue:9:4 384 +issue3042.data.secret.infra.0.name: field not allowed: 385 + ./issue3042.cue:5:57 386 + ./issue3042.cue:10:6 387 388 Result: 389 (_|_){ 390 - // [structural cycle] 391 + // [eval] 392 cycle: (_|_){ 393 // [structural cycle] 394 a: (_|_){ 395 @@ -58,22 +111,72 @@ 396 x: (#list){ 397 } 398 } 399 - issue3042: (struct){ 400 + issue3042: (_|_){ 401 + // [eval] 402 #foo: (string){ =~"^foo" } 403 #nesting: ((string|list|struct)){ |((string){ string }, (#struct){ 404 - name?: (string){ =~"^foo" } 405 + name?: (_|_){ 406 + // [structural cycle] issue3042.#nesting.name: structural cycle 407 + } 408 }, (list){ 409 }) } 410 - data: (#struct){ 411 - secret: (#struct){ 412 - infra: (#list){ 413 - 0: (struct){ 414 - name: (string){ "bar1" } 415 - } 416 - } 417 - name?: (string){ =~"^foo" } 418 + data: (_|_){ 419 + // [eval] issue3042.data: conflicting values [...#nesting] and {secret:{infra:[{name:"bar1"}]}} (mismatched types list and struct): 420 + // ./issue3042.cue:5:57 421 + // ./issue3042.cue:7:19 422 + // issue3042.data: conflicting values string and {secret:{infra:[{name:"bar1"}]}} (mismatched types string and struct): 423 + // ./issue3042.cue:5:12 424 + // ./issue3042.cue:7:19 425 + // issue3042.data.secret: conflicting values [...#nesting] and {infra:[{name:"bar1"}]} (mismatched types list and struct): 426 + // ./issue3042.cue:5:57 427 + // ./issue3042.cue:8:11 428 + // issue3042.data.secret: conflicting values string and {infra:[{name:"bar1"}]} (mismatched types string and struct): 429 + // ./issue3042.cue:5:12 430 + // ./issue3042.cue:8:11 431 + // issue3042.data.secret: field not allowed: 432 + // ./issue3042.cue:8:3 433 + // issue3042.data.secret.infra: adding field name not allowed as field set was already referenced 434 + // issue3042.data.secret.infra: conflicting values [{name:"bar1"}] and string (mismatched types list and string): 435 + // ./issue3042.cue:5:12 436 + // ./issue3042.cue:9:11 437 + // issue3042.data.secret.infra: conflicting values [{name:"bar1"}] and {name?:#foo,[string]:#nesting} (mismatched types list and struct): 438 + // ./issue3042.cue:5:21 439 + // ./issue3042.cue:9:11 440 + // issue3042.data.secret.infra: field not allowed: 441 + // ./issue3042.cue:9:4 442 + // issue3042.data.secret.infra.0: conflicting values [...#nesting] and {name:"bar1"} (mismatched types list and struct): 443 + // ./issue3042.cue:5:57 444 + // ./issue3042.cue:10:5 445 + // issue3042.data.secret.infra.0: conflicting values string and {name:"bar1"} (mismatched types string and struct): 446 + // ./issue3042.cue:5:12 447 + // ./issue3042.cue:10:5 448 + // issue3042.data.secret.infra.0: field not allowed: 449 + // ./issue3042.cue:10:5 450 + // issue3042.data.secret.infra.0.name: conflicting values "bar1" and [...#nesting] (mismatched types string and list): 451 + // ./issue3042.cue:5:57 452 + // ./issue3042.cue:10:12 453 + // issue3042.data.secret.infra.0.name: conflicting values "bar1" and {name?:#foo,[string]:#nesting} (mismatched types string and struct): 454 + // ./issue3042.cue:5:21 455 + // ./issue3042.cue:10:12 456 + // issue3042.data.secret.infra.0.name: field not allowed: 457 + // ./issue3042.cue:10:6 458 + // issue3042.data.secret.infra.0.name: invalid value "bar1" (out of bound =~"^foo"): 459 + // ./issue3042.cue:4:8 460 + // ./issue3042.cue:10:12 461 + // issue3042.data.secret.infra.name: cyclic reference to field name: 462 + // ./issue3042.cue:5:22 463 + // issue3042.data.secret: field not allowed: 464 + // ./issue3042.cue:5:57 465 + // ./issue3042.cue:8:3 466 + // issue3042.data.secret.infra: field not allowed: 467 + // ./issue3042.cue:5:57 468 + // ./issue3042.cue:9:4 469 + // issue3042.data.secret.infra.0.name: field not allowed: 470 + // ./issue3042.cue:5:57 471 + // ./issue3042.cue:10:6 472 + secret: (struct){ 473 + infra: (_){ _ } 474 } 475 - name?: (string){ =~"^foo" } 476 } 477 } 478 } 479 -- diff/explanation -- 480 issue3042: The old evaluator incorrectly resolved to a concrete value, 481 whereas the new evaluator correctly spots that data.secret.infra.name does not unify with #foo. 482 -- out/compile -- 483 --- in.cue 484 { 485 cycle: { 486 a: 〈1;cycle〉 487 } 488 r1a: (〈0;cycle〉|int) 489 r1b: (int|〈0;cycle〉) 490 r2a: (〈0;cycle〉|1) 491 r2b: (1|〈0;cycle〉) 492 r3a: (〈0;cycle〉|null) 493 r3b: (null|〈0;cycle〉) 494 r4a: (〈0;cycle〉|{}) 495 r4b: ({}|〈0;cycle〉) 496 r5a: (〈0;cycle〉|[]) 497 r5b: ([]|〈0;cycle〉) 498 s1a: { 499 x: (〈1;s1a〉|int) 500 } 501 s1b: { 502 x: (int|〈1;s1b〉) 503 } 504 s2a: { 505 x: (〈1;s2a〉|1) 506 } 507 s2b: { 508 x: (1|〈1;s2b〉) 509 } 510 s3a: { 511 x: (〈1;s3a〉|null) 512 } 513 s3b: { 514 x: (null|〈1;s3b〉) 515 } 516 s4a: { 517 x: (〈1;s4a〉|{}) 518 } 519 s4b: { 520 x: ({}|〈1;s4b〉) 521 } 522 s5a: { 523 x: (〈1;s5a〉|[]) 524 } 525 s5b: { 526 x: ([]|〈1;s5b〉) 527 } 528 } 529 --- issue3042.cue 530 { 531 issue3042: { 532 #foo: =~"^foo" 533 #nesting: (string|{ 534 name?: 〈1;#foo〉 535 [string]: 〈1;#nesting〉 536 }|[ 537 ...〈1;#nesting〉, 538 ]) 539 data: (〈0;#nesting〉 & { 540 secret: { 541 infra: [ 542 { 543 name: "bar1" 544 }, 545 ] 546 } 547 }) 548 } 549 }