@@ -1252,16 +1252,52 @@ class TypeComparer(initctx: Context) extends ConstraintHandling[AbsentContext] {
12521252 */
12531253 private def either (op1 : => Boolean , op2 : => Boolean ): Boolean = {
12541254 val preConstraint = constraint
1255- op1 && {
1256- val leftConstraint = constraint
1257- constraint = preConstraint
1258- if (! (op2 && subsumes(leftConstraint, constraint, preConstraint))) {
1259- if (constr != noPrinter && ! subsumes(constraint, leftConstraint, preConstraint))
1260- constr.println(i " CUT - prefer $leftConstraint over $constraint" )
1261- constraint = leftConstraint
1262- }
1263- true
1264- } || op2
1255+
1256+ if (ctx.mode.is(Mode .GADTflexible )) {
1257+ val preGadt = ctx.gadt.fresh
1258+ // if GADTflexible mode is on, we always have a SmartGADTMap
1259+ val pre = preGadt.asInstanceOf [SmartGADTMap ]
1260+ if (op1) {
1261+ val leftConstraint = constraint
1262+ val leftGadt = ctx.gadt.fresh
1263+ constraint = preConstraint
1264+ ctx.gadt.restore(preGadt)
1265+ if (op2) {
1266+ if (pre.subsumes(leftGadt, ctx.gadt, preGadt) && subsumes(leftConstraint, constraint, preConstraint)) {
1267+ gadts.println(i " GADT CUT - prefer ${ctx.gadt} over $leftGadt" )
1268+ constr.println(i " CUT - prefer $constraint over $leftConstraint" )
1269+ true
1270+ } else if (pre.subsumes(ctx.gadt, leftGadt, preGadt) && subsumes(constraint, leftConstraint, preConstraint)) {
1271+ gadts.println(i " GADT CUT - prefer $leftGadt over ${ctx.gadt}" )
1272+ constr.println(i " CUT - prefer $leftConstraint over $constraint" )
1273+ constraint = leftConstraint
1274+ ctx.gadt.restore(leftGadt)
1275+ true
1276+ } else {
1277+ gadts.println(i " GADT CUT - no constraint is preferable, reverting to $preGadt" )
1278+ constr.println(i " CUT - no constraint is preferable, reverting to $preConstraint" )
1279+ constraint = preConstraint
1280+ ctx.gadt.restore(preGadt)
1281+ true
1282+ }
1283+ } else {
1284+ constraint = leftConstraint
1285+ ctx.gadt.restore(leftGadt)
1286+ true
1287+ }
1288+ } else op2
1289+ } else {
1290+ op1 && {
1291+ val leftConstraint = constraint
1292+ constraint = preConstraint
1293+ if (! (op2 && subsumes(leftConstraint, constraint, preConstraint))) {
1294+ if (constr != noPrinter && ! subsumes(constraint, leftConstraint, preConstraint))
1295+ constr.println(i " CUT - prefer $leftConstraint over $constraint" )
1296+ constraint = leftConstraint
1297+ }
1298+ true
1299+ } || op2
1300+ }
12651301 }
12661302
12671303 /** Does type `tp1` have a member with name `name` whose normalized type is a subtype of
0 commit comments