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

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 fun4() => -0x02;
  Expect.identical(-120, fun4());

  // 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();
  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);

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

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

  // 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.addCharCode);
    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;
}
