// Copyright (c) 2020, 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.

/// @assertion
/// NORM(C<T0, ..., Tn>) = C<R0, ..., Rn> where Ri is NORM(Ti)
///
/// @description Checks that NORM(C<T0, ..., Tn>) = C<R0, ..., Rn> where Ri is
/// NORM(Ti). Test FutureOr<T> where Future<T> <: T
///
/// @author sgrekhov@unipro.ru

// Requirements=nnbd-strong
import 'dart:async';

class A<X> {}
class B<X> implements A<X> {}
class C<X> {}

class CO extends B<C<FutureOr<Object>>> implements A<C<Object>> {}
class CD extends B<C<FutureOr<dynamic>>> implements A<C<dynamic>> {}
class CV extends B<C<FutureOr<void>>> implements A<C<void>> {}

main() {
  new CO();
  new CD();
  new CV();
}
