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