// 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.md file.

class C<T, S> {
  foo(S s) => (T x) {
        T y = x;
        Object z = y;
        C<T, S> self = this;
        return z as T;
      };

  bar() {
    C<T, S> self = this;
  }

  baz() {
    return () => () => new C<T, S>();
  }

  factory C() {
    local() {
      C<T, S> self = new C<T, S>.internal();
      return self;
    }

    return local();
  }
  C.internal();
}

main(arguments) {
  print(new C<String, String>().foo(null)(arguments.first));
  dynamic c = new C<int, int>().baz()()();
  if (c is! C<int, int>) throw "$c fails type test 'is C<int, int>'";
  if (c is C<String, String>) {
    throw "$c passes type test 'is C<String, String>'";
  }
  print(c);
}
