Skip to content

Conversation

@mtshiba
Copy link
Contributor

@mtshiba mtshiba commented Dec 8, 2025

Summary

This PR includes the following changes:

  • When attempting to specialize a non-generic type (or a type that is already specialized), the result is Unknown. Also, the error message is improved.
  • When an implicit type alias is incorrectly specialized, the result is Unknown. Also, the error message is improved.
  • When only some of the type alias bounds and constraints are not satisfied, not all substitutions are Unknown.
  • Double specialization is prohibited. e.g. G[int][int]

Furthermore, after applying this PR, the fuzzing tests for seeds 1052 and 4419, which panic in main, now pass.
This is because the false recursions on type variables have been removed.

# name_2[0] => Unknown
class name_1[name_2: name_2[0]]:
    def name_4(name_3: name_2, /):
        if name_3:
            pass

#  (name_5 if unique_name_0 else name_1)[0] => Unknown
def name_4[name_5: (name_5 if unique_name_0 else name_1)[0], **name_1](): ...

Test Plan

New corpus test
mdtest files updated

@astral-sh-bot
Copy link

astral-sh-bot bot commented Dec 8, 2025

Diagnostic diff on typing conformance tests

Changes were detected when running ty on typing conformance tests
--- old-output.txt	2025-12-10 10:29:28.201268540 +0000
+++ new-output.txt	2025-12-10 10:29:31.922278958 +0000
@@ -4,16 +4,16 @@
 _directives_deprecated_library.py:41:25: error[invalid-return-type] Function always implicitly returns `None`, which is not assignable to return type `int | float`
 _directives_deprecated_library.py:45:24: error[invalid-return-type] Function always implicitly returns `None`, which is not assignable to return type `str`
 aliases_explicit.py:57:5: error[type-assertion-failure] Type `(int, str, str, /) -> None` does not match asserted type `Unknown`
-aliases_explicit.py:67:24: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
-aliases_explicit.py:68:24: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
+aliases_explicit.py:67:9: error[non-subscriptable] Cannot subscript non-generic type
+aliases_explicit.py:68:9: error[non-subscriptable] Cannot subscript non-generic type: `<class 'list[int | None]'>` is already specialized
 aliases_explicit.py:69:29: error[invalid-type-arguments] Too many type arguments: expected 1, got 2
 aliases_explicit.py:70:29: error[invalid-type-arguments] Too many type arguments: expected 1, got 2
 aliases_explicit.py:71:24: error[invalid-type-arguments] Type argument for `ParamSpec` must be either a list of types, `ParamSpec`, `Concatenate`, or `...`
 aliases_explicit.py:101:6: error[call-non-callable] Object of type `UnionType` is not callable
-aliases_explicit.py:102:20: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
+aliases_explicit.py:102:5: error[non-subscriptable] Cannot subscript non-generic type
 aliases_implicit.py:68:5: error[type-assertion-failure] Type `(int, str, str, /) -> None` does not match asserted type `Unknown`
-aliases_implicit.py:76:24: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
-aliases_implicit.py:77:24: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
+aliases_implicit.py:76:9: error[non-subscriptable] Cannot subscript non-generic type
+aliases_implicit.py:77:9: error[non-subscriptable] Cannot subscript non-generic type: `<class 'list[int | None]'>` is already specialized
 aliases_implicit.py:78:29: error[invalid-type-arguments] Too many type arguments: expected 1, got 2
 aliases_implicit.py:79:29: error[invalid-type-arguments] Too many type arguments: expected 1, got 2
 aliases_implicit.py:80:24: error[invalid-type-arguments] Type argument for `ParamSpec` must be either a list of types, `ParamSpec`, `Concatenate`, or `...`
@@ -28,7 +28,7 @@
 aliases_implicit.py:118:10: error[invalid-type-form] Variable of type `Literal["int"]` is not allowed in a type expression
 aliases_implicit.py:119:10: error[invalid-type-form] Variable of type `Literal["int | str"]` is not allowed in a type expression
 aliases_implicit.py:133:6: error[call-non-callable] Object of type `UnionType` is not callable
-aliases_implicit.py:135:20: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
+aliases_implicit.py:135:5: error[non-subscriptable] Cannot subscript non-generic type
 aliases_newtype.py:11:8: error[invalid-argument-type] Argument is incorrect: Expected `int`, found `Literal["user"]`
 aliases_newtype.py:12:14: error[invalid-assignment] Object of type `Literal[42]` is not assignable to `UserId`
 aliases_newtype.py:18:11: error[invalid-assignment] Object of type `<NewType pseudo-class 'UserId'>` is not assignable to `type`
