From 5f39984a6d0b803d04ad72b6d14b7e8839d19c2a Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Fri, 9 Oct 2026 09:42:04 -0700 Subject: [PATCH] Allow type context for bare generic class specialization --- .../generics_defaults_specialization.toml | 10 +++------ .../generics_defaults_specialization.toml | 4 ++-- .../generics_defaults_specialization.toml | 4 ++-- .../generics_defaults_specialization.toml | 10 +++------ conformance/results/results.html | 22 +++++-------------- .../ty/generics_defaults_specialization.toml | 4 ++-- .../generics_defaults_specialization.toml | 4 ++-- .../tests/generics_defaults_specialization.py | 4 +++- 8 files changed, 23 insertions(+), 39 deletions(-) diff --git a/conformance/results/mypy/generics_defaults_specialization.toml b/conformance/results/mypy/generics_defaults_specialization.toml index 1aab9fb8d..6515700dd 100644 --- a/conformance/results/mypy/generics_defaults_specialization.toml +++ b/conformance/results/mypy/generics_defaults_specialization.toml @@ -1,12 +1,8 @@ -conformant = "Partial" -notes = """ -Does not correctly resolve defaults when classes are used directly. -""" +conformant = "Pass" output = """ generics_defaults_specialization.py:30: error: Bad number of arguments for type alias, expected between 0 and 1, given 2 [type-arg] -generics_defaults_specialization.py:56: error: The type "type[Foo]" is not generic and not indexable [misc] +generics_defaults_specialization.py:58: error: The type "type[Foo]" is not generic and not indexable [misc] """ -conformance_automated = "Fail" +conformance_automated = "Pass" errors_diff = """ -Line 46: Expected 1 errors """ diff --git a/conformance/results/pycroscope/generics_defaults_specialization.toml b/conformance/results/pycroscope/generics_defaults_specialization.toml index aab3a627d..4aab1f309 100644 --- a/conformance/results/pycroscope/generics_defaults_specialization.toml +++ b/conformance/results/pycroscope/generics_defaults_specialization.toml @@ -3,6 +3,6 @@ errors_diff = """ """ output = """ ./generics_defaults_specialization.py:30:0: Expected 1 type arguments for type alias, got 2 [invalid_specialization] -./generics_defaults_specialization.py:46:0: Incompatible assignment: expected type[./generics_defaults_specialization.py.Bar[int]], got [incompatible_assignment] -./generics_defaults_specialization.py:56:0: ./generics_defaults_specialization.py.Foo cannot be further subscripted [invalid_specialization] +./generics_defaults_specialization.py:48:0: Incompatible assignment: expected type[./generics_defaults_specialization.py.Bar[int]], got [incompatible_assignment] +./generics_defaults_specialization.py:58:0: ./generics_defaults_specialization.py.Foo cannot be further subscripted [invalid_specialization] """ diff --git a/conformance/results/pyrefly/generics_defaults_specialization.toml b/conformance/results/pyrefly/generics_defaults_specialization.toml index 4b087764e..c0783e881 100644 --- a/conformance/results/pyrefly/generics_defaults_specialization.toml +++ b/conformance/results/pyrefly/generics_defaults_specialization.toml @@ -4,6 +4,6 @@ errors_diff = """ """ output = """ ERROR generics_defaults_specialization.py:30:1-19: Expected 1 type argument for `MyAlias`, got 2 [bad-specialization] -ERROR generics_defaults_specialization.py:46:22-25: `type[Bar]` is not assignable to `type[Bar[int]]` [bad-assignment] -ERROR generics_defaults_specialization.py:56:1-9: Expected 0 type arguments for `Foo`, got 1 [bad-specialization] +ERROR generics_defaults_specialization.py:48:22-25: `type[Bar]` is not assignable to `type[Bar[int]]` [bad-assignment] +ERROR generics_defaults_specialization.py:58:1-9: Expected 0 type arguments for `Foo`, got 1 [bad-specialization] """ diff --git a/conformance/results/pyright/generics_defaults_specialization.toml b/conformance/results/pyright/generics_defaults_specialization.toml index f1d5bc216..2beb10f61 100644 --- a/conformance/results/pyright/generics_defaults_specialization.toml +++ b/conformance/results/pyright/generics_defaults_specialization.toml @@ -1,12 +1,8 @@ -conformant = "Partial" -notes = """ -Allows incorrect assignment to `type[]`. -""" +conformant = "Pass" output = """ generics_defaults_specialization.py:30:15 - error: Too many type arguments provided for "MyAlias[DefaultStrT@MyAlias]"; expected 1 but received 2 (reportInvalidTypeForm) -generics_defaults_specialization.py:56:5 - error: Expected no type arguments for class "Foo" (reportInvalidTypeArguments) +generics_defaults_specialization.py:58:5 - error: Expected no type arguments for class "Foo" (reportInvalidTypeArguments) """ -conformance_automated = "Fail" +conformance_automated = "Pass" errors_diff = """ -Line 46: Expected 1 errors """ diff --git a/conformance/results/results.html b/conformance/results/results.html index 3877f3c17..8106b6714 100644 --- a/conformance/results/results.html +++ b/conformance/results/results.html @@ -610,20 +610,10 @@

