Fix break/continue when switch is nested inside loop (#11802)
* Fix break/continue when switch is nested inside loop * merge retCheck
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
expect(() => {
|
||||
for (const a of [1]) {
|
||||
switch (true) {
|
||||
case true: {
|
||||
const b = 1;
|
||||
() => b;
|
||||
if (true) break;
|
||||
continue;
|
||||
}
|
||||
case false: {
|
||||
throw new Error("unreachable");
|
||||
}
|
||||
}
|
||||
}
|
||||
}).not.toThrow();
|
||||
@@ -0,0 +1,13 @@
|
||||
for (const a of [1]) {
|
||||
switch (true) {
|
||||
case true: {
|
||||
const b = 1;
|
||||
() => b;
|
||||
if (true) break;
|
||||
continue;
|
||||
}
|
||||
case false: {
|
||||
throw new Error("unreachable");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
for (var a of [1]) {
|
||||
switch (true) {
|
||||
case true:
|
||||
{
|
||||
var _ret = function () {
|
||||
var b = 1;
|
||||
|
||||
(function () {
|
||||
return b;
|
||||
});
|
||||
|
||||
if (true) return "break";
|
||||
return "continue";
|
||||
}();
|
||||
|
||||
if (_ret === "break") break;
|
||||
if (_ret === "continue") continue;
|
||||
}
|
||||
|
||||
case false:
|
||||
{
|
||||
throw new Error("unreachable");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
(function () {
|
||||
var _loop2 = function (i) {
|
||||
var _loop = function (i) {
|
||||
fns.push(function () {
|
||||
return i;
|
||||
});
|
||||
@@ -15,18 +15,11 @@
|
||||
}
|
||||
};
|
||||
|
||||
_loop: for (var i in nums) {
|
||||
var _ret = _loop2(i);
|
||||
for (var i in nums) {
|
||||
var _ret = _loop(i);
|
||||
|
||||
switch (_ret) {
|
||||
case "continue":
|
||||
continue;
|
||||
|
||||
case "break":
|
||||
break _loop;
|
||||
|
||||
default:
|
||||
if (typeof _ret === "object") return _ret.v;
|
||||
}
|
||||
if (_ret === "continue") continue;
|
||||
if (_ret === "break") break;
|
||||
if (typeof _ret === "object") return _ret.v;
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -18,13 +18,8 @@ function foo() {
|
||||
return "break";
|
||||
}();
|
||||
|
||||
switch (_ret) {
|
||||
case "break":
|
||||
break;
|
||||
|
||||
default:
|
||||
if (typeof _ret === "object") return _ret.v;
|
||||
}
|
||||
if (_ret === "break") break;
|
||||
if (typeof _ret === "object") return _ret.v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user