@@ -610,40 +610,41 @@
 generics_typevartuple_callable.py:49:1: error[type-assertion-failure] Type `tuple[int | float, str, int | float | complex]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
 generics_typevartuple_concat.py:47:42: error[invalid-return-type] Function always implicitly returns `None`, which is not assignable to return type `tuple[@Todo(PEP 646), ...]`
 generics_typevartuple_concat.py:52:1: error[type-assertion-failure] Type `tuple[int, bool, str]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
-generics_typevartuple_specialization.py:45:23: error[invalid-type-arguments] Too many type arguments: expected 0, got 2
-generics_typevartuple_specialization.py:45:51: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
-generics_typevartuple_specialization.py:46:5: error[type-assertion-failure] Type `tuple[int, int | float, bool]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
+generics_typevartuple_specialization.py:45:14: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:45:40: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[str, @Todo(specialized non-generic class)]'>` is already specialized
+generics_typevartuple_specialization.py:46:5: error[type-assertion-failure] Type `tuple[int, int | float, bool]` does not match asserted type `Unknown`
+generics_typevartuple_specialization.py:47:5: error[type-assertion-failure] Type `tuple[str, @Todo(specialized non-generic class)]` does not match asserted type `Unknown`
 generics_typevartuple_specialization.py:51:5: error[type-assertion-failure] Type `tuple[int]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
 generics_typevartuple_specialization.py:52:37: error[invalid-type-form] Tuple literals are not allowed in this context in a type expression: Did you mean `tuple[()]`?
-generics_typevartuple_specialization.py:92:28: error[invalid-type-arguments] Too many type arguments: expected 0, got 2
-generics_typevartuple_specialization.py:92:56: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
-generics_typevartuple_specialization.py:93:5: error[type-assertion-failure] Type `tuple[str, int]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
-generics_typevartuple_specialization.py:94:5: error[type-assertion-failure] Type `tuple[int | float]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
+generics_typevartuple_specialization.py:92:14: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:92:42: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:93:5: error[type-assertion-failure] Type `tuple[str, int]` does not match asserted type `Unknown`
+generics_typevartuple_specialization.py:94:5: error[type-assertion-failure] Type `tuple[int | float]` does not match asserted type `Unknown`
 generics_typevartuple_specialization.py:95:5: error[type-assertion-failure] Type `tuple[Any, *tuple[Any, ...]]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
-generics_typevartuple_specialization.py:102:32: error[invalid-type-arguments] Too many type arguments: expected 0, got 2
-generics_typevartuple_specialization.py:103:33: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
-generics_typevartuple_specialization.py:127:9: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
-generics_typevartuple_specialization.py:130:18: error[invalid-type-arguments] Too many type arguments: expected 0, got 3
+generics_typevartuple_specialization.py:102:20: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:103:21: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:127:5: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:130:14: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
 generics_typevartuple_specialization.py:130:35: error[invalid-return-type] Function always implicitly returns `None`, which is not assignable to return type `tuple[tuple[@Todo(PEP 646), ...], T1@func7, T2@func7]`
-generics_typevartuple_specialization.py:134:18: error[invalid-type-arguments] Too many type arguments: expected 0, got 2
-generics_typevartuple_specialization.py:134:37: error[invalid-type-arguments] Too many type arguments: expected 0, got 3
-generics_typevartuple_specialization.py:134:63: error[invalid-type-arguments] Too many type arguments: expected 0, got 4
+generics_typevartuple_specialization.py:134:14: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:134:33: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:134:59: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
 generics_typevartuple_specialization.py:135:5: error[type-assertion-failure] Type `tuple[tuple[()], str, bool]` does not match asserted type `tuple[tuple[@Todo(PEP 646), ...], Unknown, Unknown]`
 generics_typevartuple_specialization.py:136:5: error[type-assertion-failure] Type `tuple[tuple[str], bool, int | float]` does not match asserted type `tuple[tuple[@Todo(PEP 646), ...], Unknown, Unknown]`
 generics_typevartuple_specialization.py:137:5: error[type-assertion-failure] Type `tuple[tuple[str, bool], int | float, int]` does not match asserted type `tuple[tuple[@Todo(PEP 646), ...], Unknown, Unknown]`
-generics_typevartuple_specialization.py:143:18: error[invalid-type-arguments] Too many type arguments: expected 0, got 4
+generics_typevartuple_specialization.py:143:14: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
 generics_typevartuple_specialization.py:143:39: error[invalid-return-type] Function always implicitly returns `None`, which is not assignable to return type `tuple[tuple[@Todo(PEP 646), ...], T1@func9, T2@func9, T3@func9]`
