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

import "dart:async" show FutureOr;

import "package:expect/expect.dart";

// Check that integer literals in a double context are allowed
// for various double context.

main() {
  // Variable initializer context.
  double v1 = 0;
  Expect.identical(0.0, v1);
  double v2 = 1;
  Expect.identical(1.0, v2);
  double v3 = -0;
  Expect.identical(-0.0, v3);
  double v4 = -1;
  Expect.identical(-1.0, v4);
  double v5 = 9223372036854775808; // 2^63, not valid signed 64-bit integer.
  Expect.identical(9223372036854775808.0, v5);
  double v6 = 18446744073709551616; // 2^64.
  Expect.identical(18446744073709551616.0, v6);
  double v7 = 0x02; // Hex literal.
  Expect.identical(2.0, v7);
  double v8 = -0x02; // Hex literal.
  Expect.identical(-2.0, v8);

  // Const variable initializer context.
  const double c1 = 0;
  Expect.identical(0.0, c1);
  const double c2 = 1;
  Expect.identical(1.0, c2);
  const double c3 = -0;
  Expect.identical(-0.0, c3);
  const double c4 = -1;
  Expect.identical(-1.0, c4);
  const double c5 = 9223372036854775808;
  Expect.identical(9223372036854775808.0, c5);
  const double c6 = 18446744073709551616;
  Expect.identical(18446744073709551616.0, c6);
  const double c7 = 0x02; // Hex literal.
  Expect.identical(2.0, c7);
  const double c8 = -0x02; // Hex literal.
  Expect.identical(-2.0, c8);

  // Assignment context, variable.
  double value;
  value = 0;
  Expect.identical(0.0, value);
  value = 1;
  Expect.identical(1.0, value);
  value = -0;
  Expect.identical(-0.0, value);
  value = -1;
  Expect.identical(-1.0, value);
  value = 9223372036854775808;
  Expect.identical(9223372036854775808.0, value);
  value = 18446744073709551616;
  Expect.identical(18446744073709551616.0, value);
  value = 0x02;
  Expect.identical(2.0, value);
  value = -0x02;
  Expect.identical(-2.0, value);

  // Assignment context, setter.
  setter = 0;
  Expect.identical(0.0, lastSetValue);
  setter = 1;
  Expect.identical(1.0, lastSetValue);
  setter = -0;
  Expect.identical(-0.0, lastSetValue);
  setter = -1;
  Expect.identical(-1.0, lastSetValue);
  setter = 9223372036854775808;
  Expect.identical(9223372036854775808.0, lastSetValue);
  setter = 18446744073709551616;
  Expect.identical(18446744073709551616.0, lastSetValue);
  setter = 0x02;
  Expect.identical(2.0, lastSetValue);
  setter = -0x02;
  Expect.identical(-2.0, lastSetValue);

  // Argument context.
  test(0.0, 0);
  test(1.0, 1);
  test(-0.0, -0);
  test(-1.0, -1);
  test(9223372036854775808.0, 9223372036854775808);
  test(18446744073709551616.0, 18446744073709551616);
  test(2.0, 0x02);
  test(-2.0, -0x02);

  // Argument context, operator setter.
  List<double> box = [0.5];
  box[0] = 0;
  Expect.identical(0.0, box[0]);
  box[0] = 1;
  Expect.identical(1.0, box[0]);
  box[0] = -0;
  Expect.identical(-0.0, box[0]);
  box[0] = -1;
  Expect.identical(-1.0, box[0]);
  box[0] = 9223372036854775808;
  Expect.identical(9223372036854775808.0, box[0]);
  box[0] = 18446744073709551616;
  Expect.identical(18446744073709551616.0, box[0]);
  box[0] = 0x02;
  Expect.identical(2.0, box[0]);
  box[0] = -0x02;
  Expect.identical(-2.0, box[0]);

  // Argument context, custom operators.
  var oper = Oper();
  Expect.identical(0.0, oper + 0);
  Expect.identical(1.0, oper + 1);
  Expect.identical(-0.0, oper + -0);
  Expect.identical(-1.0, oper + -1);
  Expect.identical(9223372036854775808.0, oper + 9223372036854775808);
  Expect.identical(18446744073709551616.0, oper + 18446744073709551616);
  Expect.identical(2.0, oper + 0x02);
  Expect.identical(-2.0, oper + -0x02);

  Expect.identical(0.0, oper >> 0);
  Expect.identical(1.0, oper >> 1);
  Expect.identical(-0.0, oper >> -0);
  Expect.identical(-1.0, oper >> -1);
  Expect.identical(9223372036854775808.0, oper >> 9223372036854775808);
  Expect.identical(18446744073709551616.0, oper >> 18446744073709551616);
  Expect.identical(2.0, oper >> 0x02);
  Expect.identical(-2.0, oper >> -0x02);

  Expect.identical(0.0, oper[0]);
  Expect.identical(1.0, oper[1]);
  Expect.identical(-0.0, oper[-0]);
  Expect.identical(-1.0, oper[-1]);
  Expect.identical(9223372036854775808.0, oper[9223372036854775808]);
  Expect.identical(18446744073709551616.0, oper[18446744073709551616]);
  Expect.identical(2.0, oper[0x02]);
  Expect.identical(-2.0, oper[-0x02]);

  // Explicit return context.
  double fun1() => 0;
  Expect.identical(0.0, fun1());
  double fun2() => 1;
  Expect.identical(1.0, fun2());
  double fun3() => -0;
  Expect.identical(-0.0, fun3());
  double fun4() => -1;
  Expect.identical(-1.0, fun4());
  double fun5() => 9223372036854775808;
  Expect.identical(9223372036854775808.0, fun5());
  double fun6() => 18446744073709551616;
  Expect.identical(18446744073709551616.0, fun6());
  double fun7() => 0x02;
  Expect.identical(2.0, fun7());
  double fun8() => -0x02;
  Expect.identical(-2.0, fun8());

  // Inferred return context.
  testFun(0.0, () => 0);
  testFun(1.0, () => 1);
  testFun(-0.0, () => -0);
  testFun(-1.0, () => -1);
  testFun(9223372036854775808.0, () => 9223372036854775808);
  testFun(18446744073709551616.0, () => 18446744073709551616);
  testFun(2.0, () => 0x02);
  testFun(-2.0, () => -0x02);

  // Function default value context.
  Object deffun1([double v = 0]) => v;
  Expect.identical(0.0, deffun1());
  Object deffun2([double v = 1]) => v;
  Expect.identical(1.0, deffun2());
  Object deffun3([double v = -0]) => v;
  Expect.identical(-0.0, deffun3());
  Object deffun4([double v = -1]) => v;
  Expect.identical(-1.0, deffun4());
  Object deffun5([double v = 9223372036854775808]) => v;
  Expect.identical(9223372036854775808.0, deffun5());
  Object deffun6([double v = 18446744073709551616]) => v;
  Expect.identical(18446744073709551616.0, deffun6());
  Object deffun7([double v = 0x02]) => v;
  Expect.identical(2.0, deffun7());
  Object deffun8([double v = -0x02]) => v;
  Expect.identical(-2.0, deffun8());

  // Explicit collection literal context.
  box = <double>[0];
  Expect.identical(0.0, box[0]);
  box = <double>[1];
  Expect.identical(1.0, box[0]);
  box = <double>[-0];
  Expect.identical(-0.0, box[0]);
  box = <double>[-1];
  Expect.identical(-1.0, box[0]);
  box = <double>[9223372036854775808];
  Expect.identical(9223372036854775808.0, box[0]);
  box = <double>[18446744073709551616];
  Expect.identical(18446744073709551616.0, box[0]);
  box = <double>[0x02];
  Expect.identical(2.0, box[0]);
  box = <double>[-0x02];
  Expect.identical(-2.0, box[0]);

  // Implicit collection literal context.
  box = [0];
  Expect.identical(0.0, box[0]);
  box = [1];
  Expect.identical(1.0, box[0]);
  box = [-0];
  Expect.identical(-0.0, box[0]);
  box = [-1];
  Expect.identical(-1.0, box[0]);
  box = [9223372036854775808];
  Expect.identical(9223372036854775808.0, box[0]);
  box = [18446744073709551616];
  Expect.identical(18446744073709551616.0, box[0]);
  box = [0x02];
  Expect.identical(2.0, box[0]);
  box = [-0x02];
  Expect.identical(-2.0, box[0]);

  Map<double, double> map;
  // Explicit map key context.
  map = <double, Null>{0: null};
  Expect.identical(0.0, map.keys.first);
  map = <double, Null>{1: null};
  Expect.identical(1.0, map.keys.first);
  map = <double, Null>{-0: null};
  Expect.identical(-0.0, map.keys.first);
  map = <double, Null>{-1: null};
  Expect.identical(-1.0, map.keys.first);
  map = <double, Null>{9223372036854775808: null};
  Expect.identical(9223372036854775808.0, map.keys.first);
  map = <double, Null>{18446744073709551616: null};
  Expect.identical(18446744073709551616.0, map.keys.first);
  map = <double, Null>{0x02: null};
  Expect.identical(2.0, map.keys.first);
  map = <double, Null>{-0x02: null};
  Expect.identical(-2.0, map.keys.first);

  // Implicit map key context.
  map = {0: null};
  Expect.identical(0.0, map.keys.first);
  map = {1: null};
  Expect.identical(1.0, map.keys.first);
  map = {-0: null};
  Expect.identical(-0.0, map.keys.first);
  map = {-1: null};
  Expect.identical(-1.0, map.keys.first);
  map = {9223372036854775808: null};
  Expect.identical(9223372036854775808.0, map.keys.first);
  map = {18446744073709551616: null};
  Expect.identical(18446744073709551616.0, map.keys.first);
  map = {0x02: null};
  Expect.identical(2.0, map.keys.first);
  map = {-0x02: null};
  Expect.identical(-2.0, map.keys.first);

  // Explicit map value context.
  map = <Null, double>{null: 0};
  Expect.identical(0.0, map.values.first);
  map = <Null, double>{null: 1};
  Expect.identical(1.0, map.values.first);
  map = <Null, double>{null: -0};
  Expect.identical(-0.0, map.values.first);
  map = <Null, double>{null: -1};
  Expect.identical(-1.0, map.values.first);
  map = <Null, double>{null: 9223372036854775808};
  Expect.identical(9223372036854775808.0, map.values.first);
  map = <Null, double>{null: 18446744073709551616};
  Expect.identical(18446744073709551616.0, map.values.first);
  map = <Null, double>{null: 0x02};
  Expect.identical(2.0, map.values.first);
  map = <Null, double>{null: -0x02};
  Expect.identical(-2.0, map.values.first);

  // Implicit map value context.
  map = {null: 0};
  Expect.identical(0.0, map.values.first);
  map = {null: 1};
  Expect.identical(1.0, map.values.first);
  map = {null: -0};
  Expect.identical(-0.0, map.values.first);
  map = {null: -1};
  Expect.identical(-1.0, map.values.first);
  map = {null: 9223372036854775808};
  Expect.identical(9223372036854775808.0, map.values.first);
  map = {null: 18446744073709551616};
  Expect.identical(18446744073709551616.0, map.values.first);
  map = {null: 0x02};
  Expect.identical(2.0, map.values.first);
  map = {null: -0x02};
  Expect.identical(-2.0, map.values.first);

  // Top-level contexts
  Expect.identical(0.0, ts1);
  Expect.identical(1.0, ts2);
  Expect.identical(-0.0, ts3);
  Expect.identical(-1.0, ts4);
  Expect.identical(9223372036854775808.0, ts5);
  Expect.identical(18446744073709551616.0, ts6);
  Expect.identical(2.0, ts7);
  Expect.identical(-2.0, ts8);

  Expect.identical(0.0, tc1);
  Expect.identical(1.0, tc2);
  Expect.identical(-0.0, tc3);
  Expect.identical(-1.0, tc4);
  Expect.identical(9223372036854775808.0, tc5);
  Expect.identical(18446744073709551616.0, tc6);
  Expect.identical(2.0, tc7);
  Expect.identical(-2.0, tc8);

  Expect.identical(0.0, tg1);
  Expect.identical(1.0, tg2);
  Expect.identical(-0.0, tg3);
  Expect.identical(-1.0, tg4);
  Expect.identical(9223372036854775808.0, tg5);
  Expect.identical(18446744073709551616.0, tg6);
  Expect.identical(2.0, tg7);
  Expect.identical(-2.0, tg8);

  // Class contexts
  var c = new C.ci1();
  Expect.identical(0.0, c.v1);
  Expect.identical(1.0, c.v2);
  Expect.identical(-0.0, c.v3);
  Expect.identical(-1.0, c.v4);
  Expect.identical(9223372036854775808.0, c.v5);
  Expect.identical(18446744073709551616.0, c.v6);
  Expect.identical(2.0, c.v7);
  Expect.identical(-2.0, c.v8);

  Expect.identical(0.0, C.s1);
  Expect.identical(1.0, C.s2);
  Expect.identical(-0.0, C.s3);
  Expect.identical(-1.0, C.s4);
  Expect.identical(9223372036854775808.0, C.s5);
  Expect.identical(18446744073709551616.0, C.s6);
  Expect.identical(2.0, C.s7);
  Expect.identical(-2.0, C.s8);

  Expect.identical(0.0, C.c1);
  Expect.identical(1.0, C.c2);
  Expect.identical(-0.0, C.c3);
  Expect.identical(-1.0, C.c4);
  Expect.identical(9223372036854775808.0, C.c5);
  Expect.identical(18446744073709551616.0, C.c6);
  Expect.identical(2.0, C.c7);
  Expect.identical(-2.0, C.c8);

  Expect.identical(0.0, new C.cc1().d);
  Expect.identical(1.0, new C.cc2().d);
  Expect.identical(-0.0, new C.cc3().d);
  Expect.identical(-1.0, new C.cc4().d);
  Expect.identical(9223372036854775808.0, new C.cc5().d);
  Expect.identical(18446744073709551616.0, new C.cc6().d);
  Expect.identical(2.0, new C.cc7().d);
  Expect.identical(-2.0, new C.cc8().d);

  Expect.identical(0.0, const C.cc1().d);
  Expect.identical(1.0, const C.cc2().d);
  Expect.identical(-0.0, const C.cc3().d);
  Expect.identical(-1.0, const C.cc4().d);
  Expect.identical(9223372036854775808.0, const C.cc5().d);
  Expect.identical(18446744073709551616.0, const C.cc6().d);
  Expect.identical(2.0, const C.cc7().d);
  Expect.identical(-2.0, const C.cc8().d);

  Expect.identical(0.0, new C.ci1().d);
  Expect.identical(1.0, new C.ci2().d);
  Expect.identical(-0.0, new C.ci3().d);
  Expect.identical(-1.0, new C.ci4().d);
  Expect.identical(9223372036854775808.0, new C.ci5().d);
  Expect.identical(18446744073709551616.0, new C.ci6().d);
  Expect.identical(2.0, new C.ci7().d);
  Expect.identical(-2.0, new C.ci8().d);

  Expect.identical(0.0, const C.ci1().d);
  Expect.identical(1.0, const C.ci2().d);
  Expect.identical(-0.0, const C.ci3().d);
  Expect.identical(-1.0, const C.ci4().d);
  Expect.identical(9223372036854775808.0, const C.ci5().d);
  Expect.identical(18446744073709551616.0, const C.ci6().d);
  Expect.identical(2.0, const C.ci7().d);
  Expect.identical(-2.0, const C.ci8().d);

  // Nested context, `?:`.
  v1 = false ? 42.0 : 0;
  Expect.identical(0.0, v1);
  v2 = false ? 42.0 : 1;
  Expect.identical(1.0, v2);
  v3 = false ? 42.0 : -0;
  Expect.identical(-0.0, v3);
  v4 = false ? 42.0 : -1;
  Expect.identical(-1.0, v4);
  v5 = false ? 42.0 : 9223372036854775808;
  Expect.identical(9223372036854775808.0, v5);
  v6 = false ? 42.0 : 18446744073709551616;
  Expect.identical(18446744073709551616.0, v6);
  v7 = false ? 42.0 : 0x02; // Hex literal.
  Expect.identical(2.0, v7);
  v8 = false ? 42.0 : -0x02; // Hex literal.
  Expect.identical(-2.0, v8);

  // Nested context, `??`.
  double nl = double.tryParse("not a double"); // Returns null typed as double.
  v1 = nl ?? 0;
  Expect.identical(0.0, v1);
  v2 = nl ?? 1;
  Expect.identical(1.0, v2);
  v3 = nl ?? -0;
  Expect.identical(-0.0, v3);
  v4 = nl ?? -1;
  Expect.identical(-1.0, v4);
  v5 = nl ?? 9223372036854775808;
  Expect.identical(9223372036854775808.0, v5);
  v6 = nl ?? 18446744073709551616;
  Expect.identical(18446744073709551616.0, v6);
  v7 = nl ?? 0x02; // Hex literal.
  Expect.identical(2.0, v7);
  v8 = nl ?? -0x02; // Hex literal.
  Expect.identical(-2.0, v8);

  // Nested context, `..`.
  v1 = 0..toString();
  Expect.identical(0.0, v1);
  v2 = 1..toString();
  Expect.identical(1.0, v2);
  v3 = -0
    ..toString();
  Expect.identical(-0.0, v3);
  v4 = -1
    ..toString();
  Expect.identical(-1.0, v4);
  v5 = 9223372036854775808..toString();
  Expect.identical(9223372036854775808.0, v5);
  v6 = 18446744073709551616..toString();
  Expect.identical(18446744073709551616.0, v6);
  v7 = 0x02..toString(); // Hex literal.
  Expect.identical(2.0, v7);
  v8 = -0x02
    ..toString(); // Hex literal.
  Expect.identical(-2.0, v8);

  // Nexted context, double assignment.
  Object object;
  object = value = 0;
  Expect.identical(0.0, value);
  object = value = 1;
  Expect.identical(1.0, value);
  object = value = -0;
  Expect.identical(-0.0, value);
  object = value = -1;
  Expect.identical(-1.0, value);
  object = value = 9223372036854775808;
  Expect.identical(9223372036854775808.0, value);
  object = value = 18446744073709551616;
  Expect.identical(18446744073709551616.0, value);
  object = value = 0x02;
  Expect.identical(2.0, value);
  object = value = -0x02;
  Expect.identical(-2.0, value);

  // Nested context, value of assignment.
  Expect.identical(0.0, value = 0);
  Expect.identical(1.0, value = 1);
  Expect.identical(-0.0, value = -0);
  Expect.identical(-1.0, value = -1);
  Expect.identical(9223372036854775808.0, value = 9223372036854775808);
  Expect.identical(18446744073709551616.0, value = 18446744073709551616);
  Expect.identical(2.0, value = 0x02);
  Expect.identical(-2.0, value = -0x02);

  // JavaScript platforms represent integers as doubles, so negating them will
  // result in negative zero, unfortunately.
  int zero = 0;
  bool platformHasNegativeZeroInts = (-zero).isNegative;

  // Not promoted without a double context.
  num x = -0;
  Expect.identical(0, x);
  Expect.equals(x.isNegative, platformHasNegativeZeroInts);

  var list = [3.14, 2.17, -0];
  Expect.notType<List<double>>(list);
  Expect.identical(0, list[2]);
  Expect.equals(list[2].isNegative, platformHasNegativeZeroInts);

  // FutureOr<double> also forces double.
  // "Type that int is not assignable to, but double is."
  FutureOr<double> fo1 = 0;
  Expect.identical(0.0, fo1);
  FutureOr<double> fo2 = 1;
  Expect.identical(1.0, fo2);
  FutureOr<double> fo3 = -0;
  Expect.identical(-0.0, fo3);
  FutureOr<double> fo4 = -1;
  Expect.identical(-1.0, fo4);
  FutureOr<double> fo5 = 9223372036854775808;
  Expect.identical(9223372036854775808.0, fo5);
  FutureOr<double> fo6 = 18446744073709551616;
  Expect.identical(18446744073709551616.0, fo6);
  FutureOr<double> fo7 = 0x02; // Hex literal.
  Expect.identical(2.0, fo7);
  FutureOr<double> fo8 = -0x02; // Hex literal.
  Expect.identical(-2.0, fo8);

  // Some other FutureOr cases, without being exhaustive.
  {
    Object func([FutureOr<double> x = 9223372036854775808]) => x;
    Expect.identical(9223372036854775808.0, func(9223372036854775808));
    Expect.identical(9223372036854775808.0, func());
    FutureOr<double> func2() => 9223372036854775808;
    Expect.identical(9223372036854775808.0, func2());
    testGeneric<FutureOr<double>>(9223372036854775808.0, 9223372036854775808);
    List<FutureOr<double>> l = [9223372036854775808];
    testGeneric<FutureOr<double>>(9223372036854775808.0, l[0]);
    l.add(9223372036854775808);
    testGeneric<FutureOr<double>>(9223372036854775808.0, l[1]);
    l.add(0.0);
    l[2] = 9223372036854775808;
    testGeneric<FutureOr<double>>(9223372036854775808.0, l[2]);
  }

  // Type variables statically bound to double also force doubles:
  testGeneric<double>(0.0, 0);
  testGeneric<double>(1.0, 1);
  testGeneric<double>(-0.0, -0);
  testGeneric<double>(-1.0, -1);
  testGeneric<double>(9223372036854775808.0, 9223372036854775808);
  testGeneric<double>(18446744073709551616.0, 18446744073709551616);
  testGeneric<double>(2.0, 0x02);
  testGeneric<double>(-2.0, -0x02);

  // Uses static type, not run-time type.
  Super sub = Sub();
  Expect.identical(0.0, sub.method(0));
  Expect.identical(1.0, sub.method(1));
  Expect.identical(-0.0, sub.method(-0));
  Expect.identical(-1.0, sub.method(-1));
  Expect.identical(9223372036854775808.0, sub.method(9223372036854775808));
  Expect.identical(18446744073709551616.0, sub.method(18446744073709551616));
  Expect.identical(2.0, sub.method(0x02));
  Expect.identical(-2.0, sub.method(-0x02));

  {
    // Check that the correct value is used as receiver for the cascade.
    var collector = StringBuffer();
    double tricky = -42
      ..toString().codeUnits.forEach(collector.writeCharCode);
    Expect.equals("${-42.0}", collector.toString());
  }

  bool isDigit(int charCode) => (charCode ^ 0x30) <= 9;
  // Throws because double context does not affect "4", so the toString does
  // not contain any non-digit (like ".", which it would if 4 was a double).
  // The context type of "4.toString..." is not double, and the `-`
  // is not having a literal as operand.
  Expect.throws(() {
    double tricky =
        -4.toString().codeUnits.firstWhere((c) => !isDigit(c)).toDouble();
  });
  // The `?.` operation has the same precedence as `.`.
  Expect.throws(() {
    double tricky =
        -4?.toString().codeUnits.firstWhere((c) => !isDigit(c)).toDouble();
  });
}

