fix: dead control flow with deep nested if (#19403)

This commit is contained in:
Alexander Akait 2025-04-08 17:48:41 +03:00 committed by GitHub
parent 44da94f433
commit 278fcb6da9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 442 additions and 13 deletions

View File

@ -2200,6 +2200,9 @@ class JavascriptParser extends Parser {
this.inExecutedPath(false, () => {
this.walkExpression(statement.test);
this.walkNestedStatement(statement.consequent);
});
this.inExecutedPath(true, () => {
if (statement.alternate) {
this.walkNestedStatement(statement.alternate);
}

View File

@ -4781,22 +4781,15 @@ exports[`StatsTestCases should print correct stats for track-returned 1`] = `
./used8.js X bytes [built] [code generated]
./used9.js X bytes [built] [code generated]
./used16.js X bytes [built] [code generated]
./used69.js X bytes [built] [code generated]
./used17.js X bytes [built] [code generated]
./used18.js X bytes [built] [code generated]
./used19.js X bytes [built] [code generated]
./used48.js X bytes [built] [code generated]
./used35.js X bytes [built] [code generated]
./used10.js X bytes [built] [code generated]
./used11.js X bytes [built] [code generated]
+ 38 modules
WARNING in ./index.js 227:3-20
Module not found: Error: Can't resolve 'fail47' in 'Xdir/track-returned'
1 warning has detailed information that is not shown.
Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it.
webpack x.x.x compiled with 1 warning in X ms"
+ 56 modules
webpack x.x.x compiled successfully in X ms"
`;
exports[`StatsTestCases should print correct stats for tree-shaking 1`] = `

View File

@ -224,7 +224,8 @@ it("should work correct for try catch and loops", () => {
require('./used16');
}
require('fail47');
// TODO potential improvement
require('./used69');
} catch (e) {
require('./used17');
} finally {
@ -565,7 +566,7 @@ it("should work correct for try catch and loops", () => {
}
}
function test25() {
function test25a() {
try {
return;
} finally {
@ -703,6 +704,16 @@ it("should work correct for try catch and loops", () => {
require("./used51");
}
function test36() {
test();
throw 1;
function test() {
require("./used67")
}
}
for(let i = 0; i < 1; i++)
if (rand())
require('./used1');
@ -778,6 +789,410 @@ it("should work correct for if #4", () => {
}
});
it("should work correct for if #5", () => {
if (rand())
return;
else if (rand())
return;
else {
const test = 1;
require("./used52")
}
});
it("should work correct for if #6", () => {
if (rand())
return;
else {
const test = 1;
require("./used53")
}
});
it("should work correct for if #7", () => {
if (rand())
return;
else
return;
require("fail");
});
it("should work correct for if #8", () => {
if (rand()) {
rand()
} else if (rand()) {
rand()
} else
return;
require("fail");
});
it("should work correct for if #9", () => {
if (true) {
return;
} else if (rand()) {
require("fail");
} else
require("fail");
require("fail");
});
it("should work correct for if #10", () => {
if (rand()) {
return;
} else if (true) {
return;
} else
require("fail");
require("fail");
});
it("should work correct for if #11", () => {
if (false)
return;
else if (rand()) {
return;
} else
return;
require("fail");
});
it("should work correct for if #12", () => {
if (false)
return;
else if (false) {
return;
} else
return;
require("fail");
});
it("should work correct for if #13", () => {
if (true)
return;
else if (true) {
return;
} else
return;
require("fail");
});
it("should work correct for if #13", () => {
if (false)
return;
else if (false) {
return;
} else {}
require("./used54");
});
it("should work correct for if #14", () => {
if (fn())
return;
else if (fn()) {
fn()
require("./used55");
}
require("./used56");
});
it("should work correct for if #15", () => {
if (true) {
return;
}
require("fail");
});
it("should work correct for if #16", () => {
if (true) return;
const test = 1;
require("fail");
});
it("should work correct for if #17", () => {
if (false) return;
const test = 1;
require("./used57");
});
it("should work correct for if #18", () => {
if (rand()) return;
const test = 1;
require("./used58");
});
it("should work correct for if #19", () => {
if (!rand())
// if reference flag is false ,then show the form and update the model with relative type list
return rand();
else {
if (rand()) {
rand();
require("./used59")
rand();
} else {
rand();
require("./used60");
rand();
}
}
require("./used61");
});
it("should work correct for if #20", () => {
if (rand()) {
return;
} else if (rand()) {
return;
} else if (rand()) {
return;
} else if (rand()) {
return;
}
require("./used62");
});
it("should work correct for if #21", () => {
if (rand())
return;
else if (rand())
return;
else if (rand())
return;
else if (rand())
return;
require("./used63");
});
it("should work correct for if #22", () => {
if (rand()) {
if (true) {
return;
} else if (rand()) {
return;
} else {
return;
}
require("fail");
} else {
return;
require("fail");
}
require("fail");
});
it("should work correct for if #23", () => {
if (rand()) {
if (rand()) {
return;
} else if (true) {
return;
} else {
return;
}
require("fail");
} else {
return;
require("fail");
}
require("fail");
});
it("should work correct for if #24", () => {
if (rand()) {
if (rand()) {
return;
} else if (rand()) {
return;
} else {
return;
}
}
require("./used64");
});
it("should work correct for if #25", () => {
if (rand()) {
if (rand()) {
return;
} else if (rand()) {
return;
} else {
return;
}
} else if (rand()) {
return;
}
require("./used65");
});
it("should work correct for if #26", () => {
if (rand()) {
if (rand()) {
return;
} else if (rand()) {
return;
} else {
return;
}
} else if (rand()) {
return;
} else if (rand()) {}
require("./used66");
});
it("should work correct for if #22", () => {
if (rand()) {
if (rand()) {
return;
} else if (rand()) {
return;
} else {
return;
}
// require("fail");
} else if (rand()) {
if (rand()) {
return;
} else {
return;
}
// require("fail");
} else {
return;
}
require("fail");
});
it("should work correct for if #23", () => {
if (rand()) {
if (rand())
return;
else if (rand())
return;
else
return;
require("fail");
} else if (rand()) {
if (rand())
return;
else
return;
require("fail");
} else {
return;
}
require("fail");
});
it("should work correct for if #24", () => {
if (rand()) {
if (rand()) {
return;
} else {
return;
}
} else {
return;
}
require("fail");
});
it("should work correct for if #25", () => {
if (rand())
return;
else
if (rand())
return;
else
return;
require("fail");
});
it("should work correct for if #26", () => {
if (rand()) {
return;
} else
if (rand())
return;
else
return;
require("fail");
});
it("should work correct for if #27", () => {
if (rand())
return;
else {
if (rand())
return;
else
return;
}
require("fail");
});
it("should work correct for if #28", () => {
if (rand()) {
if (rand()) {
return;
} else {
const test = 1;
require("./used68")
return;
}
require("fail");
}
});
it("should work correct for if #29", () => {
if (rand()) {
return;
if (rand()) {
return;
} else {
return;
}
require("fail");
}
});
it("should not include unused assets", (done) => {
let a, b;
(function() {

View File

@ -1,5 +1,5 @@
module.exports = {
validate(stats) {
expect(stats.compilation.modules.size).toBe(52);
expect(stats.compilation.modules.size).toBe(70);
}
};

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;

View File

@ -0,0 +1 @@
module.exports = 10;