Skip to content

Optional narrowing in nested loop #2522

@grievejia

Description

@grievejia

Describe the Bug

Minimal repro:

def sum_matrix(matrix: list[list[int]]) -> int:
    """Sum all values in a 2D matrix."""
    total: int | None = None
    for row in matrix:
        total = 0
        for val in row:
            total += val  # pyrefly FP: `+=` is not supported between `None` and `int`
    return total or 0

All other type checkers would narrow total to int in the inner loop, except for Pyrefly.

Sandbox Link

https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeSImMYABHAK4C2A%2Bo6gC4BOE%2BAFG1x6IaUCHHYBtUeIkR07ALoKAlDQC0APhpz2iADroaRmnpCnTAZSY1UUKDQBut%2BvG2HUNAEwARGgO5E5mZmhsbsuOy2wjo0AD40AHK46DA0ALyJyTAGxjRguJw0nLgA7m5%2BHAH6oblG4ZH2GQAMObVG%2BYVO9nJFpdVtbfW2NADUGV1GAMQ0ZJzUUKTCAAZjS9pwNOgRdPTExAXsMJg02DDsJTAwhktJKWsYx0s6S61Gc%2Bz0nIZD9gU0TSAADQgejsaBwEjkRAgaYAVTBonYpDy9HQAGMwck4AYDFRaB0BMx0ExTpxePhovJVJo6Fx%2BsZ3p9DGBTAkSTBOMJgPgAL7mdBAkCzeakQjhRhQCjTAAKpDmYAWdAeeHwNDRyUgAHNPhwIMlCAZphZLjQABbsdjEOCIAD0NuFCtFBU1NquNswuDRcBt6vQWp1mPQNryf1QTmgqGwsDVGog2s4uuSNFwxEDEIMZHYpuSagcHLgesMGVMAGZCABGTz8kA84GoDEQPMAMWgMAoaCwKshNaAA

(Only applicable for extension issues) IDE Information

No response

Metadata

Metadata

Assignees

Labels

typecheckingusabilityUsability & readiness issues identified with running Pyrefly on top OSS projects

Type

No fields configured for Bug.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions