Index: test/mjsunit/regress/redeclaration-error-types.js |
diff --git a/test/mjsunit/regress/redeclaration-error-types.js b/test/mjsunit/regress/redeclaration-error-types.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..72e097db5707c06c5f9eea9f5a4cc1c227c66515 |
--- /dev/null |
+++ b/test/mjsunit/regress/redeclaration-error-types.js |
@@ -0,0 +1,145 @@ |
+// Copyright 2016 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. |
+ |
+ |
+function doTest(scripts, expectedError) { |
+ var realm = Realm.create(); |
+ |
+ for (var i = 0; i < scripts.length - 1; i++) { |
+ Realm.eval(realm, scripts[i]); |
+ } |
+ assertThrows(function() { |
+ Realm.eval(realm, scripts[scripts.length - 1]); |
+ }, Realm.eval(realm, expectedError)); |
+ |
+ Realm.dispose(realm); |
+} |
+ |
+var tests = [ |
+ { |
+ // ES#sec-globaldeclarationinstantiation 5.a: |
+ // If envRec.HasVarDeclaration(name) is true, throw a SyntaxError |
+ // exception. |
+ scripts: [ |
+ "var a;", |
+ "let a;", |
+ ], |
+ expectedError: "SyntaxError", |
+ }, |
+ { |
+ // ES#sec-globaldeclarationinstantiation 6.a: |
+ // If envRec.HasLexicalDeclaration(name) is true, throw a SyntaxError |
+ // exception. |
+ scripts: [ |
+ "let a;", |
+ "var a;", |
+ ], |
+ expectedError: "SyntaxError", |
+ }, |
+ { |
+ // ES#sec-globaldeclarationinstantiation 5.b: |
+ // If envRec.HasLexicalDeclaration(name) is true, throw a SyntaxError |
+ // exception. |
+ scripts: [ |
+ "let a;", |
+ "let a;", |
+ ], |
+ expectedError: "SyntaxError", |
+ }, |
+ { |
+ // ES#sec-evaldeclarationinstantiation 5.a.i.1: |
+ // If varEnvRec.HasLexicalDeclaration(name) is true, throw a SyntaxError |
+ // exception. |
+ scripts: [ |
+ 'let a; eval("var a;");', |
+ ], |
+ expectedError: "SyntaxError", |
+ }, |
+ { |
+ // ES#sec-evaldeclarationinstantiation 5.a.i.1: |
+ // If varEnvRec.HasLexicalDeclaration(name) is true, throw a SyntaxError |
+ // exception. |
+ scripts: [ |
+ 'let a; eval("function a() {}");', |
+ ], |
+ expectedError: "SyntaxError", |
+ }, |
+ { |
+ // ES#sec-evaldeclarationinstantiation 5.d.ii.2.a.i: |
+ // Throw a SyntaxError exception. |
+ scripts: [ |
+ '(function() { let a; eval("var a;"); })();', |
+ ], |
+ expectedError: "SyntaxError", |
+ }, |
+ { |
+ // ES#sec-evaldeclarationinstantiation 5.d.ii.2.a.i: |
+ // Throw a SyntaxError exception. |
+ scripts: [ |
+ '(function() { let a; eval("function a() {}"); })();', |
+ ], |
+ expectedError: "SyntaxError", |
+ }, |
+ { |
+ // ES#sec-globaldeclarationinstantiation 5.d: |
+ // If hasRestrictedGlobal is true, throw a SyntaxError exception. |
+ scripts: [ |
+ 'let NaN;', |
+ ], |
+ expectedError: "SyntaxError", |
+ }, |
+ { |
+ // ES#sec-globaldeclarationinstantiation 5.d: |
+ // If hasRestrictedGlobal is true, throw a SyntaxError exception. |
+ scripts: [ |
+ 'function NaN() {}', |
+ ], |
+ expectedError: "SyntaxError", |
+ }, |
+ |
+ { |
+ // ES#sec-evaldeclarationinstantiation 8.a.iv.1.b: |
+ // If fnDefinable is false, throw a TypeError exception. |
+ scripts: [ |
+ 'eval("function NaN() {}");', |
+ ], |
+ expectedError: "TypeError", |
+ }, |
+ { |
+ // ES#sec-evaldeclarationinstantiation 8.a.iv.1.b: |
+ // If fnDefinable is false, throw a TypeError exception. |
+ scripts: [ |
+ ` |
+ let a; |
+ try { |
+ eval("function a() {}"); |
+ } catch (e) {} |
+ eval("function NaN() {}"); |
+ `, |
+ ], |
+ expectedError: "TypeError", |
+ }, |
+ { |
+ // ES#sec-evaldeclarationinstantiation 8.a.iv.1.b: |
+ // If fnDefinable is false, throw a TypeError exception. |
+ scripts: [ |
+ ` |
+ eval(" |
+ function f() { |
+ function b() { |
+ (0, eval)('function NaN() {}'); |
+ } |
+ b(); |
+ } |
+ f(); |
+ "); |
+ `.replace(/"/g, '`'), |
+ ], |
+ expectedError: "TypeError", |
+ }, |
+]; |
+ |
+tests.forEach(function(test) { |
+ doTest(test.scripts, test.expectedError); |
+}); |