diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart index ed7fe2bc9fd25..9f5eef91e6c08 100644 --- a/pkg/analyzer/lib/src/generated/error_verifier.dart +++ b/pkg/analyzer/lib/src/generated/error_verifier.dart @@ -4166,7 +4166,7 @@ class ErrorVerifier extends RecursiveAstVisitor<Object> { } 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 df7494a476bb6..ca8630a8f66cb 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 @@ abstract class X extends B with M {} ]); } + 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 0000000000000..d7a0ea3f18b7e --- /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() {}