@@ -881,6 +881,80 @@ class StrongGenericFunctionInferenceTest {
881
881
]);
882
882
}
883
883
884
+ void test_boundedByOuterClass () {
885
+ // Regression test for https://github.com/dart-lang/sdk/issues/25740.
886
+
887
+ // class A {}
888
+ var a = ElementFactory .classElement ('A' , objectType);
889
+
890
+ // class B extends A {}
891
+ var b = ElementFactory .classElement ('B' , a.type);
892
+
893
+ // class C<T extends A> {
894
+ var c = ElementFactory .classElement ('C' , objectType, ['T' ]);
895
+ (c.typeParameters[0 ] as TypeParameterElementImpl ).bound = a.type;
896
+ // S m<S extends T>(S);
897
+ var s = TypeBuilder .variable ('S' );
898
+ (s.element as TypeParameterElementImpl ).bound = c.typeParameters[0 ].type;
899
+ var m = ElementFactory .methodElement ('m' , s, [s]);
900
+ m.typeParameters = [s.element];
901
+ c.methods = [m];
902
+ // }
903
+
904
+ // C<Object> cOfObject;
905
+ var cOfObject = c.type.instantiate ([objectType]);
906
+ // C<A> cOfA;
907
+ var cOfA = c.type.instantiate ([a.type]);
908
+ // C<B> cOfB;
909
+ var cOfB = c.type.instantiate ([b.type]);
910
+ // B b;
911
+ // cOfB.m(b); // infer <B>
912
+ expect (_inferCall (cOfB.getMethod ('m' ).type, [b.type]), [b.type, b.type]);
913
+ // cOfA.m(b); // infer <B>
914
+ expect (_inferCall (cOfA.getMethod ('m' ).type, [b.type]), [a.type, b.type]);
915
+ // cOfObject.m(b); // infer <B>
916
+ expect (_inferCall (cOfObject.getMethod ('m' ).type, [b.type]),
917
+ [objectType, b.type]);
918
+ }
919
+
920
+ void test_boundedByOuterClassSubstituted () {
921
+ // Regression test for https://github.com/dart-lang/sdk/issues/25740.
922
+
923
+ // class A {}
924
+ var a = ElementFactory .classElement ('A' , objectType);
925
+
926
+ // class B extends A {}
927
+ var b = ElementFactory .classElement ('B' , a.type);
928
+
929
+ // class C<T extends A> {
930
+ var c = ElementFactory .classElement ('C' , objectType, ['T' ]);
931
+ (c.typeParameters[0 ] as TypeParameterElementImpl ).bound = a.type;
932
+ // S m<S extends Iterable<T>>(S);
933
+ var s = TypeBuilder .variable ('S' );
934
+ var iterableOfT = iterableType.instantiate ([c.typeParameters[0 ].type]);
935
+ (s.element as TypeParameterElementImpl ).bound = iterableOfT;
936
+ var m = ElementFactory .methodElement ('m' , s, [s]);
937
+ m.typeParameters = [s.element];
938
+ c.methods = [m];
939
+ // }
940
+
941
+ // C<Object> cOfObject;
942
+ var cOfObject = c.type.instantiate ([objectType]);
943
+ // C<A> cOfA;
944
+ var cOfA = c.type.instantiate ([a.type]);
945
+ // C<B> cOfB;
946
+ var cOfB = c.type.instantiate ([b.type]);
947
+ // List<B> b;
948
+ var listOfB = listType.instantiate ([b.type]);
949
+ // cOfB.m(b); // infer <B>
950
+ expect (_inferCall (cOfB.getMethod ('m' ).type, [listOfB]), [b.type, listOfB]);
951
+ // cOfA.m(b); // infer <B>
952
+ expect (_inferCall (cOfA.getMethod ('m' ).type, [listOfB]), [a.type, listOfB]);
953
+ // cOfObject.m(b); // infer <B>
954
+ expect (_inferCall (cOfObject.getMethod ('m' ).type, [listOfB]),
955
+ [objectType, listOfB]);
956
+ }
957
+
884
958
void test_boundedRecursively () {
885
959
// class Clonable<T extends Clonable<T>>
886
960
ClassElementImpl clonable =
0 commit comments