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

main() {
  const f0 = 42;
  const f1; /// 01: compile-time error
  const int f2 = 87;
  const int f3; /// 02: compile-time error
  Expect.equals(42, f0);
  Expect.equals(87, f2);

  Expect.equals(42, F0);
  Expect.equals(null, F1); /// 03: compile-time error
  Expect.equals(87, F2);
  Expect.equals(null, F3); /// 04: compile-time error

  Expect.isTrue(P0 is Point);
  Expect.isTrue(P1 is int);   /// 05: compile-time error
  Expect.isTrue(P2 is Point); /// 06: compile-time error
  Expect.isTrue(P3 is int);   /// 07: compile-time error

  Expect.isTrue(A0 is int);
  Expect.isTrue(A1 is int);
  Expect.isTrue(A2 is int); /// 08: compile-time error
  Expect.isTrue(A3 is int); /// 08: continued

  Expect.isTrue(C0.X is C1);
  Expect.isTrue(C0.X.x is C1); /// 09: compile-time error

  Expect.equals("Hello 42", B2);
  Expect.equals("42Hello", B3); /// 10: compile-time error
}

const F0 = 42;
const F1;                 /// 03: continued
const int F2 = 87;
const int F3;             /// 04: continued

class Point {
  final x, y;
  const Point(this.x, this.y);
  operator +(int other) => x;
}

// Check that compile time expressions can include invocations of
// user-defined const constructors.
const P0 = const Point(0, 0);
const P1 = const Point(0, 0) + 1; /// 05: continued
const P2 = new Point(0, 0);       /// 06: continued
const P3 = new Point(0, 0) + 1;   /// 07: continued

// Check that we cannot have cyclic references in compile time
// expressions.
const A0 = 42;
const A1 = A0 + 1;
const A2 = A3 + 1; /// 08: continued
const A3 = A2 + 1; /// 08: continued

class C0 {
  static const X = const C1();
}

class C1 {
  const C1()
      : x = C0.X /// 09: continued
  ;
  final x = null;
}

// Check that sub-expressions of binary + are numeric.
const B0 = 42;
const B1 = "Hello";
const B2 = "$B1 $B0";
const B3 = B0 + B1; /// 10: continued
