9ad59bada2
Also fix #34360 by addressing a few remaining Analyzer issues. Change-Id: Iac3d9ba72aa370846fced3654a376899b5938152 Reviewed-on: https://dart-review.googlesource.com/76343 Commit-Queue: Jenny Messerly <jmesserly@google.com> Reviewed-by: Mike Fairhurst <mfairhurst@google.com> Reviewed-by: Lasse R.H. Nielsen <lrn@google.com>
689 lines
22 KiB
Dart
689 lines
22 KiB
Dart
// 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 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;
|
|
}
|