/*===
true
SyntaxError
true
===*/

/* An inner function or an eval call of a strict function is automatically
 * strict, even without an explicit use strict declaration.
 *
 * A strict function 'this' binding is undefined; a non-strict function has
 * the global object as its 'this' binding (when called as a plain function).
 * Thus, '!this' is true for strict code, and false for non-strict code.
 *
 * Also, 'delete' for an unresolvable identifier is a SyntaxError in strict
 * code but returns false in non-strict code.
 */

function outer_strict() {
    'use strict';
    var foo = 1;

    try {
        print(!this);
    } catch (e) {
        print(e.name);
    }

    try {
        print(eval("delete foo"));
    } catch (e) {
        print(e.name);
    }

    function inner() {
        try {
            print(!this);
        } catch (e) {
            print(e.name);
        }
    }

    inner();
}

outer_strict();

