blob: b4665a06dab606e03beb2b7523370b9586a7cad6 [file] [log] [blame]
// 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.
// @dart = 2.9
// Test various invalid mixin applications due to insufficient super-invoked
// methods.
abstract class UnaryNum {
num foo(num x);
}
abstract class UnaryOptionalNum {
num foo([num x]);
}
// When a mixin is applied, the super-invoked methods must have
// a concrete implementation in the superclass which satisfies
// the signature in the super-interfaces.
mixin M1 on UnaryNum {
num bar() {
return super.foo(42.0);
}
}
mixin M11 on UnaryNum {
num bar() {
return 0.0;
}
num foo(num x) {
return super.foo(42.0);
}
}
// The super-invoked method must be non-abstract.
class A1 extends UnaryNum //
with M1 //# 04: compile-time error
with M11 //# 05: compile-time error
with M1, M11 //# 06: compile-time error
with M11, M1 //# 07: compile-time error
{
// M1.bar does super.foo and UnaryNum has no implementation.
num foo(num x) => x;
}
// The super-invoked method must satisfy the most specific signature
// among super-interfaces of the mixin.
class C1 {
num foo(num x) => x;
}
abstract class C2 extends C1 implements UnaryOptionalNum {
num foo([num x]);
}
mixin M2 on UnaryOptionalNum {
num bar() {
// Allowed, super.foo has signature num Function([num]).
return super.foo(42.0);
}
}
class A2 extends C2 //
with M2 //# 08: compile-time error
{
// M2.bar does a super.foo, so C2.foo must satisfy the super-interface of M2.
// It doesn't, even if the super-call would succeed against C1.foo.
num foo([num x]) => x ?? 0;
}
main() {
A1().bar(); //# 04: continued
A1().bar(); //# 05: continued
A1().bar(); //# 06: continued
A1().bar(); //# 07: continued
A2().bar(); //# 08: continued
}