@@ -1252,16 +1252,52 @@ class TypeComparer(initctx: Context) extends ConstraintHandling[AbsentContext] {
1252
1252
*/
1253
1253
private def either (op1 : => Boolean , op2 : => Boolean ): Boolean = {
1254
1254
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
+ }
1265
1301
}
1266
1302
1267
1303
/** Does type `tp1` have a member with name `name` whose normalized type is a subtype of
0 commit comments