// Copyright (c) 2013, 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 to test check that we don't fail to compile when an // inlinable method contains a throw. import 'package:expect/expect.dart'; dynamic x = false; bool? called; bool callMeTrue() { called = true; return true; } bool callMeFalse() { called = true; return false; } void callMe() { called = true; } testCallThenThrow(fn) { called = false; Expect.throws(() => fn()); Expect.isTrue(called); } testCall(fn) { called = false; fn(); Expect.isTrue(called); } testNoThrow(fn) { called = false; Expect.throws(() => fn()); Expect.isFalse(called); } kast(x) { throw x; } ternary(a, b, c) { if (x == 2) throw "ternary"; } hest() => kast("hest"); hest2() { return kast("hest2"); } foo() => true || kast("foo"); bar() => false || kast("foo"); barc() => callMeTrue() || kast("foo"); barCallThrow() => callMeFalse() || kast("foo"); baz(x) => x ? kast("baz") : 0; bazc() => callMeFalse() ? kast("baz") : 0; bazCallThrow() => callMeTrue() ? kast("baz") : 0; fizz(x) => x ? 0 : kast("baz"); fizzc() => callMeTrue() ? 0 : kast("baz"); fizzCallThrow() => callMeFalse() ? 0 : kast("baz"); fuzz() => kast("baz") ? 0 : 1; farce() => !kast("baz"); unary() => ~(kast("baz")); boo() { callMe(); x = kast("boo"); } yo() { throw kast("yo"); } bin() { return 5 * kast("bin"); } binCallThrow() { return (callMe() as dynamic) * kast("binct"); } hoo() { x[kast("hoo")] = 0; x[kast("hoo")]; kast("hoo").x = 0; kast("hoo").x; } switcheroo() { switch (kast("switcheroo")) { case 0: boo(); } } class ThrowConstructor { ThrowConstructor() : foo = callMeTrue(), bar = kast("ThrowConstructor") { called = false; } bool foo; var bar; } throwConstructor() { called = false; return new ThrowConstructor(); } cascade() { return [] ..add(callMeTrue()) ..add(kast("cascade")); } interpole() => "inter${kast('tada!')}pole"; interpoleCallThrow() => "inter${callMeTrue()}...${kast('tada!')}pole"; call1() => ternary(0, kast("call1"), 1); call2() => ternary(kast("call2"), 0, 1); call3() => ternary(0, 1, kast("call3")); call1c() => ternary(callMe() as dynamic, kast("call1"), 1); call3c() => ternary(callMeTrue(), 1, kast("call3")); call4c() => ternary(0, callMeTrue(), kast("call3")); sendSet() { var x = kast("sendSet"); } sendSetCallThrow() { var x = callMe() as dynamic, y = kast("sendSet"); } isSend() => kast("isSend") is int; vile() { while (kast("vile")) { callMe(); } } dovile() { var x = 0; do { callMe(); x = 1; } while (kast("vile")); print(x); } dovileBreak() { var x = 0; do { callMe(); x = 1; break; } while (kast("vile")); return (x); } dovileContinue() { var x = 0; do { callMe(); x = 1; continue; } while (kast("vile")); return (x); } dovileBreakContinue(x) { do { callMe(); if (x == 1) break; continue; } while (kast("vile")); return (x); } faar1() { callMe(); for (kast("faar"); called = false; called = false) { called = false; } } faar2() { for (callMe(); kast("faar"); called = false) { called = false; } } faar3() { for (; true; kast("faar")) { callMe(); } called = false; } faar4() { callMe(); for (kast("faar"); called = false; called = false) { called = false; continue; } } faar5() { for (callMe(); kast("faar"); called = false) { called = false; continue; } } faar6() { for (; true; kast("faar")) { callMe(); continue; } called = false; } faar7() { callMe(); for (kast("faar"); called = false; called = false) { called = false; break; } } faar8() { for (callMe(); kast("faar"); called = false) { called = false; break; } } faar9() { for (; true; kast("faar")) { callMe(); break; called = false; } } main() { Expect.throws(hest); Expect.throws(hest2); foo(); Expect.throws(bar); testCall(barc); testCallThenThrow(barCallThrow); Expect.equals(0, baz(false)); Expect.throws(() => baz(true)); testCall(bazc); testCallThenThrow(bazCallThrow); Expect.throws(() => fizz(false)); testCall(fizzc); testCallThenThrow(fizzCallThrow); Expect.throws(fuzz); Expect.throws(farce); Expect.throws(unary); testCallThenThrow(boo); Expect.throws(yo); Expect.throws(bin); testCallThenThrow(binCallThrow); Expect.throws(hoo); Expect.throws(switcheroo); Expect.throws(interpole); testCallThenThrow(interpoleCallThrow); Expect.throws(call1); Expect.throws(call2); Expect.throws(call3); testCallThenThrow(call1c); testCallThenThrow(call3c); testCallThenThrow(call4c); Expect.throws(sendSet); testCallThenThrow(sendSetCallThrow); Expect.throws(isSend); testNoThrow(vile); testCallThenThrow(dovile); testCall(dovileBreak); testCallThenThrow(dovileContinue); testCallThenThrow(throwConstructor); testCallThenThrow(cascade); dovileBreakContinue(1); testCallThenThrow(faar1); testCallThenThrow(faar2); testCallThenThrow(faar3); testCallThenThrow(faar4); testCallThenThrow(faar5); testCallThenThrow(faar6); testCallThenThrow(faar7); testCallThenThrow(faar8); testCall(faar9); }