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

import "package:expect/expect.dart";

abstract class S<T extends S<T>> {
  m() => 123;
  get S_T => T;
}

class C<T extends C<T>> extends S<C<T>> {
  m() => 456;
  get C_T => T;
}

class D extends C<D> {}

main() {
  regress31434();

  Expect.equals(new C<D>().m(), 456);
  Expect.equals(new C<D>().C_T, D);
  Expect.equals(new C<D>().S_T, C<D>);
}

class F<L, R> {}

class E<L, R> extends F<E<L, Object>, R> {}

regress31434() {
  type<T>() => T;
  dynamic e = new E<int, String>();
  Expect.equals(e.runtimeType, type<E<int, String>>());
}
