Skip to content

Commit ca2a7db

Browse files
authored
Allow more precise inference for TypeVarTuple (#2237)
1 parent bdd601c commit ca2a7db

File tree

6 files changed

+31
-30
lines changed

6 files changed

+31
-30
lines changed

conformance/results/mypy/generics_typevartuple_basic.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ generics_typevartuple_basic.py:59: error: TypeVarTuple "Shape" is only valid wit
1313
generics_typevartuple_basic.py:65: error: Unexpected keyword argument "covariant" for "TypeVarTuple" [misc]
1414
generics_typevartuple_basic.py:66: error: Too many positional arguments for "TypeVarTuple" [misc]
1515
generics_typevartuple_basic.py:67: error: Unexpected keyword argument "bound" for "TypeVarTuple" [misc]
16-
generics_typevartuple_basic.py:99: error: Cannot infer value of type parameter "Shape" of "multiply" [misc]
1716
generics_typevartuple_basic.py:100: error: Cannot infer value of type parameter "Shape" of "multiply" [misc]
18-
generics_typevartuple_basic.py:106: error: Can only use one type var tuple in a class def [misc]
17+
generics_typevartuple_basic.py:101: error: Cannot infer value of type parameter "Shape" of "multiply" [misc]
18+
generics_typevartuple_basic.py:107: error: Can only use one type var tuple in a class def [misc]
1919
"""
2020
conformance_automated = "Fail"
2121
errors_diff = """
22-
Line 90: Expected 1 errors
22+
Line 91: Expected 1 errors
2323
"""

conformance/results/pyrefly/generics_typevartuple_basic.toml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ TypeVarTuple is pinned too early when calling generic function.
44
"""
55
conformance_automated = "Fail"
66
errors_diff = """
7-
Line 85: Unexpected errors ['Argument `tuple[float]` is not assignable to parameter `arg2` with type `tuple[int]` in function `func2` [bad-argument-type]']
8-
Line 89: Unexpected errors ["Argument `tuple[Literal['0']]` is not assignable to parameter `arg2` with type `tuple[int]` in function `func2` [bad-argument-type]"]
7+
Line 86: Unexpected errors ['Argument `tuple[float]` is not assignable to parameter `arg2` with type `tuple[int]` in function `func2` [bad-argument-type]']
8+
Line 90: Unexpected errors ["Argument `tuple[Literal['0']]` is not assignable to parameter `arg2` with type `tuple[int]` in function `func2` [bad-argument-type]"]
99
"""
1010
output = """
1111
ERROR generics_typevartuple_basic.py:42:34-43: Argument `Height` is not assignable to parameter `shape` with type `tuple[Height, Width]` in function `Array.__init__` [bad-argument-type]
@@ -18,10 +18,10 @@ ERROR generics_typevartuple_basic.py:59:24-29: `TypeVarTuple` must be unpacked [
1818
ERROR generics_typevartuple_basic.py:65:27-41: Unexpected keyword argument `covariant` to TypeVarTuple [invalid-type-var-tuple]
1919
ERROR generics_typevartuple_basic.py:66:27-30: Unexpected positional argument to TypeVarTuple [invalid-type-var-tuple]
2020
ERROR generics_typevartuple_basic.py:67:27-36: Unexpected keyword argument `bound` to TypeVarTuple [invalid-type-var-tuple]
21-
ERROR generics_typevartuple_basic.py:85:13-19: Argument `tuple[float]` is not assignable to parameter `arg2` with type `tuple[int]` in function `func2` [bad-argument-type]
22-
ERROR generics_typevartuple_basic.py:89:13-19: Argument `tuple[Literal['0']]` is not assignable to parameter `arg2` with type `tuple[int]` in function `func2` [bad-argument-type]
23-
ERROR generics_typevartuple_basic.py:90:15-19: Argument `tuple[Literal[0]]` is not assignable to parameter `arg2` with type `tuple[int, int]` in function `func2` [bad-argument-type]
24-
ERROR generics_typevartuple_basic.py:99:17-18: Argument `Array[Width]` is not assignable to parameter `y` with type `Array[Height]` in function `multiply` [bad-argument-type]
25-
ERROR generics_typevartuple_basic.py:100:17-18: Argument `Array[Height, Width]` is not assignable to parameter `y` with type `Array[Height]` in function `multiply` [bad-argument-type]
26-
ERROR generics_typevartuple_basic.py:106:7-13: Type parameters for class may not have more than one TypeVarTuple [invalid-type-var-tuple]
21+
ERROR generics_typevartuple_basic.py:86:13-19: Argument `tuple[float]` is not assignable to parameter `arg2` with type `tuple[int]` in function `func2` [bad-argument-type]
22+
ERROR generics_typevartuple_basic.py:90:13-19: Argument `tuple[Literal['0']]` is not assignable to parameter `arg2` with type `tuple[int]` in function `func2` [bad-argument-type]
23+
ERROR generics_typevartuple_basic.py:91:15-19: Argument `tuple[Literal[0]]` is not assignable to parameter `arg2` with type `tuple[int, int]` in function `func2` [bad-argument-type]
24+
ERROR generics_typevartuple_basic.py:100:17-18: Argument `Array[Width]` is not assignable to parameter `y` with type `Array[Height]` in function `multiply` [bad-argument-type]
25+
ERROR generics_typevartuple_basic.py:101:17-18: Argument `Array[Height, Width]` is not assignable to parameter `y` with type `Array[Height]` in function `multiply` [bad-argument-type]
26+
ERROR generics_typevartuple_basic.py:107:7-13: Type parameters for class may not have more than one TypeVarTuple [invalid-type-var-tuple]
2727
"""

conformance/results/pyright/generics_typevartuple_basic.toml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Does not correctly solve TypeVarTuple with heterogeneous bounds.
44
"""
55
conformance_automated = "Fail"
66
errors_diff = """
7-
Line 89: Unexpected errors ['generics_typevartuple_basic.py:89:14 - error: Argument of type "tuple[Literal[\\'0\\']]" cannot be assigned to parameter "arg2" of type "tuple[*Ts@func2]" in function "func2"']
7+
Line 90: Unexpected errors ['generics_typevartuple_basic.py:90:14 - error: Argument of type "tuple[Literal[\\'0\\']]" cannot be assigned to parameter "arg2" of type "tuple[*Ts@func2]" in function "func2"']
88
"""
99
output = """
1010
generics_typevartuple_basic.py:42:34 - error: Argument of type "Height" cannot be assigned to parameter "shape" of type "tuple[*Shape@Array]" in function "__init__"
@@ -23,17 +23,17 @@ generics_typevartuple_basic.py:65:27 - error: "covariant" is unknown parameter t
2323
generics_typevartuple_basic.py:66:27 - error: TypeVarTuple cannot have value constraints (reportGeneralTypeIssues)
2424
generics_typevartuple_basic.py:66:32 - error: TypeVarTuple cannot have value constraints (reportGeneralTypeIssues)
2525
generics_typevartuple_basic.py:67:27 - error: "bound" is unknown parameter to TypeVarTuple (reportGeneralTypeIssues)
26-
generics_typevartuple_basic.py:89:14 - error: Argument of type "tuple[Literal['0']]" cannot be assigned to parameter "arg2" of type "tuple[*Ts@func2]" in function "func2"
26+
generics_typevartuple_basic.py:90:14 - error: Argument of type "tuple[Literal['0']]" cannot be assigned to parameter "arg2" of type "tuple[*Ts@func2]" in function "func2"
2727
  "Literal['0']" is not assignable to "int" (reportArgumentType)
28-
generics_typevartuple_basic.py:90:15 - error: Argument of type "tuple[Literal[0]]" cannot be assigned to parameter "arg2" of type "tuple[*Ts@func2]" in function "func2"
28+
generics_typevartuple_basic.py:91:15 - error: Argument of type "tuple[Literal[0]]" cannot be assigned to parameter "arg2" of type "tuple[*Ts@func2]" in function "func2"
2929
  "tuple[Literal[0]]" is not assignable to "tuple[int, int]"
3030
    Tuple size mismatch; expected 2 but received 1 (reportArgumentType)
31-
generics_typevartuple_basic.py:99:17 - error: Argument of type "Array[Width]" cannot be assigned to parameter "y" of type "Array[*Shape@multiply]" in function "multiply"
31+
generics_typevartuple_basic.py:100:17 - error: Argument of type "Array[Width]" cannot be assigned to parameter "y" of type "Array[*Shape@multiply]" in function "multiply"
3232
  "Array[Width]" is not assignable to "Array[Height]"
3333
    Type parameter "Shape@Array" is invariant, but "*tuple[Width]" is not the same as "*tuple[Height]" (reportArgumentType)
34-
generics_typevartuple_basic.py:100:17 - error: Argument of type "Array[Height, Width]" cannot be assigned to parameter "y" of type "Array[*Shape@multiply]" in function "multiply"
34+
generics_typevartuple_basic.py:101:17 - error: Argument of type "Array[Height, Width]" cannot be assigned to parameter "y" of type "Array[*Shape@multiply]" in function "multiply"
3535
  "Array[Height, Width]" is not assignable to "Array[Height]"
3636
    Type parameter "Shape@Array" is invariant, but "*tuple[Height, Width]" is not the same as "*tuple[Height]" (reportArgumentType)
37-
generics_typevartuple_basic.py:106:14 - error: Generic class can have at most one TypeVarTuple type parameter but received multiple ("Ts1", "Ts2") (reportGeneralTypeIssues)
38-
generics_typevartuple_basic.py:106:29 - error: Type argument list can have at most one unpacked TypeVarTuple or tuple (reportInvalidTypeForm)
37+
generics_typevartuple_basic.py:107:14 - error: Generic class can have at most one TypeVarTuple type parameter but received multiple ("Ts1", "Ts2") (reportGeneralTypeIssues)
38+
generics_typevartuple_basic.py:107:29 - error: Type argument list can have at most one unpacked TypeVarTuple or tuple (reportInvalidTypeForm)
3939
"""

conformance/results/ty/generics_typevartuple_basic.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@ Line 43: Expected 1 errors
55
Line 53: Expected 1 errors
66
Line 56: Expected 1 errors
77
Line 59: Expected 1 errors
8-
Line 90: Expected 1 errors
9-
Line 99: Expected 1 errors
8+
Line 91: Expected 1 errors
109
Line 100: Expected 1 errors
11-
Line 106: Expected 1 errors
10+
Line 101: Expected 1 errors
11+
Line 107: Expected 1 errors
1212
Lines 44, 45: Expected error (tag 'v6')
13-
Line 84: Unexpected errors ['generics_typevartuple_basic.py:84:1: error[type-assertion-failure] Type `tuple[@Todo(TypeVarTuple), ...]` does not match asserted type `tuple[int]`']
13+
Line 85: Unexpected errors ['generics_typevartuple_basic.py:85:5: error[type-assertion-failure] Type `tuple[@Todo(TypeVarTuple), ...]` does not match asserted type `tuple[int]`']
1414
"""
1515
output = """
1616
generics_typevartuple_basic.py:42:34: error[invalid-argument-type] Argument to bound method `__init__` is incorrect: Expected `tuple[@Todo(TypeVarTuple), ...]`, found `Height`
1717
generics_typevartuple_basic.py:52:14: error[invalid-generic-class] `TypeVarTuple` must be unpacked with `*` or `Unpack[]` when used as an argument to `Generic`
1818
generics_typevartuple_basic.py:65:27: error[unknown-argument] Argument `covariant` does not match any known parameter of function `__new__`
1919
generics_typevartuple_basic.py:66:27: error[too-many-positional-arguments] Too many positional arguments to function `__new__`: expected 2, got 4
2020
generics_typevartuple_basic.py:67:27: error[unknown-argument] Argument `bound` does not match any known parameter of function `__new__`
21-
generics_typevartuple_basic.py:84:1: error[type-assertion-failure] Type `tuple[@Todo(TypeVarTuple), ...]` does not match asserted type `tuple[int]`
21+
generics_typevartuple_basic.py:85:5: error[type-assertion-failure] Type `tuple[@Todo(TypeVarTuple), ...]` does not match asserted type `tuple[int]`
2222
"""

conformance/results/zuban/generics_typevartuple_basic.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Does not correctly solve TypeVarTuple with heterogeneous bounds.
44
"""
55
conformance_automated = "Fail"
66
errors_diff = """
7-
Line 89: Unexpected errors ['generics_typevartuple_basic.py:89: error: Argument 2 to "func2" has incompatible type "tuple[Literal[\\'0\\']]"; expected "tuple[int]" [arg-type]']
7+
Line 90: Unexpected errors ['generics_typevartuple_basic.py:90: error: Argument 2 to "func2" has incompatible type "tuple[Literal[\\'0\\']]"; expected "tuple[int]" [arg-type]']
88
"""
99
output = """
1010
generics_typevartuple_basic.py:42: error: Argument 1 to "Array" has incompatible type "Height"; expected "tuple[Height, Width]" [arg-type]
@@ -17,9 +17,9 @@ generics_typevartuple_basic.py:59: error: TypeVarTuple "Shape" is only valid wit
1717
generics_typevartuple_basic.py:65: error: Unexpected keyword argument "covariant" for "TypeVarTuple" [call-arg]
1818
generics_typevartuple_basic.py:66: error: Too many positional arguments for "TypeVarTuple" [call-arg]
1919
generics_typevartuple_basic.py:67: error: Unexpected keyword argument "bound" for "TypeVarTuple" [call-arg]
20-
generics_typevartuple_basic.py:89: error: Argument 2 to "func2" has incompatible type "tuple[Literal['0']]"; expected "tuple[int]" [arg-type]
21-
generics_typevartuple_basic.py:90: error: Argument 2 to "func2" has incompatible type "tuple[Literal[0]]"; expected "tuple[int, int]" [arg-type]
22-
generics_typevartuple_basic.py:99: error: Argument 2 to "multiply" has incompatible type "Array[Width]"; expected "Array[Height]" [arg-type]
23-
generics_typevartuple_basic.py:100: error: Argument 2 to "multiply" has incompatible type "Array[Height, Width]"; expected "Array[Height]" [arg-type]
24-
generics_typevartuple_basic.py:106: error: Can only use one type var tuple in a class def [misc]
20+
generics_typevartuple_basic.py:90: error: Argument 2 to "func2" has incompatible type "tuple[Literal['0']]"; expected "tuple[int]" [arg-type]
21+
generics_typevartuple_basic.py:91: error: Argument 2 to "func2" has incompatible type "tuple[Literal[0]]"; expected "tuple[int, int]" [arg-type]
22+
generics_typevartuple_basic.py:100: error: Argument 2 to "multiply" has incompatible type "Array[Width]"; expected "Array[Height]" [arg-type]
23+
generics_typevartuple_basic.py:101: error: Argument 2 to "multiply" has incompatible type "Array[Height, Width]"; expected "Array[Height]" [arg-type]
24+
generics_typevartuple_basic.py:107: error: Can only use one type var tuple in a class def [misc]
2525
"""

conformance/tests/generics_typevartuple_basic.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ def func2(arg1: tuple[*Ts], arg2: tuple[*Ts]) -> tuple[*Ts]:
8181
# > the types must match exactly (the list of type parameters must be the
8282
# > same length, and the type parameters themselves must be identical)
8383

84-
assert_type(func2((0,), (1,)), tuple[int]) # OK
84+
def check_func2(x: int):
85+
assert_type(func2((x,), (1,)), tuple[int]) # OK
8586
func2((0,), (0.0,)) # OK
8687
func2((0.0,), (0,)) # OK
8788
func2((0,), (1,)) # OK

0 commit comments

Comments
 (0)