// Copyright (c) 2012, 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. // VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation import "package:expect/expect.dart"; class A { bool _result; A(this._result); operator ==(x) { return _result; } } opaque(x) => [x, 1, 'y'][0]; // confuse the optimizers. class Death { operator ==(x) { throw 'Dead!'; } } death() => opaque(new Death()); nullFn() => opaque(null); tests() { var alwaysTrue = new A(true); var alwaysFalse = new A(false); Expect.isFalse(alwaysFalse == alwaysFalse); Expect.isTrue(alwaysFalse != alwaysFalse); Expect.isTrue(alwaysTrue == alwaysTrue); Expect.isTrue(alwaysTrue == 5); Expect.isFalse(alwaysTrue == null); Expect.isFalse(null == alwaysTrue); Expect.isTrue(alwaysTrue != null); Expect.isTrue(null != alwaysTrue); Expect.isTrue(null == null); Expect.isFalse(null != null); Expect.throws(() => death() == 5); Expect.isFalse(death() == nullFn()); Expect.isFalse(nullFn() == death()); Expect.isTrue(nullFn() == nullFn()); Expect.isTrue(death() != nullFn()); Expect.isTrue(nullFn() != death()); Expect.isFalse(nullFn() != nullFn()); if (death() == nullFn()) { throw "failed"; } if (death() != nullFn()) {} else { throw "failed"; } } boolEqualityPositiveA(a) => a == true; boolEqualityNegativeA(a) => a != true; boolEqualityPositiveB(a) => true == a; boolEqualityNegativeB(a) => true != a; main() { for (int i = 0; i < 20; i++) { tests(); // Do not inline calls to prevent constant folding. Expect.isTrue(boolEqualityPositiveA(true)); Expect.isFalse(boolEqualityPositiveA(false)); Expect.isFalse(boolEqualityNegativeA(true)); Expect.isTrue(boolEqualityNegativeA(false)); Expect.isTrue(boolEqualityPositiveB(true)); Expect.isFalse(boolEqualityPositiveB(false)); Expect.isFalse(boolEqualityNegativeB(true)); Expect.isTrue(boolEqualityNegativeB(false)); } // Deoptimize. Expect.isFalse(boolEqualityPositiveA(1)); Expect.isTrue(boolEqualityNegativeA("hi")); Expect.isFalse(boolEqualityPositiveB(2.0)); Expect.isTrue(boolEqualityNegativeB([])); }