void test(double expect, double value) {
  Expect.identical(expect, value);
}

void testFun(double expect, double f()) {
  Expect.identical(expect, f());
}

void testGeneric<T>(double expect, T value) {
  Expect.identical(expect, value);
}

class Oper {
  Object operator +(double value) => value;
  Object operator >>(double value) => value;
  Object operator [](double value) => value;
}

class C {
  // Instance variable initializer
  final double v1 = 0;
  final double v2 = 1;
  final double v3 = -0;
  final double v4 = -1;
  final double v5 = 9223372036854775808;
  final double v6 = 18446744073709551616;
  final double v7 = 0x02; // Hex literal.
  final double v8 = -0x02; // Hex literal.

  // Static class variable initializer
  static double s1 = 0;
  static double s2 = 1;
  static double s3 = -0;
  static double s4 = -1;
  static double s5 = 9223372036854775808;
  static double s6 = 18446744073709551616;
  static double s7 = 0x02; // Hex literal.
  static double s8 = -0x02; // Hex literal.

  // Const class variable initializer context.
  static const double c1 = 0;
  static const double c2 = 1;
  static const double c3 = -0;
  static const double c4 = -1;
  static const double c5 = 9223372036854775808;
  static const double c6 = 18446744073709551616;
  static const double c7 = 0x02; // Hex literal.
  static const double c8 = -0x02; // Hex literal.