-generics_typevartuple_specialization.py:147:19: error[invalid-type-arguments] Too many type arguments: expected 0, got 3
-generics_typevartuple_specialization.py:147:45: error[invalid-type-arguments] Too many type arguments: expected 0, got 4
+generics_typevartuple_specialization.py:147:15: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:147:41: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
 generics_typevartuple_specialization.py:148:5: error[type-assertion-failure] Type `tuple[tuple[()], str, bool, int | float]` does not match asserted type `tuple[tuple[@Todo(PEP 646), ...], Unknown, Unknown, Unknown]`
 generics_typevartuple_specialization.py:149:5: error[type-assertion-failure] Type `tuple[tuple[bool], str, int | float, int]` does not match asserted type `tuple[tuple[@Todo(PEP 646), ...], Unknown, Unknown, Unknown]`
-generics_typevartuple_specialization.py:153:12: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
-generics_typevartuple_specialization.py:156:28: error[invalid-type-arguments] Too many type arguments: expected 0, got 2
-generics_typevartuple_specialization.py:156:59: error[invalid-type-arguments] Too many type arguments: expected 0, got 2
-generics_typevartuple_specialization.py:157:5: error[type-assertion-failure] Type `tuple[*tuple[int, ...], int]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
-generics_typevartuple_specialization.py:158:5: error[type-assertion-failure] Type `tuple[*tuple[int, ...], str]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
-generics_typevartuple_specialization.py:159:5: error[type-assertion-failure] Type `tuple[*tuple[int, ...], str]` does not match asserted type `tuple[@Todo(PEP 646), ...]`
-generics_typevartuple_specialization.py:163:13: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
+generics_typevartuple_specialization.py:153:8: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:156:24: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:156:55: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
+generics_typevartuple_specialization.py:157:5: error[type-assertion-failure] Type `tuple[*tuple[int, ...], int]` does not match asserted type `Unknown`
+generics_typevartuple_specialization.py:158:5: error[type-assertion-failure] Type `tuple[*tuple[int, ...], str]` does not match asserted type `Unknown`
+generics_typevartuple_specialization.py:159:5: error[type-assertion-failure] Type `tuple[*tuple[int, ...], str]` does not match asserted type `Unknown`
+generics_typevartuple_specialization.py:163:8: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[@Todo(PEP 646), ...]'>` is already specialized
 generics_upper_bound.py:37:1: error[type-assertion-failure] Type `list[int]` does not match asserted type `list[Unknown | int]`
 generics_upper_bound.py:38:1: error[type-assertion-failure] Type `set[int]` does not match asserted type `set[Unknown | int]`
 generics_upper_bound.py:43:1: error[type-assertion-failure] Type `list[int] | set[int]` does not match asserted type `list[Unknown | int] | set[Unknown | int]`
@@ -1025,4 +1026,4 @@
 typeddicts_usage.py:28:17: error[missing-typed-dict-key] Missing required key 'name' in TypedDict `Movie` constructor
 typeddicts_usage.py:28:18: error[invalid-key] Unknown key "title" for TypedDict `Movie`: Unknown key "title"
 typeddicts_usage.py:40:24: error[invalid-type-form] The special form `typing.TypedDict` is not allowed in type expressions
-Found 1027 diagnostics
+Found 1028 diagnostics

@AlexWaygood AlexWaygood added the ty Multi-file analysis & type inference label Dec 8, 2025
@astral-sh-bot
Copy link

astral-sh-bot bot commented Dec 8, 2025

mypy_primer results

