| // 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. | 
 | // Dart test program for constructors and initializers. | 
 | // VMOptions=--optimization-counter-threshold=10 --no-use-osr | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | // Check that range analysis does not enter infinite loop trying to propagate | 
 | // ranges through dependant phis. | 
 | bar() { | 
 |   var sum = 0; | 
 |   for (var i = 0; i < 10; i++) { | 
 |     for (var j = i - 1; j >= 0; j--) { | 
 |       for (var k = j; k < i; k++) { | 
 |         sum += (i + j + k); | 
 |       } | 
 |     } | 
 |   } | 
 |   return sum; | 
 | } | 
 |  | 
 | test1() { | 
 |   for (var i = 0; i < 20; i++) bar(); | 
 | } | 
 |  | 
 | // Check that range analysis does not erroneously remove overflow check. | 
 | test2() { | 
 |   var width = 1073741823; | 
 |   Expect.equals(width - 1, foo(width - 5000, width - 1)); | 
 |   Expect.equals(width, foo(width - 5000, width)); | 
 | } | 
 |  | 
 | foo(n, w) { | 
 |   var x = 0; | 
 |   for (var i = n; i <= w; i++) { | 
 |     Expect.isTrue(i > 0); | 
 |     x = i; | 
 |   } | 
 |   return x; | 
 | } | 
 |  | 
 | // Test detection of unsatisfiable constraints. | 
 | f(a, b) { | 
 |   if (a < b) { | 
 |     if (a > b) { | 
 |       throw "unreachable"; | 
 |     } | 
 |     return 2; | 
 |   } | 
 |   return 3; | 
 | } | 
 |  | 
 | f1(a, b) { | 
 |   if (a < b) { | 
 |     if (a > b - 1) { | 
 |       throw "unreachable"; | 
 |     } | 
 |     return 2; | 
 |   } | 
 |   return 3; | 
 | } | 
 |  | 
 | f2(a, b) { | 
 |   if (a < b) { | 
 |     if (a > b - 2) { | 
 |       return 2; | 
 |     } | 
 |     throw "unreachable"; | 
 |   } | 
 |   return 3; | 
 | } | 
 |  | 
 | g() { | 
 |   var i; | 
 |   for (i = 0; i < 10; i++) { | 
 |     if (i < 0) throw "unreachable"; | 
 |   } | 
 |   return i; | 
 | } | 
 |  | 
 | h(n) { | 
 |   var i; | 
 |   for (i = 0; i < n; i++) { | 
 |     if (i < 0) throw "unreachable"; | 
 |     var j = i - 1; | 
 |     if (j >= n - 1) throw "unreachable"; | 
 |   } | 
 |   return i; | 
 | } | 
 |  | 
 | test3() { | 
 |   test_fun(fun) { | 
 |     Expect.equals(2, fun(0, 1)); | 
 |     Expect.equals(3, fun(0, 0)); | 
 |     for (var i = 0; i < 20; i++) fun(0, 1); | 
 |     Expect.equals(2, fun(0, 1)); | 
 |     Expect.equals(3, fun(0, 0)); | 
 |   } | 
 |  | 
 |   test_fun(f); | 
 |   test_fun(f1); | 
 |   test_fun(f2); | 
 |  | 
 |   Expect.equals(10, g()); | 
 |   for (var i = 0; i < 20; i++) g(); | 
 |   Expect.equals(10, g()); | 
 |  | 
 |   Expect.equals(10, h(10)); | 
 |   for (var i = 0; i < 20; i++) h(10); | 
 |   Expect.equals(10, h(10)); | 
 | } | 
 |  | 
 | main() { | 
 |   test1(); | 
 |   test2(); | 
 |   test3(); | 
 | } |