// Copyright 2020 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Will be used in the tests function foo() {} function wrapInLazyFunction(s) { // Use an async function, since some tests use the await keyword. return "async function test() { " + s + "}"; } function wrapInEagerFunction(s) { // Use an async function, since some tests use the await keyword. Await the // result, so that we get the error right away. return "await (async function test() { " + s + "})();"; } function assertEarlyError(s) { assertThrows(wrapInLazyFunction(s), SyntaxError); } function assertLateError(s) { assertDoesNotThrow(wrapInLazyFunction(s)); assertThrows(wrapInEagerFunction(s), ReferenceError); } // Web compatibility: assertLateError("foo() = 0;"); assertLateError("foo()++;"); assertLateError("foo()--;"); assertLateError("++foo();"); assertLateError("--foo();"); assertLateError("foo() = 1;"); assertLateError("foo() += 1;"); assertLateError("foo() -= 1;"); assertLateError("foo() *= 1;"); assertLateError("foo() /= 1;"); assertLateError("for (foo() = 0; ; ) {}"); assertLateError("for ( ; ; foo() = 0) {}"); assertLateError("for (foo() of []) {}"); assertLateError("for (foo() in {}) {}"); assertLateError("for await (foo() of []) {}"); // These are early errors though: assertEarlyError("for (let foo() = 0; ;) {}"); assertEarlyError("for (const foo() = 0; ;) {}"); assertEarlyError("for (var foo() = 0; ;) {}"); // Modern language features: // Tagged templates assertEarlyError("foo() `foo` ++;"); assertEarlyError("foo() `foo` --;"); assertEarlyError("++ foo() `foo`;"); assertEarlyError("-- foo() `foo`;"); assertEarlyError("foo() `foo` = 1;"); assertEarlyError("foo() `foo` += 1;"); assertEarlyError("foo() `foo` -= 1;"); assertEarlyError("foo() `foo` *= 1;"); assertEarlyError("foo() `foo` /= 1;"); assertEarlyError("for (foo() `foo` = 0; ; ) {}"); assertEarlyError("for (; ; foo() `foo` = 0) {}"); // Logical assignment assertEarlyError("foo() &&= 1;"); assertEarlyError("foo() ||= 1;"); assertEarlyError("foo() ??= 1;"); assertEarlyError("for (foo() &&= 0; ;) {}"); assertEarlyError("for ( ; ; foo() &&= 0) {}");