Index: test/mjsunit/strong/declaration-after-use.js |
diff --git a/test/mjsunit/strong/declaration-after-use.js b/test/mjsunit/strong/declaration-after-use.js |
deleted file mode 100644 |
index 3530105f2b32f163ecb24117a47b91c16e8b1894..0000000000000000000000000000000000000000 |
--- a/test/mjsunit/strong/declaration-after-use.js |
+++ /dev/null |
@@ -1,255 +0,0 @@ |
-// Copyright 2015 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. |
- |
-// Flags: --strong-mode |
- |
-// Note that it's essential for these tests that the reference is inside dead |
-// code (because we already produce ReferenceErrors for run-time unresolved |
-// variables and don't want to confuse those with strong mode errors). But the |
-// errors should *not* be inside lazy, unexecuted functions, since lazy parsing |
-// doesn't produce strong mode scoping errors). |
- |
-// In addition, assertThrows will call eval and that changes variable binding |
-// types (see e.g., UNBOUND_EVAL_SHADOWED). We can avoid unwanted side effects |
-// by wrapping the code to be tested inside an outer function. |
-function assertThrowsHelper(code) { |
- "use strict"; |
- let prologue = "(function outer() { if (false) { "; |
- let epilogue = " } })();"; |
- |
- assertThrows("'use strong'; " + prologue + code + epilogue, ReferenceError); |
- |
- // Make sure the error happens only in strong mode (note that we need strict |
- // mode here because of let). |
- assertDoesNotThrow("'use strict'; " + prologue + code + epilogue); |
-} |
- |
-(function DeclarationAfterUse() { |
- // Note that these tests only test cases where the declaration is found but is |
- // after the use. In particular, we cannot yet detect cases where the use can |
- // possibly bind to a global variable. |
- assertThrowsHelper("x; let x = 0;"); |
- assertThrowsHelper("function f() { x; let x = 0; }"); |
- assertThrowsHelper("function f() { x; } let x = 0;"); |
- |
- assertThrowsHelper("x; const x = 0;"); |
- assertThrowsHelper("function f() { x; const x = 0; }"); |
- assertThrowsHelper("function f() { x; } const x = 0;"); |
- |
- // These tests needs to be done a bit more manually, since var is not allowed |
- // in strong mode: |
- assertThrows( |
- `(function outer() { |
- function f() { 'use strong'; if (false) { x; } } var x = 0; f(); |
- })()`, |
- ReferenceError); |
- assertDoesNotThrow( |
- "(function outer() {\n" + |
- " function f() { if (false) { x; } } var x = 0; f(); \n" + |
- "})()"); |
- |
- assertThrows( |
- "(function outer() {\n" + |
- " function f() { 'use strong'; if (false) { x; } } var x; f(); \n" + |
- "})()", |
- ReferenceError); |
- assertDoesNotThrow( |
- "(function outer() {\n" + |
- " function f() { if (false) { x; } } var x; f(); \n" + |
- "})()"); |
- |
- // Use occurring in the initializer of the declaration: |
- assertThrowsHelper("let x = x + 1;"); |
- assertThrowsHelper("let x = x;"); |
- assertThrowsHelper("let x = y, y = 4;"); |
- assertThrowsHelper("let x = function() { x; }"); |
- assertThrowsHelper("let x = a => { x; }"); |
- assertThrowsHelper("function f(x) { return x; }; let x = f(x);"); |
- assertThrowsHelper("const x = x;"); |
- assertThrowsHelper("const x = function() { x; }"); |
- assertThrowsHelper("const x = a => { x; }"); |
- assertThrowsHelper("function f(x) {return x}; const x = f(x);"); |
- |
- assertThrowsHelper("for (let x = x; ; ) { }"); |
- assertThrowsHelper("for (const x = x; ; ) { }"); |
- assertThrowsHelper("for (let x = y, y; ; ) { }"); |
- assertThrowsHelper("for (const x = y, y = 0; ; ) { }"); |
- |
- // Computed property names |
- assertThrowsHelper("let o = { 'a': 'b', [o.a]: 'c'};"); |
-})(); |
- |
- |
-(function DeclarationAfterUseInClasses() { |
- // Referring to a variable declared later |
- assertThrowsHelper("class C { m() { x; } } let x = 0;"); |
- assertThrowsHelper("class C { static m() { x; } } let x = 0;"); |
- assertThrowsHelper("class C { [x]() { } } let x = 0;"); |
- |
- assertThrowsHelper("class C { m() { x; } } const x = 0;"); |
- assertThrowsHelper("class C { static m() { x; } } const x = 0;"); |
- assertThrowsHelper("class C { [x]() { } } const x = 0;"); |
- |
- // Referring to the class name. |
- assertThrowsHelper("class C extends C { }"); |
- assertThrowsHelper("let C = class C2 extends C { }"); |
- assertThrowsHelper("let C = class C2 extends C2 { }"); |
- |
- assertThrowsHelper("let C = class C2 { constructor() { C; } }"); |
- assertThrowsHelper("let C = class C2 { method() { C; } }"); |
- assertThrowsHelper("let C = class C2 { *generator_method() { C; } }"); |
- |
- assertThrowsHelper( |
- `let C = class C2 { |
- static a() { return 'A'; } |
- [C.a()]() { return 'B'; } |
- };`); |
- |
- assertThrowsHelper( |
- `let C = class C2 { |
- static a() { return 'A'; } |
- [C2.a()]() { return 'B'; } |
- };`); |
- |
- assertThrowsHelper( |
- `let C = class C2 { |
- [(function() { C; return 'A';})()]() { return 'B'; } |
- };`); |
- |
- // The reference to C or C2 is inside a function, but not a method. |
- assertThrowsHelper( |
- `let C = class C2 { |
- [(function() { C2; return 'A';})()]() { return 'B'; } |
- };`); |
- |
- assertThrowsHelper( |
- `let C = class C2 { |
- [(function() { C; return 'A';})()]() { return 'B'; } |
- };`); |
- |
- // The reference to C or C2 is inside a method, but it's not a method of the |
- // relevant class (C2). |
- assertThrowsHelper( |
- `let C = class C2 { |
- [(new (class D { m() { C2; return 'A'; } })).m()]() { |
- return 'B'; |
- } |
- }`); |
- |
- assertThrowsHelper( |
- `let C = class C2 { |
- [(new (class D { m() { C; return 'A'; } })).m()]() { |
- return 'B'; |
- } |
- }`); |
- |
- assertThrowsHelper( |
- `let C = class C2 { |
- [({m() { C2; return 'A'; }}).m()]() { return 'B'; } |
- }`); |
- |
- assertThrowsHelper( |
- `let C = class C2 { |
- [({m() { C; return 'A'; }}).m()]() { return 'B'; } |
- }`); |
- |
- assertThrowsHelper( |
- `class COuter { |
- m() { |
- class CInner { |
- [({ m() { CInner; return 'A'; } }).m()]() { |
- return 'B'; |
- } |
- } |
- } |
- }`); |
-})(); |
- |
- |
-(function UsesWhichAreFine() { |
- "use strong"; |
- |
- let var1 = 0; |
- var1; |
- |
- let var2a = 0, var2b = var2a + 1, var2c = 2 + var2b; |
- |
- for (let var3 = 0; var3 < 1; var3++) { |
- var3; |
- } |
- |
- for (let var4a = 0, var4b = var4a; var4a + var4b < 4; var4a++, var4b++) { |
- var4a; |
- var4b; |
- } |
- |
- let var5 = 5; |
- for (; var5 < 10; ++var5) { } |
- |
- let arr = [1, 2]; |
- for (let i of arr) { |
- i; |
- } |
- |
- try { |
- throw "error"; |
- } catch (e) { |
- e; |
- } |
- |
- function func1() { func1; this; } |
- func1(); |
- func1; |
- |
- function * func2() { func2; this; } |
- func2(); |
- func2; |
- |
- function func4(p, ...rest) { p; rest; this; func2; } |
- // TODO(arv): The arity checking is not correct with rest parameters. |
- func4(1, 2); |
- |
- let func5 = (p1, p2) => { p1; p2; }; |
- func5(1, 2); |
- |
- let func5b = p1 => p1; |
- func5b(1); |
- |
- function func6() { |
- var1, var2a, var2b, var2c; |
- } |
- |
- class C1 { constructor() { C1; } }; new C1(); |
- let C2 = class C3 { constructor() { C3; } }; new C2(); |
- |
- class C4 { method() { C4; } *generator_method() { C4; } }; new C4(); |
- let C5 = class C6 { method() { C6; } *generator_method() { C6; } }; new C5(); |
- |
- class C7 { static method() { C7; } }; new C7(); |
- let C8 = class C9 { static method() { C9; } }; new C8(); |
- |
- class C10 { get x() { C10; } }; new C10(); |
- let C11 = class C12 { get x() { C12; } }; new C11(); |
- |
- // Regression test for unnamed classes. |
- let C13 = class { m() { var1; } }; |
- |
- class COuter { |
- m() { |
- class CInner { |
- // Here we can refer to COuter but not to CInner (see corresponding |
- // assertion test): |
- [({ m() { COuter; return 'A'; } }).m()]() { return 'B'; } |
- // And here we can refer to both: |
- n() { COuter; CInner; } |
- } |
- return new CInner(); |
- } |
- } |
- (new COuter()).m().n(); |
- |
- // Making sure the check which is supposed to prevent "object literal inside |
- // computed property name references the class name" is not too generic: |
- class C14 { m() { let obj = { n() { C14 } }; obj.n(); } }; (new C14()).m(); |
-})(); |