let a=function(){return 0}
let b=function(){return 0}
let c=function(){return 0}
let arr=[];
let obj={};

// Control flow

if (0)
    a();

if (0) {
    a();
}

if (0)
    a();
else if (0)
    a();
else
    a();

a() ? b() : c()

// Loops

while (0)
    a();

while (0) {
    a();
}

do {
    a();
} while (0);

for (a(); b(); c())
    break;

for (; b(); c())
    break;

for (a(); b();)
    break;

for (a();; c())
    break;

for (a();;)
    break;

for (; b();)
    break;

for (;; c())
    break;

for (;;)
    break;

for (a(); b(); c()) {
    break;
}

for (let x of arr)
    break;

for (let x in obj)
    break;

// Switch

switch (0) {
case 1:
    a();
    break;
case 2:
    a();
    // fallthrough
case 3:
    a();
    break;
default:
    a();
    break;
}

// Try/Catch

try {
    a();
} catch (e) {
    shouldNotBeReached();
} finally {
    b();
}

// Class

class Base {
    constructor()
    {
        this._base = true;
    }

    baseMethod()
    {
        a();
    }

    method()
    {
        a();
    }
}

class Child extends Base {
    constructor()
    {
        super();
        this._child = true;
    }

    childMethod()
    {
        b();
    }

    method()
    {
        super.method();
        b();
    }

    get name()
    {
        return this._name;
    }
    
    set name(x)
    {
        this._name = x;
    }
}

// ---------
/* Misc */
// ---------

    {
        a();
    }

label:
    {
        a();
    }

var w1 = {x:1, y:2};
with (w1) {
    a();
}

var v1 = 1,
    v2 = 1;
let l1 = 2,
    l2 = 2;
const c1 = 3,
    c2 = 3;

v1 = v2 = v1;

var {x, y} = obj;
var [w, z] = arr;

var o1 = {
    p1: 1,
    p2: a(),
    p3: 1,
    ["p4"]: 1,
    [b()]: 1,
};

var a1 = [
    1,
    a(),
    1,
    b(),
];

var i1 = new Base;
var i2 = new Child;
i2.name;
i2.name = 1;
i2.method();

var t1 = `${1} ${x=1} ${a()}`;
var t2 = a`${1} ${x=1} ${a()}`;

a(a(), b());

if (o1.p1)
    a();

if (o1["p1"])
    a();

if (String.raw`test`)
    a();

a(), b(), c();

a(),
b(),
c();

true && (a(), b(), c()) && true;

true && (
    a(),
    b(),
    c()
) && true;

try {
    throw a(), b(), c();
} catch { }

try {
    throw a(),
        b(),
        c();
} catch { }
