Issue 34896. Verify the superconstraint signature invoked by a mixin, not the mixin's one.
R=brianwilkerson@google.com, paulberry@google.com
Fixes: https://github.com/dart-lang/sdk/issues/34896
Change-Id: I778d572e2e2d0affb15c28d7bf2c1fbb58a8cd8a
Reviewed-on: https://dart-review.googlesource.com/c/81204
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index ed7fe2b..9f5eef9 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -4166,7 +4166,7 @@
}
FunctionType mixinMemberType =
- _inheritanceManager.getMember(mixinType, nameObject);
+ _inheritanceManager.getMember(mixinType, nameObject, forSuper: true);
if (mixinMemberType != null &&
!_typeSystem.isOverrideSubtypeOf(superMemberType, mixinMemberType)) {
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index df7494a..ca8630a 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -902,6 +902,24 @@
]);
}
+ test_error_mixinApplicationConcreteSuperInvokedMemberType_OK_method_overriddenInMixin() async {
+ addTestFile(r'''
+class A<T> {
+ void remove(T x) {}
+}
+
+mixin M<U> on A<U> {
+ void remove(Object x) {
+ super.remove(x as U);
+ }
+}
+
+class X<T> = A<T> with M<T>;
+''');
+ await resolveTestFile();
+ assertNoTestErrors();
+ }
+
test_error_mixinApplicationNoConcreteSuperInvokedMember_getter() async {
addTestFile(r'''
abstract class A {
diff --git a/tests/language_2/issue34896_test.dart b/tests/language_2/issue34896_test.dart
new file mode 100644
index 0000000..d7a0ea3
--- /dev/null
+++ b/tests/language_2/issue34896_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test: verify super-signatures of super-invoked methods of a
+// mixin against the superclass, not signatures in the mixin.
+
+class A<T> {
+ void remove(T x) {}
+}
+
+mixin M<U> on A<U> {
+ void remove(Object x) {
+ super.remove(x as U);
+ }
+}
+
+class X<T> = A<T> with M<T>;
+
+main() {}