@@ -1219,16 +1219,52 @@ class TypeComparer(initctx: Context) extends ConstraintHandling[AbsentContext] {
1219
1219
*/
1220
1220
private def either (op1 : => Boolean , op2 : => Boolean ): Boolean = {
1221
1221
val preConstraint = constraint
1222
- op1 && {
1223
- val leftConstraint = constraint
1224
- constraint = preConstraint
1225
- if (! (op2 && subsumes(leftConstraint, constraint, preConstraint))) {
1226
- if (constr != noPrinter && ! subsumes(constraint, leftConstraint, preConstraint))
1227
- constr.println(i " CUT - prefer $leftConstraint over $constraint" )
1228
- constraint = leftConstraint
1229
- }
1230
- true
1231
- } || op2
1222
+
1223
+ if (ctx.mode.is(Mode .GADTflexible )) {
1224
+ val preGadt = ctx.gadt.fresh
1225
+ // if GADTflexible mode is on, we always have a SmartGADTMap
1226
+ val pre = preGadt.asInstanceOf [SmartGADTMap ]
1227
+ if (op1) {
1228
+ val leftConstraint = constraint
1229
+ val leftGadt = ctx.gadt.fresh
1230
+ constraint = preConstraint
1231
+ ctx.gadt.restore(preGadt)
1232
+ if (op2) {
1233
+ if (pre.subsumes(leftGadt, ctx.gadt, preGadt) && subsumes(leftConstraint, constraint, preConstraint)) {
1234
+ gadts.println(i " GADT CUT - prefer ${ctx.gadt} over $leftGadt" )
1235
+ constr.println(i " CUT - prefer $constraint over $leftConstraint" )
1236
+ true
1237
+ } else if (pre.subsumes(ctx.gadt, leftGadt, preGadt) && subsumes(constraint, leftConstraint, preConstraint)) {
1238
+ gadts.println(i " GADT CUT - prefer $leftGadt over ${ctx.gadt}" )
1239
+ constr.println(i " CUT - prefer $leftConstraint over $constraint" )
1240
+ constraint = leftConstraint
1241
+ ctx.gadt.restore(leftGadt)
1242
+ true
1243
+ } else {
1244
+ gadts.println(i " GADT CUT - no constraint is preferable, reverting to $preGadt" )
1245
+ constr.println(i " CUT - no constraint is preferable, reverting to $preConstraint" )
1246
+ constraint = preConstraint
1247
+ ctx.gadt.restore(preGadt)
1248
+ true
1249
+ }
1250
+ } else {
1251
+ constraint = leftConstraint
1252
+ ctx.gadt.restore(leftGadt)
1253
+ true
1254
+ }
1255
+ } else op2
1256
+ } else {
1257
+ op1 && {
1258
+ val leftConstraint = constraint
1259
+ constraint = preConstraint
1260
+ if (! (op2 && subsumes(leftConstraint, constraint, preConstraint))) {
1261
+ if (constr != noPrinter && ! subsumes(constraint, leftConstraint, preConstraint))
1262
+ constr.println(i " CUT - prefer $leftConstraint over $constraint" )
1263
+ constraint = leftConstraint
1264
+ }
1265
+ true
1266
+ } || op2
1267
+ }
1232
1268
}
1233
1269
1234
1270
/** Does type `tp1` have a member with name `name` whose normalized type is a subtype of
0 commit comments