| Index: pkg/analyzer/test/src/task/strong/checker_test.dart
|
| diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| index 64da0657c2906bf21e5a7c93b1411f0570484d52..74b40ec7e5a590e9db6d2b6ae6cd52dc9170872e 100644
|
| --- a/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| +++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
|
| @@ -62,6 +62,55 @@ void main() {
|
| ''');
|
| });
|
|
|
| + test('least upper bounds', () {
|
| + checkFile('''
|
| + typedef T Returns<T>();
|
| +
|
| + // regression test for https://github.com/dart-lang/sdk/issues/26094
|
| + class A <S extends Returns<S>, T extends Returns<T>> {
|
| + int test(bool b) {
|
| + S s;
|
| + T t;
|
| + if (b) {
|
| + return /*warning:RETURN_OF_INVALID_TYPE*/b ? s : t;
|
| + } else {
|
| + return /*warning:RETURN_OF_INVALID_TYPE*/s ?? t;
|
| + }
|
| + }
|
| + }
|
| +
|
| + class B<S, T extends S> {
|
| + T t;
|
| + S s;
|
| + int test(bool b) {
|
| + return /*warning:RETURN_OF_INVALID_TYPE*/b ? t : s;
|
| + }
|
| + }
|
| +
|
| + class C {
|
| + // Check that the least upper bound of two types with the same
|
| + // class but different type arguments produces the pointwise
|
| + // least upper bound of the type arguments
|
| + int test1(bool b) {
|
| + List<int> li;
|
| + List<double> ld;
|
| + return /*warning:RETURN_OF_INVALID_TYPE*/b ? li : ld;
|
| + }
|
| + // TODO(leafp): This case isn't handled yet. This test checks
|
| + // the case where two related classes are instantiated with related
|
| + // but different types.
|
| + Iterable<num> test2(bool b) {
|
| + List<int> li;
|
| + Iterable<double> id;
|
| + int x =
|
| + /*info:ASSIGNMENT_CAST should be warning:INVALID_ASSIGNMENT*/
|
| + b ? li : id;
|
| + return /*warning:DOWN_CAST_COMPOSITE should be pass*/b ? li : id;
|
| + }
|
| + }
|
| + ''');
|
| + });
|
| +
|
| test('setter return types', () {
|
| checkFile('''
|
| void voidFn() => null;
|
| @@ -71,7 +120,8 @@ void main() {
|
| void set c(y) => /*warning:RETURN_OF_INVALID_TYPE*/4;
|
| void set d(y) => voidFn();
|
| /*warning:NON_VOID_RETURN_FOR_SETTER*/int set e(y) => 4;
|
| - /*warning:NON_VOID_RETURN_FOR_SETTER*/int set f(y) => /*warning:RETURN_OF_INVALID_TYPE*/voidFn();
|
| + /*warning:NON_VOID_RETURN_FOR_SETTER*/int set f(y) =>
|
| + /*warning:RETURN_OF_INVALID_TYPE*/voidFn();
|
| set g(y) {return /*warning:RETURN_OF_INVALID_TYPE*/4;}
|
| void set h(y) {return /*warning:RETURN_OF_INVALID_TYPE*/4;}
|
| /*warning:NON_VOID_RETURN_FOR_SETTER*/int set i(y) {return 4;}
|
|
|