blob: 500ec141c6ae700cb443a3ec78c29f32189984d8 [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.
// Test various invalid super-invocations for mixin declarations.
abstract class UnaryInt {
num foo(int x);
}
abstract class UnaryNum {
num foo(num x);
}
abstract class UnaryOptionalNum {
num foo([num x]);
}
// Mixins may contain super-invocations.
// The super-invocation must be valid against the combined super-interfaces
// (i.e., valid against the most specific of them for that method).
mixin M1 on UnaryNum {
void bar() {
super.foo(); //# 01: compile-time error
super.foo(1, 2); //# 02: compile-time error
super.foo("not num"); //# 03: compile-time error
super.bar; //# 04: compile-time error
super + 2; //# 05: compile-time error
}
}
mixin M2 on UnaryNum, UnaryInt {
void bar() {
super.foo(4.2); // Allows most specific type.
super.foo(1, 2); //# 06: compile-time error
super.foo("not num"); //# 07: compile-time error
}
}
mixin M3 on UnaryNum, UnaryOptionalNum {
void bar() {
super.foo(4.2);
super.foo(); //# 10: ok
super.foo(1, 2); //# 08: compile-time error
super.foo("not num"); //# 09: compile-time error
}
}
class C1 implements UnaryNum, UnaryInt, UnaryOptionalNum {
num foo([num x]) => x ?? 37.0;
}
class A1 = C1 with M1;
class A2 = C1 with M2;
class A3 = C1 with M3;
main() {
A1().bar();
A2().bar();
A3().bar();
}