Python Type System Conformance Test Results

generics_defaults_specialization - - Partial -
    -
  • Does not correctly resolve defaults when classes are used directly.
  • -
- Pass Pass - - Partial -
    -
  • Allows incorrect assignment to type[].
  • -
- + Pass + Pass Pass Pass @@ -957,10 +947,10 @@

Python Type System Conformance Test Results

- 23.5 / 33 • 71.2% + 24 / 33 • 72.7% 33 / 33 • 100.0% 30 / 33 • 90.9% - 28.5 / 33 • 86.4% + 29 / 33 • 87.9% 32 / 33 • 97.0% 33 / 33 • 100.0% @@ -2583,10 +2573,10 @@

Python Type System Conformance Test Results

- 109 / 146 • 74.7% + 109.5 / 146 • 75.0% 138.5 / 146 • 94.9% 141 / 146 • 96.6% - 135.5 / 146 • 92.8% + 136 / 146 • 93.2% 139.5 / 146 • 95.5% 146 / 146 • 100.0% diff --git a/conformance/results/ty/generics_defaults_specialization.toml b/conformance/results/ty/generics_defaults_specialization.toml index 0a1b822e0..01b15f588 100644 --- a/conformance/results/ty/generics_defaults_specialization.toml +++ b/conformance/results/ty/generics_defaults_specialization.toml @@ -3,6 +3,6 @@ errors_diff = """ """ output = """ generics_defaults_specialization.py:30:15: error[invalid-type-arguments] Too many type arguments: expected between 0 and 1, got 2 -generics_defaults_specialization.py:46:22: error[invalid-assignment] Object of type `` is not assignable to `type[Bar[int]]` -generics_defaults_specialization.py:56:1: error[not-subscriptable] Cannot specialize non-generic class `Foo` +generics_defaults_specialization.py:48:22: error[invalid-assignment] Object of type `` is not assignable to `type[Bar[int]]` +generics_defaults_specialization.py:58:1: error[not-subscriptable] Cannot specialize non-generic class `Foo` """ diff --git a/conformance/results/zuban/generics_defaults_specialization.toml b/conformance/results/zuban/generics_defaults_specialization.toml index 7592bf2be..a485b047c 100644 --- a/conformance/results/zuban/generics_defaults_specialization.toml +++ b/conformance/results/zuban/generics_defaults_specialization.toml @@ -3,6 +3,6 @@ errors_diff = """ """ output = """ generics_defaults_specialization.py:30: error: Bad number of arguments for type alias, expected between 0 and 1, given 2 [misc] -generics_defaults_specialization.py:46: error: Incompatible types in assignment (expression has type "type[Bar]", variable has type "type[Bar[int]]") [assignment] -generics_defaults_specialization.py:56: error: "Foo" expects no type arguments, but 1 given [type-arg] +generics_defaults_specialization.py:48: error: Incompatible types in assignment (expression has type "type[Bar]", variable has type "type[Bar[int]]") [assignment] +generics_defaults_specialization.py:58: error: "Foo" expects no type arguments, but 1 given [type-arg] """ diff --git a/conformance/tests/generics_defaults_specialization.py b/conformance/tests/generics_defaults_specialization.py index 91db2579b..c131f8e3a 100644 --- a/conformance/tests/generics_defaults_specialization.py +++ b/conformance/tests/generics_defaults_specialization.py @@ -43,7 +43,9 @@ class Bar(SubclassMe[int, DefaultStrT]): ... x1: type[Bar[str]] = Bar # ok -x2: type[Bar[int]] = Bar # E +# Type checkers may take type context into account when deciding how to +# specialize a bare runtime reference to a generic class. +x2: type[Bar[int]] = Bar # E? assert_type(Bar(), Bar[str]) assert_type(Bar[bool](), Bar[bool])