Check for TYPE_ARGUMENT_NOT_MATCHING_BOUNDS when generic_metadata is enabled.
Change-Id: I32b4963f46c232a0ab41fb1b55ffe1c8723a34e3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/193160
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index e04a8cc..eb3b8ec 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -363,8 +363,8 @@
.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
typeArgumentList[i],
);
+ continue;
}
- continue;
}
var fnTypeParam = fnTypeParams[i];
diff --git a/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart b/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart
index cf8da3e..b8c2b5c 100644
--- a/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_argument_not_matching_bounds_test.dart
@@ -471,6 +471,30 @@
''');
}
+ test_methodInvocation_genericFunctionTypeArgument_match() async {
+ await assertNoErrorsInCode(r'''
+typedef F = void Function<T extends num>();
+void f<T extends void Function<X extends num>()>() {}
+void g() {
+ f<F>();
+}
+''');
+ }
+
+ test_methodInvocation_genericFunctionTypeArgument_mismatch() async {
+ await assertErrorsInCode(r'''
+class A {}
+class B {}
+typedef F = void Function<T extends A>();
+void f<T extends void Function<U extends B>()>() {}
+void g() {
+ f<F>();
+}
+''', [
+ error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 131, 1),
+ ]);
+ }
+
test_nonFunctionTypeAlias_interfaceType_parameter() async {
await assertErrorsInCode(r'''
class A {}