cuelang.org/go@v0.13.0/cue/testdata/cycle/051_resolved_self-reference_cycles_with_disjunction.txtar (about)

     1  #name: resolved self-reference cycles with disjunction
     2  #evalPartial
     3  
     4  // TODO(cycle)
     5  //
     6  // Some of these examples used to work, but the changes corresponding to this
     7  // addition, it ceased to do so. Fixing these cycle issues seemed more
     8  // important than keeping this esoteric case working, which was already broken
     9  // in the last release anyway.
    10  //
    11  // Reproducer of underlying problem. Still works, but triggers unexpected
    12  // condition.
    13  //
    14  // xb1: xb2
    15  // xb2: xb3
    16  // xb3: xb2 + 0
    17  
    18  -- in.cue --
    19  // The second disjunct in xa1 is not resolvable and can be
    20  // eliminated:
    21  //   xa4 & 9
    22  //   (xa2 + 2) & 9
    23  //   ((xa3 + 2) + 2) & 9
    24  //   (((6 & xa1-2) + 2) + 2) & 9
    25  //   ((6 + 2) + 2) & 9 // 6 == xa1-2
    26  //   10 & 9 => _|_
    27  // The remaining values resolve.
    28  xa1: (xa2 & 8) | (xa4 & 9)
    29  xa2: xa3 + 2
    30  xa3: 6 & xa1-2
    31  xa4: xa2 + 2
    32  
    33  xb1: (xb2 & 8) | (xb4 & 9)
    34  xb2: xb3 + 2
    35  xb3: (6 & (xb1 - 2)) | (xb4 & 9)
    36  xb4: xb2 + 2
    37  
    38  // Another variant with more disjunctions. xc1 remains with two
    39  // possibilities. Technically, only the first value is valid.
    40  // However, to fully determine that, all options of the remaining
    41  // disjunction will have to be evaluated algebraically, which is
    42  // not done.
    43  xc1: xc2 & 8 | xc4 & 9 | xc5 & 9
    44  xc2: xc3 + 2
    45  xc3: 6 & xc1-2
    46  xc4: xc2 + 1
    47  xc5: xc2 + 2
    48  
    49  // The below is resolved by setting xd1 explicitly.
    50  xd1: xd2 & 8 | xd4 & 9 | xd5 & 9
    51  xd2: xd3 + 2
    52  xd3: 6 & xd1-2
    53  xd4: xd2 + 1
    54  xd5: xd2 + 2
    55  xd1: 8
    56  
    57  // The below is resolved by setting xd1 explicitly to the wrong
    58  // value, resulting in an error.
    59  xe1: xe2 & 8 | xe4 & 9 | xe5 & 9
    60  xe2: xe3 + 2
    61  xe3: 6 & xe1-2
    62  xe4: xe2 + 1
    63  xe5: xe2 + 2
    64  xe1: 9
    65  
    66  xf1: xf2 & 8 | xf4 & 9
    67  xf2: xf3 + 2
    68  xf3: 6 & xf1-2 | xf4 & 9
    69  xf4: xf2 + 2
    70  
    71  z1: z2+1 | z3+5 // +3 for fun
    72  z2: z3 + 2
    73  z3: z1 - 3
    74  z3: 8
    75  -- out/def --
    76  // The second disjunct in xa1 is not resolvable and can be
    77  // eliminated:
    78  //   xa4 & 9
    79  //   (xa2 + 2) & 9
    80  //   ((xa3 + 2) + 2) & 9
    81  //   (((6 & xa1-2) + 2) + 2) & 9
    82  //   ((6 + 2) + 2) & 9 // 6 == xa1-2
    83  //   10 & 9 => _|_
    84  // The remaining values resolve.
    85  xa1: 8
    86  xa2: 8
    87  xa4: 10
    88  xa3: 6
    89  
    90  // The second disjunct in xb4 can be eliminated as both disjuncts
    91  // of xb3 result in an incompatible sum when substituted.
    92  xb1: 8
    93  xb2: 8
    94  xb4: 10
    95  xb3: 6
    96  
    97  // Another variant with more disjunctions. xc1 remains with two
    98  // possibilities. Technically, only the first value is valid.
    99  // However, to fully determine that, all options of the remaining
   100  // disjunction will have to be evaluated algebraically, which is
   101  // not done.
   102  xc1: xc2 & 8 | xc4 & 9 | xc5 & 9
   103  xc2: xc3 + 2
   104  xc4: xc2 + 1
   105  xc5: xc2 + 2
   106  xc3: 6 & xc1-2
   107  
   108  // The above is resolved by setting xd1 explicitly.
   109  xd1: 8
   110  xd2: 8
   111  xd4: 9
   112  xd5: 10
   113  xd3: 6
   114  
   115  // The above is resolved by setting xd1 explicitly to the wrong
   116  // value, resulting in an error.
   117  xe1: _|_ // conflicting values 6 and 7
   118  xe2: _|_ // conflicting values 6 and 7
   119  xe4: _|_ // conflicting values 6 and 7
   120  xe5: _|_ // conflicting values 6 and 7
   121  xe3: _|_ // conflicting values 6 and 7
   122  
   123  // Only one solution.
   124  xf1: 8
   125  xf2: 8
   126  xf4: 10
   127  xf3: 6
   128  z1:  z2+1 | z3+5
   129  z2:  z3 + 2
   130  z3:  z1-3 & 8
   131  -- out/legacy-debug --
   132  <0>{xa1: 8, xa2: 8, xa4: 10, xa3: 6, xb1: 8, xb2: 8, xb4: 10, xb3: 6, xc1: ((<1>.xc2 & 8) | (<1>.xc4 & 9) | (<1>.xc5 & 9)), xc2: (<1>.xc3 + 2), xc4: (<1>.xc2 + 1), xc5: (<1>.xc2 + 2), xc3: (6 & (<1>.xc1 - 2)), xd1: 8, xd2: 8, xd4: 9, xd5: 10, xd3: 6, xe1: _|_((6 & 7):conflicting values 6 and 7), xe2: _|_((6 & 7):conflicting values 6 and 7), xe4: _|_((6 & 7):conflicting values 6 and 7), xe5: _|_((6 & 7):conflicting values 6 and 7), xe3: _|_((6 & 7):conflicting values 6 and 7), xf1: 8, xf2: 8, xf4: 10, xf3: 6, z1: ((<1>.z2 + 1) | (<1>.z3 + 5)), z2: (<1>.z3 + 2), z3: ((<1>.z1 - 3) & 8)}
   133  -- out/compile --
   134  --- in.cue
   135  {
   136    xa1: ((〈0;xa2〉 & 8)|(〈0;xa4〉 & 9))
   137    xa2: (〈0;xa3〉 + 2)
   138    xa3: (6 & (〈0;xa1〉 - 2))
   139    xa4: (〈0;xa2〉 + 2)
   140    xb1: ((〈0;xb2〉 & 8)|(〈0;xb4〉 & 9))
   141    xb2: (〈0;xb3〉 + 2)
   142    xb3: ((6 & (〈0;xb1〉 - 2))|(〈0;xb4〉 & 9))
   143    xb4: (〈0;xb2〉 + 2)
   144    xc1: ((〈0;xc2〉 & 8)|(〈0;xc4〉 & 9)|(〈0;xc5〉 & 9))
   145    xc2: (〈0;xc3〉 + 2)
   146    xc3: (6 & (〈0;xc1〉 - 2))
   147    xc4: (〈0;xc2〉 + 1)
   148    xc5: (〈0;xc2〉 + 2)
   149    xd1: ((〈0;xd2〉 & 8)|(〈0;xd4〉 & 9)|(〈0;xd5〉 & 9))
   150    xd2: (〈0;xd3〉 + 2)
   151    xd3: (6 & (〈0;xd1〉 - 2))
   152    xd4: (〈0;xd2〉 + 1)
   153    xd5: (〈0;xd2〉 + 2)
   154    xd1: 8
   155    xe1: ((〈0;xe2〉 & 8)|(〈0;xe4〉 & 9)|(〈0;xe5〉 & 9))
   156    xe2: (〈0;xe3〉 + 2)
   157    xe3: (6 & (〈0;xe1〉 - 2))
   158    xe4: (〈0;xe2〉 + 1)
   159    xe5: (〈0;xe2〉 + 2)
   160    xe1: 9
   161    xf1: ((〈0;xf2〉 & 8)|(〈0;xf4〉 & 9))
   162    xf2: (〈0;xf3〉 + 2)
   163    xf3: ((6 & (〈0;xf1〉 - 2))|(〈0;xf4〉 & 9))
   164    xf4: (〈0;xf2〉 + 2)
   165    z1: ((〈0;z2〉 + 1)|(〈0;z3〉 + 5))
   166    z2: (〈0;z3〉 + 2)
   167    z3: (〈0;z1〉 - 3)
   168    z3: 8
   169  }
   170  -- out/eval/stats --
   171  Leaks:  0
   172  Freed:  52
   173  Reused: 44
   174  Allocs: 8
   175  Retain: 24
   176  
   177  Unifications: 31
   178  Conjuncts:    128
   179  Disjuncts:    60
   180  -- out/evalalpha --
   181  Errors:
   182  xe3: conflicting values 7 and 6:
   183      ./in.cue:43:6
   184      ./in.cue:43:10
   185  
   186  Result:
   187  (_|_){
   188    // [eval]
   189    xa1: (int){ 8 }
   190    xa2: (int){ 8 }
   191    xa3: (int){ 6 }
   192    xa4: (int){ 10 }
   193    xb1: (_|_){
   194      // [cycle] xb1: 4 errors in empty disjunction:
   195      // xb2: unresolved disjunction: xb3:
   196      //     ./in.cue:16:6
   197      // xb3: 3 errors in empty disjunction::
   198      //     ./in.cue:16:6
   199      // xb3: unresolved disjunction: xb1:
   200      //     ./in.cue:17:12
   201      // xb3: cycle with field: xb2:
   202      //     ./in.cue:18:6
   203    }
   204    xb2: (_|_){
   205      // [cycle] xb2: unresolved disjunction: xb3:
   206      //     ./in.cue:16:6
   207      // xb3: cycle with field: xb2:
   208      //     ./in.cue:18:6
   209    }
   210    xb3: (_|_){
   211      // [cycle] xb2: unresolved disjunction: xb3:
   212      //     ./in.cue:16:6
   213      // xb3: 3 errors in empty disjunction::
   214      //     ./in.cue:16:6
   215      // xb3: unresolved disjunction: xb1:
   216      //     ./in.cue:17:12
   217      // xb3: cycle with field: xb2:
   218      //     ./in.cue:18:6
   219    }
   220    xb4: (_|_){
   221      // [cycle] xb2: unresolved disjunction: xb3:
   222      //     ./in.cue:16:6
   223      // xb3: cycle with field: xb2:
   224      //     ./in.cue:18:6
   225    }
   226    xc1: (int){ |((int){ 8 }, (int){ 9 }) }
   227    xc2: (int){ 8 }
   228    xc3: (_|_){
   229      // [incomplete] xc3: unresolved disjunction 8 | 9 (type int):
   230      //     ./in.cue:27:10
   231    }
   232    xc4: (int){ 9 }
   233    xc5: (int){ 10 }
   234    xd1: (int){ 8 }
   235    xd2: (int){ 8 }
   236    xd3: (int){ 6 }
   237    xd4: (int){ 9 }
   238    xd5: (int){ 10 }
   239    xe1: (int){ 9 }
   240    xe2: (int){ 8 }
   241    xe3: (_|_){
   242      // [eval] xe3: conflicting values 7 and 6:
   243      //     ./in.cue:43:6
   244      //     ./in.cue:43:10
   245    }
   246    xe4: (int){ 9 }
   247    xe5: (int){ 10 }
   248    xf1: (_|_){
   249      // [cycle] xf1: 4 errors in empty disjunction:
   250      // xf2: unresolved disjunction: xf3:
   251      //     ./in.cue:49:6
   252      // xf3: 3 errors in empty disjunction::
   253      //     ./in.cue:49:6
   254      // xf3: unresolved disjunction: xf1:
   255      //     ./in.cue:50:10
   256      // xf3: cycle with field: xf2:
   257      //     ./in.cue:51:6
   258    }
   259    xf2: (_|_){
   260      // [cycle] xf2: unresolved disjunction: xf3:
   261      //     ./in.cue:49:6
   262      // xf3: cycle with field: xf2:
   263      //     ./in.cue:51:6
   264    }
   265    xf3: (_|_){
   266      // [cycle] xf2: unresolved disjunction: xf3:
   267      //     ./in.cue:49:6
   268      // xf3: 3 errors in empty disjunction::
   269      //     ./in.cue:49:6
   270      // xf3: unresolved disjunction: xf1:
   271      //     ./in.cue:50:10
   272      // xf3: cycle with field: xf2:
   273      //     ./in.cue:51:6
   274    }
   275    xf4: (_|_){
   276      // [cycle] xf2: unresolved disjunction: xf3:
   277      //     ./in.cue:49:6
   278      // xf3: cycle with field: xf2:
   279      //     ./in.cue:51:6
   280    }
   281    z1: (int){ |((int){ 11 }, (int){ 13 }) }
   282    z2: (int){ 10 }
   283    z3: (_|_){
   284      // [incomplete] z3: unresolved disjunction 11 | 13 (type int):
   285      //     ./in.cue:55:5
   286    }
   287  }
   288  -- diff/-out/evalalpha<==>+out/eval --
   289  diff old new
   290  --- old
   291  +++ new
   292  @@ -11,20 +11,37 @@
   293     xa3: (int){ 6 }
   294     xa4: (int){ 10 }
   295     xb1: (_|_){
   296  -    // [incomplete] xb1: 2 errors in empty disjunction:
   297  -    // xb1: unresolved disjunction 6 | 9 (type int):
   298  -    //     ./in.cue:16:6
   299  -    // xb2: unresolved disjunction 6 | 9 (type int):
   300  -    //     ./in.cue:16:6
   301  +    // [cycle] xb1: 4 errors in empty disjunction:
   302  +    // xb2: unresolved disjunction: xb3:
   303  +    //     ./in.cue:16:6
   304  +    // xb3: 3 errors in empty disjunction::
   305  +    //     ./in.cue:16:6
   306  +    // xb3: unresolved disjunction: xb1:
   307  +    //     ./in.cue:17:12
   308  +    // xb3: cycle with field: xb2:
   309  +    //     ./in.cue:18:6
   310     }
   311     xb2: (_|_){
   312  -    // [incomplete] xb2: unresolved disjunction 6 | 9 (type int):
   313  -    //     ./in.cue:16:6
   314  -  }
   315  -  xb3: (int){ |((int){ 6 }, (int){ 9 }) }
   316  +    // [cycle] xb2: unresolved disjunction: xb3:
   317  +    //     ./in.cue:16:6
   318  +    // xb3: cycle with field: xb2:
   319  +    //     ./in.cue:18:6
   320  +  }
   321  +  xb3: (_|_){
   322  +    // [cycle] xb2: unresolved disjunction: xb3:
   323  +    //     ./in.cue:16:6
   324  +    // xb3: 3 errors in empty disjunction::
   325  +    //     ./in.cue:16:6
   326  +    // xb3: unresolved disjunction: xb1:
   327  +    //     ./in.cue:17:12
   328  +    // xb3: cycle with field: xb2:
   329  +    //     ./in.cue:18:6
   330  +  }
   331     xb4: (_|_){
   332  -    // [incomplete] xb2: unresolved disjunction 6 | 9 (type int):
   333  -    //     ./in.cue:16:6
   334  +    // [cycle] xb2: unresolved disjunction: xb3:
   335  +    //     ./in.cue:16:6
   336  +    // xb3: cycle with field: xb2:
   337  +    //     ./in.cue:18:6
   338     }
   339     xc1: (int){ |((int){ 8 }, (int){ 9 }) }
   340     xc2: (int){ 8 }
   341  @@ -49,20 +66,37 @@
   342     xe4: (int){ 9 }
   343     xe5: (int){ 10 }
   344     xf1: (_|_){
   345  -    // [incomplete] xf1: 2 errors in empty disjunction:
   346  -    // xf1: unresolved disjunction 6 | 9 (type int):
   347  -    //     ./in.cue:49:6
   348  -    // xf2: unresolved disjunction 6 | 9 (type int):
   349  -    //     ./in.cue:49:6
   350  +    // [cycle] xf1: 4 errors in empty disjunction:
   351  +    // xf2: unresolved disjunction: xf3:
   352  +    //     ./in.cue:49:6
   353  +    // xf3: 3 errors in empty disjunction::
   354  +    //     ./in.cue:49:6
   355  +    // xf3: unresolved disjunction: xf1:
   356  +    //     ./in.cue:50:10
   357  +    // xf3: cycle with field: xf2:
   358  +    //     ./in.cue:51:6
   359     }
   360     xf2: (_|_){
   361  -    // [incomplete] xf2: unresolved disjunction 6 | 9 (type int):
   362  -    //     ./in.cue:49:6
   363  -  }
   364  -  xf3: (int){ |((int){ 6 }, (int){ 9 }) }
   365  +    // [cycle] xf2: unresolved disjunction: xf3:
   366  +    //     ./in.cue:49:6
   367  +    // xf3: cycle with field: xf2:
   368  +    //     ./in.cue:51:6
   369  +  }
   370  +  xf3: (_|_){
   371  +    // [cycle] xf2: unresolved disjunction: xf3:
   372  +    //     ./in.cue:49:6
   373  +    // xf3: 3 errors in empty disjunction::
   374  +    //     ./in.cue:49:6
   375  +    // xf3: unresolved disjunction: xf1:
   376  +    //     ./in.cue:50:10
   377  +    // xf3: cycle with field: xf2:
   378  +    //     ./in.cue:51:6
   379  +  }
   380     xf4: (_|_){
   381  -    // [incomplete] xf2: unresolved disjunction 6 | 9 (type int):
   382  -    //     ./in.cue:49:6
   383  +    // [cycle] xf2: unresolved disjunction: xf3:
   384  +    //     ./in.cue:49:6
   385  +    // xf3: cycle with field: xf2:
   386  +    //     ./in.cue:51:6
   387     }
   388     z1: (int){ |((int){ 11 }, (int){ 13 }) }
   389     z2: (int){ 10 }
   390  -- out/eval --
   391  Errors:
   392  xe3: conflicting values 7 and 6:
   393      ./in.cue:43:6
   394      ./in.cue:43:10
   395  
   396  Result:
   397  (_|_){
   398    // [eval]
   399    xa1: (int){ 8 }
   400    xa2: (int){ 8 }
   401    xa3: (int){ 6 }
   402    xa4: (int){ 10 }
   403    xb1: (_|_){
   404      // [incomplete] xb1: 2 errors in empty disjunction:
   405      // xb1: unresolved disjunction 6 | 9 (type int):
   406      //     ./in.cue:16:6
   407      // xb2: unresolved disjunction 6 | 9 (type int):
   408      //     ./in.cue:16:6
   409    }
   410    xb2: (_|_){
   411      // [incomplete] xb2: unresolved disjunction 6 | 9 (type int):
   412      //     ./in.cue:16:6
   413    }
   414    xb3: (int){ |((int){ 6 }, (int){ 9 }) }
   415    xb4: (_|_){
   416      // [incomplete] xb2: unresolved disjunction 6 | 9 (type int):
   417      //     ./in.cue:16:6
   418    }
   419    xc1: (int){ |((int){ 8 }, (int){ 9 }) }
   420    xc2: (int){ 8 }
   421    xc3: (_|_){
   422      // [incomplete] xc3: unresolved disjunction 8 | 9 (type int):
   423      //     ./in.cue:27:10
   424    }
   425    xc4: (int){ 9 }
   426    xc5: (int){ 10 }
   427    xd1: (int){ 8 }
   428    xd2: (int){ 8 }
   429    xd3: (int){ 6 }
   430    xd4: (int){ 9 }
   431    xd5: (int){ 10 }
   432    xe1: (int){ 9 }
   433    xe2: (int){ 8 }
   434    xe3: (_|_){
   435      // [eval] xe3: conflicting values 7 and 6:
   436      //     ./in.cue:43:6
   437      //     ./in.cue:43:10
   438    }
   439    xe4: (int){ 9 }
   440    xe5: (int){ 10 }
   441    xf1: (_|_){
   442      // [incomplete] xf1: 2 errors in empty disjunction:
   443      // xf1: unresolved disjunction 6 | 9 (type int):
   444      //     ./in.cue:49:6
   445      // xf2: unresolved disjunction 6 | 9 (type int):
   446      //     ./in.cue:49:6
   447    }
   448    xf2: (_|_){
   449      // [incomplete] xf2: unresolved disjunction 6 | 9 (type int):
   450      //     ./in.cue:49:6
   451    }
   452    xf3: (int){ |((int){ 6 }, (int){ 9 }) }
   453    xf4: (_|_){
   454      // [incomplete] xf2: unresolved disjunction 6 | 9 (type int):
   455      //     ./in.cue:49:6
   456    }
   457    z1: (int){ |((int){ 11 }, (int){ 13 }) }
   458    z2: (int){ 10 }
   459    z3: (_|_){
   460      // [incomplete] z3: unresolved disjunction 11 | 13 (type int):
   461      //     ./in.cue:55:5
   462    }
   463  }