#name: resolved self-reference cycles with disjunction with defaults
#evalPartial
-- in.cue --
// The disjunction in xa could be resolved, but as disjunctions
// are not resolved for expression, it remains unresolved.
xa1: (xa2 & 8) | *(xa4 & 9)
xa2: xa3 + 2
xa3: 6 & xa1-2
xa4: xa2 + 2

xb1: *(xb2 & 8) | (xb4 & 9)
xb2: xb3 + 2
xb3: *(6 & (xb1 - 2)) | (xb4 & 9)
xb4: xb2 + 2

// Another variant with more disjunctions. xc1 remains with two
// possibilities. Technically, only the first value is valid.
// However, to fully determine that, all options of the remaining
// disjunction will have to be evaluated algebraically, which is
// not done.
xc1: *(xc2 & 8) | (xc4 & 9) | (xc5 & 9)
xc2: xc3 + 2
xc3: 6 & xc1-2
xc4: xc2 + 1
xc5: xc2 + 2

// The above is resolved by setting xd1 explicitly.
xd1: *(xd2 & 8) | xd4 & 9 | xd5 & 9
xd2: xd3 + 2
xd3: 6 & xd1-2
xd4: xd2 + 1
xd5: xd2 + 2

// The above is resolved by setting xd1 explicitly to the wrong
// value, resulting in an error.
xe1: *(xe2 & 8) | xe4 & 9 | xe5 & 9
xe2: xe3 + 2
xe3: 6 & xe1-2
xe4: xe2 + 1
xe5: xe2 + 2
xe1: 9

z1: *(z2 + 1) | z3+5
z2: z3 + 2
z3: z1 - 3
z3: 8
-- out/def --
// The disjunction in xa could be resolved, but as disjunctions
// are not resolved for expression, it remains unresolved.
xa1: 8
xa2: 8
xa4: 10
xa3: 6

// As xb3 is a disjunction, xb2 cannot be resolved and evaluating
// the cycle completely is broken. However, it is not an error
// as the user might still resolve the disjunction.
xb1: 8
xb2: 8
xb4: 10
xb3: 6

// Another variant with more disjunctions. xc1 remains with two
// possibilities. Technically, only the first value is valid.
// However, to fully determine that, all options of the remaining
// disjunction will have to be evaluated algebraically, which is
// not done.
xc1: *8 | 9 | _|_ // conflicting values 10 and 9
xc2: 8
xc4: 9
xc5: 10
xc3: 6

// The above is resolved by setting xd1 explicitly.
xd1: *8 | 9 | _|_ // conflicting values 10 and 9
xd2: 8
xd4: 9
xd5: 10
xd3: 6

// The above is resolved by setting xd1 explicitly to the wrong
// value, resulting in an error.
xe1: _|_ // conflicting values 6 and 7
xe2: _|_ // conflicting values 6 and 7
xe4: _|_ // conflicting values 6 and 7
xe5: _|_ // conflicting values 6 and 7
xe3: _|_ // conflicting values 6 and 7
z1:  *11 | 13
z2:  10
z3:  8
-- out/legacy-debug --
<0>{xa1: 8, xa2: 8, xa4: 10, xa3: 6, xb1: 8, xb2: 8, xb4: 10, xb3: 6, xc1: (*8 | 9), xc2: 8, xc4: 9, xc5: 10, xc3: 6, xd1: (*8 | 9), 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), z1: (*11 | 13), z2: 10, z3: 8}
-- out/compile --
--- in.cue
{
  xa1: ((〈0;xa2〉 & 8)|*(〈0;xa4〉 & 9))
  xa2: (〈0;xa3〉 + 2)
  xa3: (6 & (〈0;xa1〉 - 2))
  xa4: (〈0;xa2〉 + 2)
  xb1: (*(〈0;xb2〉 & 8)|(〈0;xb4〉 & 9))
  xb2: (〈0;xb3〉 + 2)
  xb3: (*(6 & (〈0;xb1〉 - 2))|(〈0;xb4〉 & 9))
  xb4: (〈0;xb2〉 + 2)
  xc1: (*(〈0;xc2〉 & 8)|(〈0;xc4〉 & 9)|(〈0;xc5〉 & 9))
  xc2: (〈0;xc3〉 + 2)
  xc3: (6 & (〈0;xc1〉 - 2))
  xc4: (〈0;xc2〉 + 1)
  xc5: (〈0;xc2〉 + 2)
  xd1: (*(〈0;xd2〉 & 8)|(〈0;xd4〉 & 9)|(〈0;xd5〉 & 9))
  xd2: (〈0;xd3〉 + 2)
  xd3: (6 & (〈0;xd1〉 - 2))
  xd4: (〈0;xd2〉 + 1)
  xd5: (〈0;xd2〉 + 2)
  xe1: (*(〈0;xe2〉 & 8)|(〈0;xe4〉 & 9)|(〈0;xe5〉 & 9))
  xe2: (〈0;xe3〉 + 2)
  xe3: (6 & (〈0;xe1〉 - 2))
  xe4: (〈0;xe2〉 + 1)
  xe5: (〈0;xe2〉 + 2)
  xe1: 9
  z1: (*(〈0;z2〉 + 1)|(〈0;z3〉 + 5))
  z2: (〈0;z3〉 + 2)
  z3: (〈0;z1〉 - 3)
  z3: 8
}
-- out/eval/stats --
Leaks:  0
Freed:  44
Reused: 36
Allocs: 8
Retain: 25

Unifications: 27
Conjuncts:    82
Disjuncts:    58
-- out/evalalpha --
Errors:
xe3: conflicting values 7 and 6:
    ./in.cue:35:6
    ./in.cue:35:10

