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

// Tests that types do matter when an expression is evaluated as constant.

main() {
  const C c = C();
  const T.test01(c); //# 01: compile-time error
  const T.test02(c, c); //# 02: compile-time error
  const T.test03(c, c); //# 03: compile-time error
  const T.test04(c, c); //# 04: compile-time error
  const T.test05(c, c); //# 05: compile-time error
  const T.test06(c, c); //# 06: compile-time error
  const T.test07(c, c); //# 07: compile-time error
  const T.test08(c, c); //# 08: compile-time error
  const T.test09(c, c); //# 09: compile-time error
  const T.test10(c, c); //# 10: compile-time error
  const T.test11(c, c); //# 11: compile-time error
  const T.test12(c, c); //# 12: compile-time error
  const T.test13(c, c); //# 13: compile-time error
  const T.test14(c); //# 14: compile-time error
  const T.test15(c, c); //# 15: compile-time error
  const T.test16(c, c); //# 16: compile-time error
  const T.test17(c, c); //# 17: compile-time error
  const T.test18(c, c); //# 18: compile-time error
  const T.test19(c); //# 19: compile-time error

  const v01 = false ? c : -c; //# 20: compile-time error
  const v02 = false ? c : c + c; //# 21: compile-time error
  const v03 = false ? c : c - c; //# 22: compile-time error
  const v04 = false ? c : c * c; //# 23: compile-time error
  const v05 = false ? c : c / c; //# 24: compile-time error
  const v06 = false ? c : c ~/ c; //# 25: compile-time error
  const v07 = false ? c : c % c; //# 26: compile-time error
  const v08 = false ? c : c << c; //# 27: compile-time error
  const v09 = false ? c : c >> c; //# 28: compile-time error
  const v10 = false ? c : c >>> c; //# 29: compile-time error
  const v11 = false ? c : c & c; //# 30: compile-time error
  const v12 = false ? c : c | c; //# 31: compile-time error
  const v13 = false ? c : c ^ c; //# 32: compile-time error
  const v14 = false ? c : ~c; //# 33: compile-time error
  const v15 = false ? c : c < c; //# 34: compile-time error
  const v16 = false ? c : c > c; //# 35: compile-time error
  const v17 = false ? c : c <= c; //# 36: compile-time error
  const v18 = false ? c : c >= c; //# 37: compile-time error
  const v19 = false ? c : c.length; //# 38: compile-time error
}

// Each expression in the forwarding generative constructors must be
// potentially constant. They are only checked for being actually
// constant when the constructor is invoked.
class T {
  const T(C o);
  const T.test01(C x) : this(-x);
  const T.test02(C x, C y) : this(x + y);
  const T.test03(C x, C y) : this(x - y);
  const T.test04(C x, C y) : this(x * y);
  const T.test05(C x, C y) : this(x / y);
  const T.test06(C x, C y) : this(x ~/ y);
  const T.test07(C x, C y) : this(x % y);
  const T.test08(C x, C y) : this(x << y);
  const T.test09(C x, C y) : this(x >> y);
  const T.test10(C x, C y) : this(x >>> y); //# 10: continued
  const T.test11(C x, C y) : this(x & y);
  const T.test12(C x, C y) : this(x | y);
  const T.test13(C x, C y) : this(x ^ y);
  const T.test14(C x) : this(~x);
  const T.test15(C x, C y) : this(x < y);
  const T.test16(C x, C y) : this(x > y);
  const T.test17(C x, C y) : this(x <= y);
  const T.test18(C x, C y) : this(x >= y);
  const T.test19(C x) : this(x.length);
}

class C {
  const C();
  C operator -() => this;
  C operator +(C other) => this;
  C operator -(C other) => this;
  C operator *(C other) => this;
  C operator /(C other) => this;
  C operator ~/(C other) => this;
  C operator %(C other) => this;
  C operator <<(C other) => this;
  C operator >>(C other) => this;
  // Remove the multi-test markers and one of the lines below,
  // when `>>>` is implemented.
  C operator >>>(C other) => this;  //# 10: continued
  C operator >>>(C other) => this;  //# 29: continued
  C operator &(C other) => this;
  C operator |(C other) => this;
  C operator ^(C other) => this;
  C operator ~() => this;
  C operator <(C other) => this;
  C operator >(C other) => this;
  C operator <=(C other) => this;
  C operator >=(C other) => this;
  C get length => this;
}