Changes were detected when running on open source projects
mypy (https://github.com/python/mypy)
- mypy/typeshed/stdlib/inspect.pyi:192:73: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- mypy/typeshed/stdlib/inspect.pyi:200:84: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
+ mypy/typeshed/stdlib/inspect.pyi:192:43: error[non-subscriptable] Cannot subscript non-generic type
+ mypy/typeshed/stdlib/inspect.pyi:200:54: error[non-subscriptable] Cannot subscript non-generic type

koda-validate (https://github.com/keithasaurus/koda-validate)
- koda_validate/dictionary.py:294:34: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:309:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:310:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:326:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:327:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:328:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:344:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:345:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:346:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:347:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:363:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:364:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:365:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:366:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:367:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:383:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:384:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:385:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:386:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:387:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:388:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:404:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:405:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:406:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:407:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:408:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:409:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:410:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:426:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:427:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:428:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:429:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:430:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:431:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:432:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:433:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:449:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:450:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:451:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:452:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:453:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:454:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:455:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:456:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:457:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:473:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:474:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:475:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:476:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:477:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:478:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:479:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:480:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:481:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:482:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:498:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:499:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:500:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:501:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:502:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:503:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:504:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:505:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:506:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:507:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:508:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:524:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:525:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:526:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:527:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:528:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:529:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:530:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:531:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:532:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:533:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:534:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:535:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:551:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:552:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:553:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:554:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:555:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:556:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:557:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:558:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:559:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:560:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:561:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:562:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:563:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:581:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:582:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:583:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:584:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:585:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:586:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:587:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:588:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:589:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:590:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:591:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:592:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:593:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:594:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:612:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:613:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:614:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:615:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:616:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:617:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:618:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:619:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:620:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:621:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:622:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:623:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:624:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:625:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:626:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:644:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:645:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:646:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:647:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:648:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:649:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:650:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:651:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:652:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:653:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:654:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:655:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:656:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:657:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:658:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:659:26: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:695:32: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:696:32: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:696:50: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:697:32: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:697:50: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:697:68: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:698:32: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:698:50: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:698:68: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:698:86: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:700:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:701:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:702:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:703:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:704:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:707:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:708:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:709:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:710:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:711:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:712:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:715:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:716:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:717:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:718:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:719:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:720:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:721:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:724:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:725:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:726:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:727:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:728:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:729:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:730:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:731:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:734:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:735:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:736:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:737:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:738:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:739:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:740:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:741:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:742:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:745:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:746:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:747:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:748:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:749:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:750:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:751:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:752:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:753:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:754:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:757:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:758:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:759:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:760:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:761:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:762:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:763:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:764:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:765:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:766:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:767:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:770:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:771:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:772:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:773:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:774:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:775:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:776:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:777:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:778:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:779:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:780:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:781:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:784:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:785:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:786:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:787:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:788:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:789:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:790:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:791:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:792:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:793:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:794:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:795:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:796:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:799:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:800:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:801:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:802:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:803:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:804:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:805:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:806:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:807:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:808:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:809:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:810:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:811:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:812:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:815:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:816:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:817:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:818:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:819:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:820:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:821:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:822:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:823:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:824:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:825:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:826:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:827:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:828:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:829:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:832:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:833:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:834:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:835:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:836:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:837:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:838:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:839:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:840:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:841:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:842:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:843:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:844:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:845:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:846:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:847:30: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
- koda_validate/dictionary.py:858:39: error[invalid-type-arguments] Too many type arguments: expected 0, got 1
+ koda_validate/dictionary.py:294:21: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:309:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:310:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:326:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:327:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:328:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:344:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:345:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:346:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:347:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:363:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:364:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:365:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:366:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:367:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:383:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:384:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:385:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:386:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:387:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:388:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:404:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:405:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:406:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:407:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:408:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:409:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:410:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:426:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:427:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:428:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:429:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:430:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:431:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:432:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:433:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:449:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:450:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:451:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:452:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:453:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:454:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:455:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:456:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:457:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:473:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:474:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:475:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:476:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:477:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:478:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:479:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:480:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:481:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:482:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:498:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:499:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:500:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:501:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:502:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:503:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:504:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:505:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:506:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:507:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:508:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:524:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:525:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:526:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:527:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:528:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:529:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:530:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:531:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:532:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:533:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:534:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:535:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:551:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:552:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:553:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:554:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:555:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:556:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:557:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:558:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:559:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:560:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:561:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:562:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:563:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:581:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:582:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:583:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:584:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:585:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:586:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:587:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:588:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:589:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:590:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:591:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:592:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:593:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:594:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:612:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:613:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:614:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator[A@KeyValidator]]'>` is already specialized
+ koda_validate/dictionary.py:615:13: error[non-subscriptable] Cannot subscript non-generic type: `<class 'tuple[Hashable, Validator

... (truncated 602 lines) ...

No memory usage changes detected ✅


# error: [invalid-type-arguments] "Type `int` is not assignable to upper bound `str` of type variable `U@TupleOfIntAndStr`"
def _(x: TupleOfIntAndStr[int, int]):
reveal_type(x) # revealed: tuple[int, Unknown]
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This behavior is consistent with pyright.
mypy and pyrefly do not replace even the failed parts with Unknown, which is not a good idea.

@mtshiba
Copy link
Contributor Author

mtshiba commented Dec 8, 2025

The type conformance test results are good: the error messages are mostly as written in the scripts (except for TypeVarTuple).

@astral-sh-bot
Copy link

astral-sh-bot bot commented Dec 8, 2025

ecosystem-analyzer results

Lint rule Added Removed Changed
invalid-type-arguments 0 460 2
non-subscriptable 460 0 0
unresolved-attribute 0 0 7
invalid-argument-type 0 2 0
type-assertion-failure 2 0 0
unused-ignore-comment 2 0 0
Total 464 462 9

@mtshiba mtshiba marked this pull request as ready for review December 8, 2025 08:38
@AlexWaygood
Copy link
Member

I find some of the error messages on this branch a bit confusing. For example:

class Foo[T]:
    x: T

# error[non-subscriptable] "Cannot subscript non-generic type alias: `<class 'Foo[int]'>` is already specialized"
f = Foo[int][str]()

But I never created a type alias there!

Copy link
Contributor

@carljm carljm left a comment

Choose a reason for hiding this comment

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

This looks excellent, thank you!

I only have minor nits about the diagnostic messages.

Comment on lines +11885 to +11889
Some(
ExplicitSpecializationError::UnsatisfiedBound
| ExplicitSpecializationError::UnsatisfiedConstraints
| ExplicitSpecializationError::InvalidParamSpec,
)
Copy link
Contributor

Choose a reason for hiding this comment

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

This behavior change fits well with a TODO I recently added to consider lazily checking explicit specializations against bounds/constraints, instead of checking it eagerly. (If we are going to return the requested specialization here even if it violates bounds/constraints, then there is no need to eagerly evaluate the bounds/constraints at all.) This would help us avoid some cycle problems.

Comment on lines 12075 to 12084
if value_type.is_generic_nominal_instance() {
builder.into_diagnostic(format_args!(
"Cannot subscript non-generic type alias: `{}` is already specialized",
value_type.display(db),
));
} else {
builder.into_diagnostic(format_args!(
"Cannot subscript non-generic type alias"
));
}
Copy link
Contributor

Choose a reason for hiding this comment

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

As Alex points out in separate comment, is_generic_nominal_instance is awkwardly specific -- probably too specific.

Would there be any harm in just always providing the actual type we failed to specialize? Why not simplify to

Suggested change
if value_type.is_generic_nominal_instance() {
builder.into_diagnostic(format_args!(
"Cannot subscript non-generic type alias: `{}` is already specialized",
value_type.display(db),
));
} else {
builder.into_diagnostic(format_args!(
"Cannot subscript non-generic type alias"
));
}
builder.into_diagnostic(format_args!(
"Cannot subscript non-generic type `{}`",
value_type.display(db),
));

Copy link
Contributor Author

@mtshiba mtshiba Dec 10, 2025

Choose a reason for hiding this comment

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

Consider the case where the user has a type alias type MyList = list[int] and accidentally specifies MyList[int].
The user will see an error "Cannot subscript non-generic type list[int]", which is likely to be confusing. If the user mistakenly thought MyList was a generic type and wanted list[int] as the result of specialization, the user might not immediately realize what the problem is. In fact, pyright gives a hint in this case: "list[int] is already specialized".

https://pyright-play.net/?pythonVersion=3.12&code=C4TwDgpgBAsiCSA7YUC8UCWyCwAoPAJhAGZQD6AFBgFywLIDaWwAugJTV5TdQBOEANwgBDADZlQkKmzx5J0OABkMAZxTpRq4E2QtZuIqUqjaSrTtYcuPfkLETwECqJm4gA

Also, the error message should be mostly the same whether the type alias is defined implicitly or using PEP 695 syntax.

{
if value_ty.is_generic_alias() {
builder.into_diagnostic(format_args!(
"Cannot subscript non-generic type alias: `{}` is already specialized",
Copy link
Contributor

Choose a reason for hiding this comment

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

Similar to below, I'm not really clear why we should only provide value_ty in the diagnostic in certain limited cases. Why not simplify this code and just always provide it, with a message like "Cannot subscript non-generic type {}"? To me that seems clear enough in all cases.

Comment on lines 952 to 961
if value_type.is_generic_nominal_instance() {
builder.into_diagnostic(format_args!(
"Cannot subscript non-generic type alias: `{}` is already specialized",
value_type.display(self.db()),
));
} else {
builder.into_diagnostic(format_args!(
"Cannot subscript non-generic type alias"
));
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Similar comment as below

@mtshiba mtshiba force-pushed the specialize-non-generic branch from 1759af3 to 41e30cc Compare December 10, 2025 10:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ecosystem-analyzer ty Multi-file analysis & type inference

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants