From 4972b0bdef449501df029376c9b66a85cf40e998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 27 Sep 2026 20:35:44 +0200 Subject: [PATCH 1/2] Add test for unused locals in class static blocks --- .../unusedLocalsAndParameters.errors.txt | 20 ++++++++++++++----- .../compiler/unusedLocalsAndParameters.js | 13 ++++++++++++ .../unusedLocalsAndParameters.symbols | 16 ++++++++++++--- .../compiler/unusedLocalsAndParameters.types | 11 ++++++++++ .../compiler/unusedLocalsAndParameters.ts | 7 +++++++ 5 files changed, 59 insertions(+), 8 deletions(-) diff --git a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.errors.txt b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.errors.txt index ed6545a77f36c..1565dee0aaff1 100644 --- a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.errors.txt +++ b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.errors.txt @@ -19,13 +19,14 @@ unusedLocalsAndParameters.ts(71,11): error TS6133: 'c' is declared but its value unusedLocalsAndParameters.ts(74,11): error TS6133: 'c' is declared but its value is never read. unusedLocalsAndParameters.ts(79,11): error TS6133: 'N' is declared but its value is never read. unusedLocalsAndParameters.ts(80,9): error TS6133: 'x' is declared but its value is never read. -unusedLocalsAndParameters.ts(83,13): error TS2304: Cannot find name 'y'. -unusedLocalsAndParameters.ts(83,14): error TS1005: ',' expected. -unusedLocalsAndParameters.ts(84,6): error TS1005: ',' expected. -unusedLocalsAndParameters.ts(85,1): error TS1109: Expression expected. +unusedLocalsAndParameters.ts(84,7): error TS6196: 'C1' is declared but never used. +unusedLocalsAndParameters.ts(90,13): error TS2304: Cannot find name 'y'. +unusedLocalsAndParameters.ts(90,14): error TS1005: ',' expected. +unusedLocalsAndParameters.ts(91,6): error TS1005: ',' expected. +unusedLocalsAndParameters.ts(92,1): error TS1109: Expression expected. -==== unusedLocalsAndParameters.ts (25 errors) ==== +==== unusedLocalsAndParameters.ts (26 errors) ==== export { }; // function declaration paramter @@ -150,6 +151,15 @@ unusedLocalsAndParameters.ts(85,1): error TS1109: Expression expected. !!! error TS6133: 'x' is declared but its value is never read. } + // in a class static block + class C1 { + ~~ +!!! error TS6196: 'C1' is declared but never used. + static { + let foo = 1; + } + } + for (let x: y) { ~ !!! error TS2304: Cannot find name 'y'. diff --git a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.js b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.js index 28438ba1b5c01..1649e09d721aa 100644 --- a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.js +++ b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.js @@ -83,6 +83,13 @@ namespace N { var x; } +// in a class static block +class C1 { + static { + let foo = 1; + } +} + for (let x: y) { z(x); } @@ -154,6 +161,12 @@ var N; (function (N) { var x; })(N || (N = {})); +// in a class static block +class C1 { +} +(() => { + let foo = 1; +})(); for (let x, { z }; (x); ) ; export {}; diff --git a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.symbols b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.symbols index f1a978a3e6da3..02e8478653bc3 100644 --- a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.symbols +++ b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.symbols @@ -133,12 +133,22 @@ namespace N { >x : Symbol(x, Decl(unusedLocalsAndParameters.ts, 79, 7)) } +// in a class static block +class C1 { +>C1 : Symbol(C1, Decl(unusedLocalsAndParameters.ts, 80, 1)) + + static { + let foo = 1; +>foo : Symbol(foo, Decl(unusedLocalsAndParameters.ts, 85, 11)) + } +} + for (let x: y) { ->x : Symbol(x, Decl(unusedLocalsAndParameters.ts, 82, 8)) +>x : Symbol(x, Decl(unusedLocalsAndParameters.ts, 89, 8)) >y : Symbol(y) z(x); ->z : Symbol(z, Decl(unusedLocalsAndParameters.ts, 82, 16)) ->x : Symbol(x, Decl(unusedLocalsAndParameters.ts, 82, 8)) +>z : Symbol(z, Decl(unusedLocalsAndParameters.ts, 89, 16)) +>x : Symbol(x, Decl(unusedLocalsAndParameters.ts, 89, 8)) } diff --git a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.types b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.types index 972c927fe99c3..e437bb7268a10 100644 --- a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.types +++ b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.types @@ -154,6 +154,17 @@ namespace N { >x : any } +// in a class static block +class C1 { +>C1 : C1 + + static { + let foo = 1; +>foo : number +>1 : 1 + } +} + for (let x: y) { >x : y diff --git a/tsc/testdata/tests/cases/compiler/unusedLocalsAndParameters.ts b/tsc/testdata/tests/cases/compiler/unusedLocalsAndParameters.ts index cd812120b58b9..cdcdb5da35cef 100644 --- a/tsc/testdata/tests/cases/compiler/unusedLocalsAndParameters.ts +++ b/tsc/testdata/tests/cases/compiler/unusedLocalsAndParameters.ts @@ -85,6 +85,13 @@ namespace N { var x; } +// in a class static block +class C1 { + static { + let foo = 1; + } +} + for (let x: y) { z(x); } From 3936da75c6af8b8fc761fe73cb6e40008c93f33b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 27 Sep 2026 20:49:33 +0200 Subject: [PATCH 2/2] Report unused locals in class static blocks --- tsc/internal/checker/checker.go | 5 ++++- .../reference/compiler/unusedLocalsAndParameters.errors.txt | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tsc/internal/checker/checker.go b/tsc/internal/checker/checker.go index 845f62365bb84..73a64f434a20f 100644 --- a/tsc/internal/checker/checker.go +++ b/tsc/internal/checker/checker.go @@ -2863,6 +2863,9 @@ func (c *Checker) checkClassStaticBlockDeclaration(node *ast.Node) { // Grammar checking c.checkGrammarModifiers(node) node.ForEachChild(c.checkSourceElement) + if len(node.Locals()) != 0 { + c.registerForUnusedIdentifiersCheck(node) + } } func (c *Checker) checkConstructorDeclaration(node *ast.Node) { @@ -7220,7 +7223,7 @@ func (c *Checker) checkUnusedIdentifiers(potentiallyUnusedIdentifiers []*ast.Nod c.checkUnusedClassMembers(node) c.checkUnusedTypeParameters(node) case ast.KindSourceFile, ast.KindModuleDeclaration, ast.KindBlock, ast.KindCaseBlock, ast.KindForStatement, ast.KindForInStatement, - ast.KindForOfStatement: + ast.KindForOfStatement, ast.KindClassStaticBlockDeclaration: c.checkUnusedLocalsAndParameters(node) case ast.KindConstructor, ast.KindFunctionExpression, ast.KindFunctionDeclaration, ast.KindArrowFunction, ast.KindMethodDeclaration, ast.KindGetAccessor, ast.KindSetAccessor: diff --git a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.errors.txt b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.errors.txt index 1565dee0aaff1..bbfd4ea9d2e49 100644 --- a/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.errors.txt +++ b/tsc/testdata/baselines/reference/compiler/unusedLocalsAndParameters.errors.txt @@ -20,13 +20,14 @@ unusedLocalsAndParameters.ts(74,11): error TS6133: 'c' is declared but its value unusedLocalsAndParameters.ts(79,11): error TS6133: 'N' is declared but its value is never read. unusedLocalsAndParameters.ts(80,9): error TS6133: 'x' is declared but its value is never read. unusedLocalsAndParameters.ts(84,7): error TS6196: 'C1' is declared but never used. +unusedLocalsAndParameters.ts(86,13): error TS6133: 'foo' is declared but its value is never read. unusedLocalsAndParameters.ts(90,13): error TS2304: Cannot find name 'y'. unusedLocalsAndParameters.ts(90,14): error TS1005: ',' expected. unusedLocalsAndParameters.ts(91,6): error TS1005: ',' expected. unusedLocalsAndParameters.ts(92,1): error TS1109: Expression expected. -==== unusedLocalsAndParameters.ts (26 errors) ==== +==== unusedLocalsAndParameters.ts (27 errors) ==== export { }; // function declaration paramter @@ -157,6 +158,8 @@ unusedLocalsAndParameters.ts(92,1): error TS1109: Expression expected. !!! error TS6196: 'C1' is declared but never used. static { let foo = 1; + ~~~ +!!! error TS6133: 'foo' is declared but its value is never read. } }