Index: test/cctest/test-parsing.cc |
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc |
index 1c8ef5878a51ce8f8ebe16209ea4330afad4f501..f6fc10f1ff2ea0fcccf9eaf94c1fe8feb8587829 100644 |
--- a/test/cctest/test-parsing.cc |
+++ b/test/cctest/test-parsing.cc |
@@ -3302,63 +3302,68 @@ TEST(InnerAssignment) { |
{"function x() {}; var x;", true, false}, |
{"var x; try {} catch (x) { var x = 5; }", true, false}, |
}; |
+ |
+ // We set allow_error_in_inner_function to true in cases where our handling of |
+ // assigned variables in lazy inner functions is currently overly pessimistic. |
+ // FIXME(marja): remove it when no longer needed. |
struct { |
const char* source; |
bool assigned; |
bool with; |
+ bool allow_error_in_inner_function; |
} inners[] = { |
// Actual assignments. |
- {"x = 1;", true, false}, |
- {"x++;", true, false}, |
- {"++x;", true, false}, |
- {"x--;", true, false}, |
- {"--x;", true, false}, |
- {"{ x = 1; }", true, false}, |
- {"'use strict'; { let x; }; x = 0;", true, false}, |
- {"'use strict'; { const x = 1; }; x = 0;", true, false}, |
- {"'use strict'; { function x() {} }; x = 0;", true, false}, |
- {"with ({}) { x = 1; }", true, true}, |
- {"eval('');", true, false}, |
- {"'use strict'; { let y; eval('') }", true, false}, |
- {"function h() { x = 0; }", true, false}, |
- {"(function() { x = 0; })", true, false}, |
- {"(function() { x = 0; })", true, false}, |
- {"with ({}) (function() { x = 0; })", true, true}, |
- {"for (x of [1,2,3]) {}", true, false}, |
- {"for (x in {a: 1}) {}", true, false}, |
- {"for ([x] of [[1],[2],[3]]) {}", true, false}, |
- {"for ([x] in {ab: 1}) {}", true, false}, |
- {"for ([...x] in {ab: 1}) {}", true, false}, |
- {"[x] = [1]", true, false}, |
+ {"x = 1;", true, false, false}, |
+ {"x++;", true, false, false}, |
+ {"++x;", true, false, false}, |
+ {"x--;", true, false, false}, |
+ {"--x;", true, false, false}, |
+ {"{ x = 1; }", true, false, false}, |
+ {"'use strict'; { let x; }; x = 0;", true, false, false}, |
+ {"'use strict'; { const x = 1; }; x = 0;", true, false, false}, |
+ {"'use strict'; { function x() {} }; x = 0;", true, false, false}, |
+ {"with ({}) { x = 1; }", true, true, false}, |
+ {"eval('');", true, false, false}, |
+ {"'use strict'; { let y; eval('') }", true, false, false}, |
+ {"function h() { x = 0; }", true, false, false}, |
+ {"(function() { x = 0; })", true, false, false}, |
+ {"(function() { x = 0; })", true, false, false}, |
+ {"with ({}) (function() { x = 0; })", true, true, false}, |
+ {"for (x of [1,2,3]) {}", true, false, false}, |
+ {"for (x in {a: 1}) {}", true, false, false}, |
+ {"for ([x] of [[1],[2],[3]]) {}", true, false, false}, |
+ {"for ([x] in {ab: 1}) {}", true, false, false}, |
+ {"for ([...x] in {ab: 1}) {}", true, false, false}, |
+ {"[x] = [1]", true, false, false}, |
// Actual non-assignments. |
- {"", false, false}, |
- {"x;", false, false}, |
- {"var x;", false, false}, |
- {"var x = 8;", false, false}, |
- {"var x; x = 8;", false, false}, |
- {"'use strict'; let x;", false, false}, |
- {"'use strict'; let x = 8;", false, false}, |
- {"'use strict'; let x; x = 8;", false, false}, |
- {"'use strict'; const x = 8;", false, false}, |
- {"function x() {}", false, false}, |
- {"function x() { x = 0; }", false, false}, |
- {"function h(x) { x = 0; }", false, false}, |
- {"'use strict'; { let x; x = 0; }", false, false}, |
- {"{ var x; }; x = 0;", false, false}, |
- {"with ({}) {}", false, true}, |
- {"var x; { with ({}) { x = 1; } }", false, true}, |
- {"try {} catch(x) { x = 0; }", false, false}, |
- {"try {} catch(x) { with ({}) { x = 1; } }", false, true}, |
+ {"", false, false, false}, |
+ {"x;", false, false, false}, |
+ {"var x;", false, false, false}, |
+ {"var x = 8;", false, false, false}, |
+ {"var x; x = 8;", false, false, false}, |
+ {"'use strict'; let x;", false, false, false}, |
+ {"'use strict'; let x = 8;", false, false, false}, |
+ {"'use strict'; let x; x = 8;", false, false, false}, |
+ {"'use strict'; const x = 8;", false, false, false}, |
+ {"function x() {}", false, false, false}, |
+ {"function x() { x = 0; }", false, false, true}, |
+ {"function h(x) { x = 0; }", false, false, false}, |
+ {"'use strict'; { let x; x = 0; }", false, false, false}, |
+ {"{ var x; }; x = 0;", false, false, false}, |
+ {"with ({}) {}", false, true, false}, |
+ {"var x; { with ({}) { x = 1; } }", false, true, false}, |
+ {"try {} catch(x) { x = 0; }", false, false, true}, |
+ {"try {} catch(x) { with ({}) { x = 1; } }", false, true, true}, |
// Eval approximation. |
- {"eval('');", true, false}, |
- {"function h() { eval(''); }", true, false}, |
- {"(function() { eval(''); })", true, false}, |
+ {"eval('');", true, false, false}, |
+ {"function h() { eval(''); }", true, false, false}, |
+ {"(function() { eval(''); })", true, false, false}, |
// Shadowing not recognized because of eval approximation. |
- {"var x; eval('');", true, false}, |
- {"'use strict'; let x; eval('');", true, false}, |
- {"try {} catch(x) { eval(''); }", true, false}, |
- {"function x() { eval(''); }", true, false}, |
- {"(function(x) { eval(''); })", true, false}, |
+ {"var x; eval('');", true, false, false}, |
+ {"'use strict'; let x; eval('');", true, false, false}, |
+ {"try {} catch(x) { eval(''); }", true, false, false}, |
+ {"function x() { eval(''); }", true, false, false}, |
+ {"(function(x) { eval(''); })", true, false, false}, |
}; |
int prefix_len = Utf8LengthHelper(prefix); |
@@ -3417,9 +3422,8 @@ TEST(InnerAssignment) { |
CHECK(var->is_used() || !expected); |
bool is_maybe_assigned = var->maybe_assigned() == i::kMaybeAssigned; |
if (i::FLAG_lazy_inner_functions) { |
- // If we parse inner functions lazily, allow being pessimistic about |
- // maybe_assigned. |
- CHECK(is_maybe_assigned || (is_maybe_assigned == expected)); |
+ CHECK(is_maybe_assigned == expected || |
+ (is_maybe_assigned && inners[j].allow_error_in_inner_function)); |
} else { |
CHECK_EQ(is_maybe_assigned, expected); |
} |