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  }