Issue 45492. Report TYPE_ARGUMENT_NOT_MATCHING_BOUNDS for not regular bounded type as a type alias body.

Bug: https://github.com/dart-lang/sdk/issues/45492
Change-Id: I303a7066c356e645d549960f66c1d7b8d50f307a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/193452
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov
2021-03-30 16:50:11 +00:00
committed by commit-bot@chromium.org
parent fcb9bfb81b
commit fa243e700a
2 changed files with 56 additions and 9 deletions
@@ -444,6 +444,7 @@ class TypeArgumentsVerifier {
if (parent is WithClause) return false;
if (parent is ConstructorName) return false;
if (parent is ImplementsClause) return false;
if (parent is GenericTypeAlias) return false;
return true;
}
@@ -495,6 +495,60 @@ void g() {
]);
}
test_nonFunctionTypeAlias_body_typeArgument_mismatch() async {
await assertErrorsInCode(r'''
class A {}
class B {}
class G<T extends A> {}
typedef X = G<B>;
''', [
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 60, 1),
]);
}
test_nonFunctionTypeAlias_body_typeArgument_regularBounded() async {
await assertNoErrorsInCode(r'''
class A {}
class B extends A {}
class G<T extends A> {}
typedef X = G<B>;
''');
}
test_nonFunctionTypeAlias_body_typeArgument_superBounded() async {
await assertNoErrorsInCode(r'''
class A<T extends A<T>> {}
typedef X = List<A>;
''');
}
test_nonFunctionTypeAlias_interfaceType_body_mismatch() async {
await assertErrorsInCode(r'''
class A {}
class B {}
class G<T extends A> {}
typedef X = G<B>;
''', [
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 60, 1),
]);
}
test_nonFunctionTypeAlias_interfaceType_body_regularBounded() async {
await assertNoErrorsInCode(r'''
class A<T> {}
typedef X<T> = A;
''');
}
test_nonFunctionTypeAlias_interfaceType_body_superBounded() async {
await assertErrorsInCode(r'''
class A<T extends A<T>> {}
typedef X<T> = A;
''', [
error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 42, 1),
]);
}
test_nonFunctionTypeAlias_interfaceType_parameter() async {
await assertErrorsInCode(r'''
class A {}
@@ -514,15 +568,7 @@ void f(X<B> a) {}
''');
}
test_nonFunctionTypeAlias_interfaceType_parameter_superBounded() async {
await assertNoErrorsInCode(r'''
class A {}
typedef X<T extends A> = Map<int, T>;
void f(X<Never> a) {}
''');
}
test_notRegularBounded_notSuperBounded_invariant() async {
test_notRegularBounded_notSuperBounded_parameter_invariant() async {
await assertErrorsInCode(r'''
typedef A<X> = X Function(X);
typedef G<X extends A<X>> = void Function<Y extends X>();