| // Copyright (c) 2024, 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. |
| |
| // Generally, we can replace `a - b` with `a` when `a` is a number and `b` is |
| // zero. |
| // |
| // The exception is when both operands are negative zero: `(-0.0) - (-0.0)` |
| // results in a non-negative zero. |
| // |
| // With web numbers, the value `-0.0` is recognized as an integer so can occur |
| // as a constant right operand, usually by constant-folding. |
| |
| /*member: main:ignore*/ |
| void main() { |
| for (final a in [ |
| C(), |
| 0, |
| -0.0, |
| 1, |
| -1, |
| 1.1, |
| -1.1, |
| double.nan, |
| double.infinity, |
| double.negativeInfinity, |
| ]) { |
| sink.add(whenDynamic(a)); |
| |
| if (a is int) { |
| sink.add(whenInt1(a)); |
| sink.add(whenInt2(a)); |
| } |
| if (a is double) { |
| sink.add(whenDouble1(a)); |
| sink.add(whenDouble2(a)); |
| } |
| if (a is num) { |
| sink.add(whenNum1(a)); |
| sink.add(whenNum2(a)); |
| sink.add(whenNum3(a)); |
| } |
| } |
| } |
| |
| final List<Object?> sink = []; |
| |
| @pragma('dart2js:never-inline') |
| /*member: whenDynamic:function(thing) { |
| return J.$sub$n(thing, 0); |
| }*/ |
| whenDynamic(dynamic thing) { |
| return thing - 0; |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: whenInt1:function(a) { |
| return a; |
| }*/ |
| int whenInt1(int a) { |
| return a - 0; |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: whenInt2:function(a) { |
| return a - -0.0; |
| }*/ |
| int whenInt2(int a) { |
| return a - (-0); |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: whenDouble1:function(a) { |
| return a; |
| }*/ |
| double whenDouble1(double a) { |
| return a - 0; |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: whenDouble2:function(a) { |
| return a - -0.0; |
| }*/ |
| double whenDouble2(double a) { |
| return a - (-0.0); |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: whenNum1:function(a) { |
| return a; |
| }*/ |
| num whenNum1(num a) { |
| return a - 0; |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: whenNum2:function(a) { |
| return a - -0.0; |
| }*/ |
| num whenNum2(num a) { |
| return a - (-0); |
| } |
| |
| @pragma('dart2js:never-inline') |
| /*member: whenNum3:function(a) { |
| return a - -0.0; |
| }*/ |
| num whenNum3(num a) { |
| return a - (-0.0); |
| } |
| |
| class C { |
| /*member: C.-:ignore*/ |
| C operator -(int i) => this; |
| } |