// 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 = 37.0]) => x;
}

class A1 = C1 with M1;
class A2 = C1 with M2;
class A3 = C1 with M3;
main() {
  A1().bar();
  A2().bar();
  A3().bar();
}
