Files
test-repo/tests/flow/try/init.js
T
Christopher Chedeau 3375cfe605 Move tests around (#454)
* new_tests

* move_all_clobbered_tests

* remove all the tests that no longer exist

* re-run flow tests

* Move all the flow tests to tests/flow and prettier to tests/

* Move prettier tests to their own folders

* Add jsfmt files

* run prettier snapshot tests
2017-01-24 14:35:37 -08:00

155 lines
2.3 KiB
JavaScript

/***
* test initialization tracking of hoisted stuff
* @flow
*/
// for illustrative purposes only - Flow considers a throw possible
// anywhere within a block
function might_throw() {}
// local use of annotated var within try is ok
function f() {
try {
var x:number = 0;
var y:number = x;
} catch (e) {
}
}
// and within catch
function f() {
try {
} catch (e) {
var x:number = 0;
var y:number = x;
}
}
// but not across try/catch
function f() {
try {
might_throw();
var x:number = 0;
} catch (e) {
var y:number = x; // error
}
}
// or try/finally
function f() {
try {
might_throw();
var x:number = 0;
} finally {
var y:number = x; // error
}
}
// or catch/finally
function f() {
try {
} catch (e) {
var x:number = 0;
} finally {
var y:number = x; // error
}
}
// or try/catch/finally if init doesn't dominate
function f() {
try {
var x:number = 0;
} catch (e) {
might_throw();
var x:number = 0;
} finally {
var y:number = x; // error
}
}
// post-use ok because init dominates here
function f() {
try {
var x:number = 0;
} catch (e) {
might_throw(); // ...but if so, suffix is not reached
var x:number = 0;
}
var y:number = x;
}
// and here
function f() {
try {
} catch (e) {
} finally {
might_throw(); // ...but if so, suffix is not reached
var x:number = 0;
}
var y:number = x;
}
// and here
function f() {
try {
var x:number;
} catch (e) {
} finally {
might_throw(); // ...but if so, suffix is not reached
x = 0;
}
var y:number = x;
}
// and here, thank you JS for the wonder that is hoisting
function f() {
try {
} catch (e) {
var x:number;
} finally {
might_throw(); // ...but if so, suffix is not reached
x = 0;
}
var y:number = x;
}
// error if used prior to init
function f() {
var y:number = x; // error
try {
var x:number = 0;
} catch (e) {
}
}
// another non-dominated post
function f() {
try {
var x:number = 0;
} catch (e) {
}
var y:number = x; // error
}
// ditto
function f() {
try {
} catch (e) {
var x:number = 0;
}
var y:number = x; // error
}
// ditto
function f(b) {
try {
var x:number;
if (b) {
throw new Error();
}
x = 0;
} catch (e) {
}
var y:number = x; // error
}