mirror of
https://github.com/astral-sh/ruff
synced 2026-01-21 13:30:49 -05:00
Fixes https://github.com/astral-sh/ty/issues/2467 When calling a method on an instance of a generic class with bounded type parameters (e.g., `C[T: K]` where `K` is a NewType), ty was incorrectly reporting: "Argument type `C[K]` does not satisfy upper bound `C[T@C]` of type variable `Self`" The issue was introduced by PR #22105, which moved the catch-all case for NewType assignments that falls back to the concrete base type. This case was moved before the TypeVar handling cases, so when checking `K <: T@C` (where K is a NewType and T@C is a TypeVar with upper bound K): 1. The NewType fallback matched first 2. It delegated to `int` (K's concrete base type) 3. Then checked `int <: T@C`, which checks if `int` satisfies bound `K` 4. But `int` is not assignable to `K` (NewTypes are distinct from their bases) The fix moves the NewType fallback case after the TypeVar cases, so TypeVar handling takes precedence. Now when checking `K <: T@C`, we use the TypeVar case at line 828 which returns `false` for non-inferable typevars - but this is correct because the *other* direction (`T@C <: K`) passes, and for the overall specialization comparison both directions are checked.