  final double d;

  // Default value context for a double initializing formal.
  const C.cc1([this.d = 0]);
  const C.cc2([this.d = 1]);
  const C.cc3([this.d = -0]);
  const C.cc4([this.d = -1]);
  const C.cc5([this.d = 9223372036854775808]);
  const C.cc6([this.d = 18446744073709551616]);
  const C.cc7([this.d = 0x02]);
  const C.cc8([this.d = -0x02]);

  // Initializer list expressions context.
  const C.ci1() : this.d = 0;
  const C.ci2() : this.d = 1;
  const C.ci3() : this.d = -0;
  const C.ci4() : this.d = -1;
  const C.ci5() : this.d = 9223372036854775808;
  const C.ci6() : this.d = 18446744073709551616;
  const C.ci7() : this.d = 0x02;
  const C.ci8() : this.d = -0x02;
}

// Top-level lazy variable initializer
double ts1 = 0;
double ts2 = 1;
double ts3 = -0;
double ts4 = -1;
double ts5 = 9223372036854775808;
double ts6 = 18446744073709551616;
double ts7 = 0x02; // Hex literal.
double ts8 = -0x02; // Hex literal.

// Top-level const variable initializer.
const double tc1 = 0;
const double tc2 = 1;
const double tc3 = -0;
const double tc4 = -1;
const double tc5 = 9223372036854775808; // 2^63, invalid signed 64-bit integer.
const double tc6 = 18446744073709551616;
const double tc7 = 0x02; // Hex literal.
const double tc8 = -0x02; // Hex literal.

// Top-level getter return context.
double get tg1 => 0;
double get tg2 => 1;
double get tg3 => -0;
double get tg4 => -1;
double get tg5 => 9223372036854775808;
double get tg6 => 18446744073709551616;
double get tg7 => 0x02; // Hex literal.
double get tg8 => -0x02; // Hex literal.

Object lastSetValue = null;
void set setter(double v) {
  lastSetValue = v;
}

abstract class Super {
  Object method(double v);
}

class Sub implements Super {
  Object method(Object o) => o;
}
