| // Copyright (c) 2015, 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. |
| |
| /// Regression test for dart2js that used to miscompile boolean and operations |
| /// if one of the operands was an int and the other was not (issue 22427). |
| /// |
| /// Extended to all operations as there is a risk of similar bugs with other |
| /// operators, e.g. `a % 2` _looks_ like it might be 0 or 1. |
| |
| import "package:expect/expect.dart"; |
| |
| @pragma('dart2js:assumeDynamic') |
| @pragma('dart2js:noInline') |
| confuse(x) => x; |
| |
| class Thing1 { |
| operator &(b) => this; |
| operator |(b) => this; |
| operator ^(b) => this; |
| operator <<(b) => this; |
| operator >>(b) => this; |
| |
| operator +(b) => this; |
| operator -(b) => this; |
| operator *(b) => this; |
| operator /(b) => this; |
| operator ~/(b) => this; |
| operator %(b) => this; |
| remainder(b) => this; |
| |
| operator <(b) => this; |
| operator <=(b) => this; |
| operator >(b) => this; |
| operator >=(b) => this; |
| } |
| |
| class Thing2 { |
| @pragma('dart2js:noInline') |
| operator &(b) => this; |
| @pragma('dart2js:noInline') |
| operator |(b) => this; |
| @pragma('dart2js:noInline') |
| operator ^(b) => this; |
| @pragma('dart2js:noInline') |
| operator <<(b) => this; |
| @pragma('dart2js:noInline') |
| operator >>(b) => this; |
| |
| @pragma('dart2js:noInline') |
| operator +(b) => this; |
| @pragma('dart2js:noInline') |
| operator -(b) => this; |
| @pragma('dart2js:noInline') |
| operator *(b) => this; |
| @pragma('dart2js:noInline') |
| operator /(b) => this; |
| @pragma('dart2js:noInline') |
| operator ~/(b) => this; |
| @pragma('dart2js:noInline') |
| operator %(b) => this; |
| @pragma('dart2js:noInline') |
| remainder(b) => this; |
| |
| @pragma('dart2js:noInline') |
| operator <(b) => this; |
| @pragma('dart2js:noInline') |
| operator <=(b) => this; |
| @pragma('dart2js:noInline') |
| operator >(b) => this; |
| @pragma('dart2js:noInline') |
| operator >=(b) => this; |
| } |
| |
| confused() { |
| var a = new Thing1(); |
| Expect.equals(a, confuse(a) & 5 & 2); |
| Expect.equals(a, confuse(a) | 5 | 2); |
| Expect.equals(a, confuse(a) ^ 5 ^ 2); |
| Expect.equals(a, confuse(a) << 5 << 2); |
| Expect.equals(a, confuse(a) >> 5 >> 2); |
| |
| Expect.equals(a, confuse(a) + 5 + 2); |
| Expect.equals(a, confuse(a) - 5 - 2); |
| Expect.equals(a, confuse(a) * 5 * 2); |
| Expect.equals(a, confuse(a) / 5 / 2); |
| Expect.equals(a, confuse(a) % 5 % 2); |
| Expect.equals(a, confuse(a) ~/ 5 ~/ 2); |
| Expect.equals(a, confuse(a).remainder(5).remainder(2)); |
| |
| Expect.equals(a, (confuse(a) < 5) < 2); |
| Expect.equals(a, (confuse(a) <= 5) <= 2); |
| Expect.equals(a, (confuse(a) > 5) > 2); |
| Expect.equals(a, (confuse(a) >= 5) >= 2); |
| } |
| |
| direct1() { |
| var a = new Thing1(); |
| Expect.equals(a, a & 5 & 2); |
| Expect.equals(a, a | 5 | 2); |
| Expect.equals(a, a ^ 5 ^ 2); |
| Expect.equals(a, a << 5 << 2); |
| Expect.equals(a, a >> 5 >> 2); |
| |
| Expect.equals(a, a + 5 + 2); |
| Expect.equals(a, a - 5 - 2); |
| Expect.equals(a, a * 5 * 2); |
| Expect.equals(a, a / 5 / 2); |
| Expect.equals(a, a % 5 % 2); |
| Expect.equals(a, a ~/ 5 ~/ 2); |
| Expect.equals(a, a.remainder(5).remainder(2)); |
| |
| Expect.equals(a, (a < 5) < 2); |
| Expect.equals(a, (a <= 5) <= 2); |
| Expect.equals(a, (a > 5) > 2); |
| Expect.equals(a, (a >= 5) >= 2); |
| } |
| |
| direct2() { |
| var a = new Thing2(); |
| Expect.equals(a, a & 5 & 2); |
| Expect.equals(a, a | 5 | 2); |
| Expect.equals(a, a ^ 5 ^ 2); |
| Expect.equals(a, a << 5 << 2); |
| Expect.equals(a, a >> 5 >> 2); |
| |
| Expect.equals(a, a + 5 + 2); |
| Expect.equals(a, a - 5 - 2); |
| Expect.equals(a, a * 5 * 2); |
| Expect.equals(a, a / 5 / 2); |
| Expect.equals(a, a % 5 % 2); |
| Expect.equals(a, a ~/ 5 ~/ 2); |
| Expect.equals(a, a.remainder(5).remainder(2)); |
| |
| Expect.equals(a, (a < 5) < 2); |
| Expect.equals(a, (a <= 5) <= 2); |
| Expect.equals(a, (a > 5) > 2); |
| Expect.equals(a, (a >= 5) >= 2); |
| } |
| |
| main() { |
| confused(); |
| direct1(); |
| direct2(); |
| } |