583 CROSS_UPPER_LOWER() { |
583 CROSS_UPPER_LOWER() { |
584 public void apply(UndetVar uv, InferenceContext inferenceContext, Warner warn) { |
584 public void apply(UndetVar uv, InferenceContext inferenceContext, Warner warn) { |
585 Infer infer = inferenceContext.infer(); |
585 Infer infer = inferenceContext.infer(); |
586 for (Type b1 : uv.getBounds(InferenceBound.UPPER)) { |
586 for (Type b1 : uv.getBounds(InferenceBound.UPPER)) { |
587 for (Type b2 : uv.getBounds(InferenceBound.LOWER)) { |
587 for (Type b2 : uv.getBounds(InferenceBound.LOWER)) { |
588 if (!inferenceContext.inferenceVars().contains(b1) && |
588 infer.types.isSubtypeUnchecked(inferenceContext.asFree(b2), inferenceContext.asFree(b1)); |
589 !inferenceContext.inferenceVars().contains(b2) && |
|
590 infer.types.asSuper(b2, b1.tsym) != null) { |
|
591 infer.types.isSubtypeUnchecked(inferenceContext.asFree(b2), inferenceContext.asFree(b1)); |
|
592 } |
|
593 } |
589 } |
594 } |
590 } |
595 } |
591 } |
596 }, |
592 }, |
597 /** |
593 /** |
601 CROSS_UPPER_EQ() { |
597 CROSS_UPPER_EQ() { |
602 public void apply(UndetVar uv, InferenceContext inferenceContext, Warner warn) { |
598 public void apply(UndetVar uv, InferenceContext inferenceContext, Warner warn) { |
603 Infer infer = inferenceContext.infer(); |
599 Infer infer = inferenceContext.infer(); |
604 for (Type b1 : uv.getBounds(InferenceBound.UPPER)) { |
600 for (Type b1 : uv.getBounds(InferenceBound.UPPER)) { |
605 for (Type b2 : uv.getBounds(InferenceBound.EQ)) { |
601 for (Type b2 : uv.getBounds(InferenceBound.EQ)) { |
606 if (!inferenceContext.inferenceVars().contains(b1) && |
602 infer.types.isSubtypeUnchecked(inferenceContext.asFree(b2), inferenceContext.asFree(b1)); |
607 !inferenceContext.inferenceVars().contains(b2) && |
|
608 infer.types.asSuper(b2, b1.tsym) != null) { |
|
609 infer.types.isSubtypeUnchecked(inferenceContext.asFree(b2), inferenceContext.asFree(b1)); |
|
610 } |
|
611 } |
603 } |
612 } |
604 } |
613 } |
605 } |
614 }, |
606 }, |
615 /** |
607 /** |
619 CROSS_EQ_LOWER() { |
611 CROSS_EQ_LOWER() { |
620 public void apply(UndetVar uv, InferenceContext inferenceContext, Warner warn) { |
612 public void apply(UndetVar uv, InferenceContext inferenceContext, Warner warn) { |
621 Infer infer = inferenceContext.infer(); |
613 Infer infer = inferenceContext.infer(); |
622 for (Type b1 : uv.getBounds(InferenceBound.EQ)) { |
614 for (Type b1 : uv.getBounds(InferenceBound.EQ)) { |
623 for (Type b2 : uv.getBounds(InferenceBound.LOWER)) { |
615 for (Type b2 : uv.getBounds(InferenceBound.LOWER)) { |
624 if (!inferenceContext.inferenceVars().contains(b1) && |
616 infer.types.isSubtypeUnchecked(inferenceContext.asFree(b2), inferenceContext.asFree(b1)); |
625 !inferenceContext.inferenceVars().contains(b2) && |
617 } |
626 infer.types.asSuper(b2, b1.tsym) != null) { |
618 } |
627 infer.types.isSubtypeUnchecked(inferenceContext.asFree(b2), inferenceContext.asFree(b1)); |
619 } |
|
620 }, |
|
621 /** |
|
622 * Given a bound set containing {@code alpha == S} and {@code alpha == T} |
|
623 * perform {@code S == T} (which could lead to new bounds). |
|
624 */ |
|
625 CROSS_EQ_EQ() { |
|
626 public void apply(UndetVar uv, InferenceContext inferenceContext, Warner warn) { |
|
627 Infer infer = inferenceContext.infer(); |
|
628 for (Type b1 : uv.getBounds(InferenceBound.EQ)) { |
|
629 for (Type b2 : uv.getBounds(InferenceBound.EQ)) { |
|
630 if (b1 != b2) { |
|
631 infer.types.isSameType(inferenceContext.asFree(b2), inferenceContext.asFree(b1)); |
628 } |
632 } |
629 } |
633 } |
630 } |
634 } |
631 } |
635 } |
632 }, |
636 }, |