// Copyright (c) 2017, 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 test for type checks involving the void type and overriding.

import 'package:expect/expect.dart';

use<T>(T x) {}

class A<T> {
  T x;
  A(this.x);
  Object? y;
  int z = 0;

  T foo() => x;
  void bar() {}
  void gee(T x) {}

  f(A<Object?> a) {}
  g(A<void> a) {}
  h(A<T> a) {}
}

class B implements A<Object?> {
  void   //# 00: ok
  /*     //# 00: continued
  var
  */     //# 00: continued
  x;

  void   //# 00b: ok
  /*     //# 00b: continued
  var
  */     //# 00b: continued
  y;

  void   //# 00c: compile-time error
  /*     //# 00c: continued
  int
  */     //# 00c: continued
  z = 0;

  void  //# 01: ok
  foo() {}

  int bar() => 499;
  void gee(void x) {}
  f(A<void> a) {}
  g(A<void> a) {}
  h(A<void> a) {}
}

class C implements A<void> {
  void x;
  Object? y;
  int z = 0;

  void foo() {}
  void bar() {}
  void gee(void x) {
    use(x);
  }

  f(covariant C c) {}
  g(covariant C c) {}
  h(covariant C c) {}
}

class D implements A<void> {
  Object? x; // Setter will become a voidness preservation violation.
  Object? y;
  int z = 0;

  Object? foo() => null;
  void bar() {}
  void gee(
      Object? // Will become a voidness preservation violation.
      x) {}

  f(A<Object?> a) {}
  g(
      A<Object?> // Will become a voidness preservation violation.
      a) {}
  h(
      A<Object?> // Will become a voidness preservation violation.
      a) {}
}

void instantiateClasses() {
  var a = new A<void>(null);
  var b = new B();
  var c = new C();
  var d = new D();

  a.foo();
  b.foo();
  c.foo();
  d.foo();
  a.bar();
  b.bar();
  c.bar();
  d.bar();
  a.gee(499);
  b.gee(499);
  c.gee(499);
  d.gee(499);
}

void testAssignments() {
  A<void> a1 = new A<Object?>(null);
  A<Object?> a2 = new A<void>(null);
  A a3 = new A<void>(null);
  A<dynamic> a4 = new A<void>(null);
  dynamic a5 = new A<void>(null);
}

main() {
  instantiateClasses();
  testAssignments();
}
