Skip to content

[ty] Fix narrowing enum literal unions by member identity#25520

Merged
charliermarsh merged 1 commit into
mainfrom
charlie/fix-enum-literal-union-narrowing
Jun 1, 2026
Merged

[ty] Fix narrowing enum literal unions by member identity#25520
charliermarsh merged 1 commit into
mainfrom
charlie/fix-enum-literal-union-narrowing

Conversation

@charliermarsh

@charliermarsh charliermarsh commented Jun 1, 2026

Copy link
Copy Markdown
Member

Summary

Prior to this change, we failed to narrow a union containing an explicitly annotated enum literal (e.g., x: list[int] | Literal[Answer.NO]) when comparing it against the corresponding enum member:

from enum import Enum
from typing import Literal

class Answer(Enum):
    NO = 0
    YES = 1

def f(x: list[int] | Literal[Answer.NO]):
    if x is Answer.NO:
        return
    # Before: list[int] | Literal[Answer.NO]
    # After: list[int]
    reveal_type(x)

We were comparing the outer literal types, so the intersection builder failed to recognize that both types represented the
same enum member.

Now, we compare the underlying enum-literal identities instead, restoring narrowing for is, is not, ==, and !=.

Closes astral-sh/ty#3606.

@charliermarsh charliermarsh added the bug Something isn't working label Jun 1, 2026
@astral-sh-bot astral-sh-bot Bot added the ty Multi-file analysis & type inference label Jun 1, 2026
@astral-sh-bot

astral-sh-bot Bot commented Jun 1, 2026

Copy link
Copy Markdown

Typing conformance results

No changes detected ✅

Current numbers
The percentage of diagnostics emitted that were expected errors held steady at 91.94%. The percentage of expected errors that received a diagnostic held steady at 87.09%. The number of fully passing files held steady at 92/134.

@astral-sh-bot

astral-sh-bot Bot commented Jun 1, 2026

Copy link
Copy Markdown

Memory usage report

Memory usage unchanged ✅

@astral-sh-bot

astral-sh-bot Bot commented Jun 1, 2026

Copy link
Copy Markdown

ecosystem-analyzer results

No diagnostic changes detected ✅

Full report with detailed diff (timing results)

@charliermarsh charliermarsh marked this pull request as ready for review June 1, 2026 12:12

@sharkdp sharkdp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you

@charliermarsh charliermarsh merged commit a3c71eb into main Jun 1, 2026
59 checks passed
@charliermarsh charliermarsh deleted the charlie/fix-enum-literal-union-narrowing branch June 1, 2026 12:25
carljm added a commit that referenced this pull request Jun 1, 2026
* main:
  [`pydocstyle`] Improve discoverability of rules enabled for each convention (#24973)
  [ty] Deduplicate retained use-def place states (#25450)
  [ty] reduce features of low-level crates depended on by `ty_python_semantic` (#25524)
  [ty] Fix narrowing enum literal unions by member identity (#25520)
  [ty] Test tagged union narrowing for named tuples (#25519)
  [ty] Disallow file-system access in `ty_python_core` (#25518)
  [ty] Nominal Tagged Union Narrowing (#24916)
  Commit `scripts/uv.lock` (#25517)
  Fix potential index out of range in `LineIndex` computation (#25492)
  [ty] Sync vendored typeshed stubs (#25514)
  [ty] Add disjointness for protocol method members (#25315)
  [ty] Use compact sets for more immutable fields (#25476)
  [ty] Derive `Default` for `FunctionDecoratorInference` (#25482)
  [ty] Ignore rejected assignments for synthesized bindings (#25340)
  [ty] Handle cycles in function decorator inference (#25475)
  docs: fix typo `bin/active` → `bin/activate` in tutorial (#25473)
  [ty] Narrow bound method overloads by receiver (#24707)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working ty Multi-file analysis & type inference

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Narrowing on is / == does not remove enum Literal member from a union (regression in 0.0.39)

2 participants