// Copyright (c) 2013, 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 = 2.9

// Check that cyclic reference of a typedef is a compile-time error.

// To test various cyclic references the definition of the [:typedef A():] is
// split over several lines:
typedef

// Cyclic through return type.
A //# 01: compile-time error

    A // The name of the typedef

// Cyclic through type variable bound.
<T extends A> //# 10: compile-time error

// Cyclic through generic type variable bound.
<T extends List<A>> //# 11: compile-time error

    (// The left parenthesis of the typedef arguments.

// Cyclic through parameter type.
A a //# 02: compile-time error

// Cyclic through optional parameter type.
[A a] //# 03: compile-time error

// Cyclic through named parameter type.
{A a} //# 04: compile-time error

// Cyclic through generic parameter type.
List<A> a //# 05: compile-time error

// Cyclic through return type of function typed parameter.
A f() //# 06: compile-time error

// Cyclic through parameter type of function typed parameter.
f(A a) //# 07: compile-time error

// Cyclic through another typedef.
B b //# 08: compile-time error

// Cyclic through another more typedefs.
C c //# 09: compile-time error

// Reference through a class is not a cyclic self-reference.
Class c //# 12: ok

// Reference through a class type bound is not a cyclic self-reference.
Class c //# 13: compile-time error

    ); // The right parenthesis of the typedef arguments.

typedef B(A a);
typedef C(B b);

class Class
<T extends A> //# 13: continued
{
  A a; //# 12: continued
}

void testA(A a) {}

void main() {
  testA(null);
}
