CQ. Fix scoping of for-loop variables in initializers
Ensure loop-local variables introduced by `for` parts are bound consistently during resolution, while still reporting reads that occur before the declaration point. The resolver now predeclares `ForPartsWithDeclarations` variables in the loop’s local scope before traversing the initializer/condition/updaters. This makes lexical lookup within `forLoopParts` resolve to the loop-local element (even in `var x = x`), and allows later verification to correctly report `REFERENCED_BEFORE_DECLARATION` instead of treating the name as outer/undefined. Also align foreach resolution by defining the declared loop variable only after visiting the iterable expression, and update error verification to hide not-yet-declared elements consistently for blocks, switch members, and `for` parts via a generalized `HiddenElements.forElements` helper. Change-Id: Ifab327737bb033fe05f1d765196796924378ac5e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/480120 Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Paul Berry <paulberry@google.com>
This commit is contained in:
committed by
Commit Queue
parent
2c316040d7
commit
7d703f75fc
@@ -88,5 +88,6 @@ void testShadowLocal() {
|
||||
List<int> x = [1, 2, 3];
|
||||
for (var x = x; ;) break;
|
||||
// ^
|
||||
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
|
||||
// [cfe] Local variable 'x' can't be referenced before it is declared.
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user