Result:
(_|_){
  // [eval]
  xa1: (int){ 8 }
  xa2: (int){ 8 }
  xa3: (int){ 6 }
  xa4: (int){ 10 }
  xb1: (_|_){
    // [cycle] xb1: 4 errors in empty disjunction:
    // xb2: unresolved disjunction: xb3:
    //     ./in.cue:9:6
    // xb3: 3 errors in empty disjunction::
    //     ./in.cue:9:6
    // xb3: unresolved disjunction: xb1:
    //     ./in.cue:10:13
    // xb3: cycle with field: xb2:
    //     ./in.cue:11:6
  }
  xb2: (_|_){
    // [cycle] xb2: unresolved disjunction: xb3:
    //     ./in.cue:9:6
    // xb3: cycle with field: xb2:
    //     ./in.cue:11:6
  }
  xb3: (_|_){
    // [cycle] xb2: unresolved disjunction: xb3:
    //     ./in.cue:9:6
    // xb3: 3 errors in empty disjunction::
    //     ./in.cue:9:6
    // xb3: unresolved disjunction: xb1:
    //     ./in.cue:10:13
    // xb3: cycle with field: xb2:
    //     ./in.cue:11:6
  }
  xb4: (_|_){
    // [cycle] xb2: unresolved disjunction: xb3:
    //     ./in.cue:9:6
    // xb3: cycle with field: xb2:
    //     ./in.cue:11:6
  }
  xc1: (int){ |(*(int){ 8 }, (int){ 9 }) }
  xc2: (int){ 8 }
  xc3: (int){ 6 }
  xc4: (int){ 9 }
  xc5: (int){ 10 }
  xd1: (int){ |(*(int){ 8 }, (int){ 9 }) }
  xd2: (int){ 8 }
  xd3: (int){ 6 }
  xd4: (int){ 9 }
  xd5: (int){ 10 }
  xe1: (int){ 9 }
  xe2: (int){ 8 }
  xe3: (_|_){
    // [eval] xe3: conflicting values 7 and 6:
    //     ./in.cue:35:6
    //     ./in.cue:35:10
  }
  xe4: (int){ 9 }
  xe5: (int){ 10 }
  z1: (int){ |(*(int){ 11 }, (int){ 13 }) }
  z2: (int){ 10 }
  z3: (int){ 8 }
}
-- diff/-out/evalalpha<==>+out/eval --
diff old new
--- old
+++ new
@@ -10,10 +10,39 @@
   xa2: (int){ 8 }
   xa3: (int){ 6 }
   xa4: (int){ 10 }
-  xb1: (int){ 8 }
-  xb2: (int){ 8 }
-  xb3: (int){ |(*(int){ 6 }, (int){ 9 }) }
-  xb4: (int){ 10 }
+  xb1: (_|_){
+    // [cycle] xb1: 4 errors in empty disjunction:
+    // xb2: unresolved disjunction: xb3:
+    //     ./in.cue:9:6
+    // xb3: 3 errors in empty disjunction::
+    //     ./in.cue:9:6
+    // xb3: unresolved disjunction: xb1:
+    //     ./in.cue:10:13
+    // xb3: cycle with field: xb2:
+    //     ./in.cue:11:6
+  }
+  xb2: (_|_){
+    // [cycle] xb2: unresolved disjunction: xb3:
+    //     ./in.cue:9:6
+    // xb3: cycle with field: xb2:
+    //     ./in.cue:11:6
+  }
+  xb3: (_|_){
+    // [cycle] xb2: unresolved disjunction: xb3:
+    //     ./in.cue:9:6
+    // xb3: 3 errors in empty disjunction::
+    //     ./in.cue:9:6
+    // xb3: unresolved disjunction: xb1:
+    //     ./in.cue:10:13
+    // xb3: cycle with field: xb2:
+    //     ./in.cue:11:6
+  }
+  xb4: (_|_){
+    // [cycle] xb2: unresolved disjunction: xb3:
+    //     ./in.cue:9:6
+    // xb3: cycle with field: xb2:
+    //     ./in.cue:11:6
+  }
   xc1: (int){ |(*(int){ 8 }, (int){ 9 }) }
   xc2: (int){ 8 }
   xc3: (int){ 6 }
-- diff/todo/p2 --
xb*: cycles are not broken if between disjuncts if they are within expressions.
-- out/eval --
Errors:
xe3: conflicting values 7 and 6:
    ./in.cue:35:6
    ./in.cue:35:10

Result:
(_|_){
  // [eval]
  xa1: (int){ 8 }
  xa2: (int){ 8 }
  xa3: (int){ 6 }
  xa4: (int){ 10 }
  xb1: (int){ 8 }
  xb2: (int){ 8 }
  xb3: (int){ |(*(int){ 6 }, (int){ 9 }) }
  xb4: (int){ 10 }
  xc1: (int){ |(*(int){ 8 }, (int){ 9 }) }
  xc2: (int){ 8 }
  xc3: (int){ 6 }
  xc4: (int){ 9 }
  xc5: (int){ 10 }
  xd1: (int){ |(*(int){ 8 }, (int){ 9 }) }
  xd2: (int){ 8 }
  xd3: (int){ 6 }
  xd4: (int){ 9 }
  xd5: (int){ 10 }
  xe1: (int){ 9 }
  xe2: (int){ 8 }
  xe3: (_|_){
    // [eval] xe3: conflicting values 7 and 6:
    //     ./in.cue:35:6
    //     ./in.cue:35:10
  }
  xe4: (int){ 9 }
  xe5: (int){ 10 }
  z1: (int){ |(*(int){ 11 }, (int){ 13 }) }
  z2: (int){ 10 }
  z3: (int){ 8 }
}
