diff --git a/conformance/results/mypy/generics_paramspec_variance.toml b/conformance/results/mypy/generics_paramspec_variance.toml new file mode 100644 index 000000000..78a4e2880 --- /dev/null +++ b/conformance/results/mypy/generics_paramspec_variance.toml @@ -0,0 +1,22 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 24: Expected 1 errors +Line 31: Expected 1 errors +Line 47: Expected 1 errors +Line 23: Unexpected errors ['generics_paramspec_variance.py:23: error: Incompatible types in assignment (expression has type "CovariantParamSpec[[int]]", variable has type "CovariantParamSpec[[object]]") [assignment]'] +Line 26: Unexpected errors ['generics_paramspec_variance.py:26: error: The variance and bound arguments to ParamSpec do not have defined semantics yet [misc]'] +Line 30: Unexpected errors ['generics_paramspec_variance.py:30: error: Missing return statement [empty-body]'] +Line 37: Unexpected errors ['generics_paramspec_variance.py:37: error: The variance and bound arguments to ParamSpec do not have defined semantics yet [misc]'] +Line 46: Unexpected errors ['generics_paramspec_variance.py:46: error: Incompatible types in assignment (expression has type "CovariantParamSpecOld[[int]]", variable has type "CovariantParamSpecOld[[object]]") [assignment]'] +""" +output = """ +generics_paramspec_variance.py:15: error: Incompatible types in assignment (expression has type "ContravariantParamSpec[[int]]", variable has type "ContravariantParamSpec[[object]]") [assignment] +generics_paramspec_variance.py:23: error: Incompatible types in assignment (expression has type "CovariantParamSpec[[int]]", variable has type "CovariantParamSpec[[object]]") [assignment] +generics_paramspec_variance.py:26: error: The variance and bound arguments to ParamSpec do not have defined semantics yet [misc] +generics_paramspec_variance.py:30: error: Missing return statement [empty-body] +generics_paramspec_variance.py:35: error: Incompatible types in assignment (expression has type "ContravariantParamSpecOld[[int]]", variable has type "ContravariantParamSpecOld[[object]]") [assignment] +generics_paramspec_variance.py:37: error: The variance and bound arguments to ParamSpec do not have defined semantics yet [misc] +generics_paramspec_variance.py:41: error: Missing return statement [empty-body] +generics_paramspec_variance.py:46: error: Incompatible types in assignment (expression has type "CovariantParamSpecOld[[int]]", variable has type "CovariantParamSpecOld[[object]]") [assignment] +""" diff --git a/conformance/results/mypy/generics_typevartuple_variance.toml b/conformance/results/mypy/generics_typevartuple_variance.toml new file mode 100644 index 000000000..545bf7abc --- /dev/null +++ b/conformance/results/mypy/generics_typevartuple_variance.toml @@ -0,0 +1,22 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 24: Expected 1 errors +Line 35: Expected 1 errors +Line 41: Expected 1 errors +Line 23: Unexpected errors ['generics_typevartuple_variance.py:23: error: Incompatible types in assignment (expression has type "CovariantTypeVarTuple[[int]]", variable has type "CovariantTypeVarTuple[[object]]") [assignment]'] +Line 26: Unexpected errors ['generics_typevartuple_variance.py:26: error: Unexpected keyword argument "contravariant" for "TypeVarTuple" [misc]'] +Line 34: Unexpected errors ['generics_typevartuple_variance.py:34: error: Incompatible types in assignment (expression has type "ContravariantTypeVarTupleOld[object]", variable has type "ContravariantTypeVarTupleOld[int]") [assignment]'] +Line 37: Unexpected errors ['generics_typevartuple_variance.py:37: error: Unexpected keyword argument "covariant" for "TypeVarTuple" [misc]'] +Line 42: Unexpected errors ['generics_typevartuple_variance.py:42: error: Missing return statement [empty-body]'] +""" +output = """ +generics_typevartuple_variance.py:15: error: Incompatible types in assignment (expression has type "ContravariantTypeVarTuple[[int]]", variable has type "ContravariantTypeVarTuple[[object]]") [assignment] +generics_typevartuple_variance.py:23: error: Incompatible types in assignment (expression has type "CovariantTypeVarTuple[[int]]", variable has type "CovariantTypeVarTuple[[object]]") [assignment] +generics_typevartuple_variance.py:26: error: Unexpected keyword argument "contravariant" for "TypeVarTuple" [misc] +generics_typevartuple_variance.py:31: error: Missing return statement [empty-body] +generics_typevartuple_variance.py:34: error: Incompatible types in assignment (expression has type "ContravariantTypeVarTupleOld[object]", variable has type "ContravariantTypeVarTupleOld[int]") [assignment] +generics_typevartuple_variance.py:37: error: Unexpected keyword argument "covariant" for "TypeVarTuple" [misc] +generics_typevartuple_variance.py:42: error: Missing return statement [empty-body] +generics_typevartuple_variance.py:47: error: Incompatible types in assignment (expression has type "CovariantTypeVarTupleOld[object]", variable has type "CovariantTypeVarTupleOld[int]") [assignment] +""" diff --git a/conformance/results/pyrefly/generics_paramspec_variance.toml b/conformance/results/pyrefly/generics_paramspec_variance.toml new file mode 100644 index 000000000..8fe747eae --- /dev/null +++ b/conformance/results/pyrefly/generics_paramspec_variance.toml @@ -0,0 +1,24 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 15: Expected 1 errors +Line 24: Expected 1 errors +Line 31: Expected 1 errors +Line 41: Expected 1 errors +Line 14: Unexpected errors ['`ContravariantParamSpec[[object]]` is not assignable to `ContravariantParamSpec[[int]]` [bad-assignment]'] +Line 23: Unexpected errors ['`CovariantParamSpec[[int]]` is not assignable to `CovariantParamSpec[[object]]` [bad-assignment]'] +Line 26: Unexpected errors ['Unexpected keyword argument `contravariant` to ParamSpec [invalid-param-spec]'] +Line 34: Unexpected errors ['`ContravariantParamSpecOld[[object]]` is not assignable to `ContravariantParamSpecOld[[int]]` [bad-assignment]'] +Line 37: Unexpected errors ['Unexpected keyword argument `covariant` to ParamSpec [invalid-param-spec]'] +Line 46: Unexpected errors ['`CovariantParamSpecOld[[int]]` is not assignable to `CovariantParamSpecOld[[object]]` [bad-assignment]'] +""" +output = """ +ERROR generics_paramspec_variance.py:14:39-45: `ContravariantParamSpec[[object]]` is not assignable to `ContravariantParamSpec[[int]]` [bad-assignment] +ERROR generics_paramspec_variance.py:23:39-46: `CovariantParamSpec[[int]]` is not assignable to `CovariantParamSpec[[object]]` [bad-assignment] +ERROR generics_paramspec_variance.py:26:24-42: Unexpected keyword argument `contravariant` to ParamSpec [invalid-param-spec] +ERROR generics_paramspec_variance.py:34:46-56: `ContravariantParamSpecOld[[object]]` is not assignable to `ContravariantParamSpecOld[[int]]` [bad-assignment] +ERROR generics_paramspec_variance.py:35:14-24: `ContravariantParamSpecOld[[int]]` is not assignable to variable `in_obj_old` with type `ContravariantParamSpecOld[[object]]` [bad-assignment] +ERROR generics_paramspec_variance.py:37:26-40: Unexpected keyword argument `covariant` to ParamSpec [invalid-param-spec] +ERROR generics_paramspec_variance.py:46:46-57: `CovariantParamSpecOld[[int]]` is not assignable to `CovariantParamSpecOld[[object]]` [bad-assignment] +ERROR generics_paramspec_variance.py:47:15-26: `CovariantParamSpecOld[[object]]` is not assignable to variable `out_int_old` with type `CovariantParamSpecOld[[int]]` [bad-assignment] +""" diff --git a/conformance/results/pyrefly/generics_typevartuple_variance.toml b/conformance/results/pyrefly/generics_typevartuple_variance.toml new file mode 100644 index 000000000..d491d0b0b --- /dev/null +++ b/conformance/results/pyrefly/generics_typevartuple_variance.toml @@ -0,0 +1,24 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 15: Expected 1 errors +Line 24: Expected 1 errors +Line 31: Expected 1 errors +Line 41: Expected 1 errors +Line 14: Unexpected errors ['`ContravariantTypeVarTuple[[object]]` is not assignable to `ContravariantTypeVarTuple[[int]]` [bad-assignment]'] +Line 23: Unexpected errors ['`CovariantTypeVarTuple[[int]]` is not assignable to `CovariantTypeVarTuple[[object]]` [bad-assignment]'] +Line 26: Unexpected errors ['Unexpected keyword argument `contravariant` to TypeVarTuple [invalid-type-var-tuple]'] +Line 34: Unexpected errors ['`ContravariantTypeVarTupleOld[object]` is not assignable to `ContravariantTypeVarTupleOld[int]` [bad-assignment]'] +Line 37: Unexpected errors ['Unexpected keyword argument `covariant` to TypeVarTuple [invalid-type-var-tuple]'] +Line 46: Unexpected errors ['`CovariantTypeVarTupleOld[int]` is not assignable to `CovariantTypeVarTupleOld[object]` [bad-assignment]'] +""" +output = """ +ERROR generics_typevartuple_variance.py:14:42-48: `ContravariantTypeVarTuple[[object]]` is not assignable to `ContravariantTypeVarTuple[[int]]` [bad-assignment] +ERROR generics_typevartuple_variance.py:23:42-49: `CovariantTypeVarTuple[[int]]` is not assignable to `CovariantTypeVarTuple[[object]]` [bad-assignment] +ERROR generics_typevartuple_variance.py:26:29-47: Unexpected keyword argument `contravariant` to TypeVarTuple [invalid-type-var-tuple] +ERROR generics_typevartuple_variance.py:34:49-59: `ContravariantTypeVarTupleOld[object]` is not assignable to `ContravariantTypeVarTupleOld[int]` [bad-assignment] +ERROR generics_typevartuple_variance.py:35:14-24: `ContravariantTypeVarTupleOld[int]` is not assignable to variable `in_obj_old` with type `ContravariantTypeVarTupleOld[object]` [bad-assignment] +ERROR generics_typevartuple_variance.py:37:31-45: Unexpected keyword argument `covariant` to TypeVarTuple [invalid-type-var-tuple] +ERROR generics_typevartuple_variance.py:46:49-60: `CovariantTypeVarTupleOld[int]` is not assignable to `CovariantTypeVarTupleOld[object]` [bad-assignment] +ERROR generics_typevartuple_variance.py:47:15-26: `CovariantTypeVarTupleOld[object]` is not assignable to variable `out_int_old` with type `CovariantTypeVarTupleOld[int]` [bad-assignment] +""" diff --git a/conformance/results/pyright/generics_paramspec_variance.toml b/conformance/results/pyright/generics_paramspec_variance.toml new file mode 100644 index 000000000..b2abd1ce9 --- /dev/null +++ b/conformance/results/pyright/generics_paramspec_variance.toml @@ -0,0 +1,40 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 31: Expected 1 errors +Line 41: Expected 1 errors +Line 14: Unexpected errors ['generics_paramspec_variance.py:14:39 - error: Type "ContravariantParamSpec[(object)]" is not assignable to declared type "ContravariantParamSpec[(int)]"'] +Line 23: Unexpected errors ['generics_paramspec_variance.py:23:39 - error: Type "CovariantParamSpec[(int)]" is not assignable to declared type "CovariantParamSpec[(object)]"'] +Line 26: Unexpected errors ['generics_paramspec_variance.py:26:24 - error: "contravariant" is unknown parameter to ParamSpec (reportGeneralTypeIssues)'] +Line 34: Unexpected errors ['generics_paramspec_variance.py:34:46 - error: Type "ContravariantParamSpecOld[(object)]" is not assignable to declared type "ContravariantParamSpecOld[(int)]"'] +Line 37: Unexpected errors ['generics_paramspec_variance.py:37:26 - error: "covariant" is unknown parameter to ParamSpec (reportGeneralTypeIssues)'] +Line 46: Unexpected errors ['generics_paramspec_variance.py:46:46 - error: Type "CovariantParamSpecOld[(int)]" is not assignable to declared type "CovariantParamSpecOld[(object)]"'] +""" +output = """ +generics_paramspec_variance.py:14:39 - error: Type "ContravariantParamSpec[(object)]" is not assignable to declared type "ContravariantParamSpec[(int)]" +  "ContravariantParamSpec[(object)]" is not assignable to "ContravariantParamSpec[(int)]" +    Type parameter "InP@ContravariantParamSpec" is invariant, but "(object)" is not the same as "(int)" (reportAssignmentType) +generics_paramspec_variance.py:15:10 - error: Type "ContravariantParamSpec[(int)]" is not assignable to declared type "ContravariantParamSpec[(object)]" +  "ContravariantParamSpec[(int)]" is not assignable to "ContravariantParamSpec[(object)]" +    Type parameter "InP@ContravariantParamSpec" is invariant, but "(int)" is not the same as "(object)" (reportAssignmentType) +generics_paramspec_variance.py:23:39 - error: Type "CovariantParamSpec[(int)]" is not assignable to declared type "CovariantParamSpec[(object)]" +  "CovariantParamSpec[(int)]" is not assignable to "CovariantParamSpec[(object)]" +    Type parameter "OutP@CovariantParamSpec" is invariant, but "(int)" is not the same as "(object)" (reportAssignmentType) +generics_paramspec_variance.py:24:11 - error: Type "CovariantParamSpec[(object)]" is not assignable to declared type "CovariantParamSpec[(int)]" +  "CovariantParamSpec[(object)]" is not assignable to "CovariantParamSpec[(int)]" +    Type parameter "OutP@CovariantParamSpec" is invariant, but "(object)" is not the same as "(int)" (reportAssignmentType) +generics_paramspec_variance.py:26:24 - error: "contravariant" is unknown parameter to ParamSpec (reportGeneralTypeIssues) +generics_paramspec_variance.py:34:46 - error: Type "ContravariantParamSpecOld[(object)]" is not assignable to declared type "ContravariantParamSpecOld[(int)]" +  "ContravariantParamSpecOld[(object)]" is not assignable to "ContravariantParamSpecOld[(int)]" +    Type parameter "InP@ContravariantParamSpecOld" is invariant, but "(object)" is not the same as "(int)" (reportAssignmentType) +generics_paramspec_variance.py:35:14 - error: Type "ContravariantParamSpecOld[(int)]" is not assignable to declared type "ContravariantParamSpecOld[(object)]" +  "ContravariantParamSpecOld[(int)]" is not assignable to "ContravariantParamSpecOld[(object)]" +    Type parameter "InP@ContravariantParamSpecOld" is invariant, but "(int)" is not the same as "(object)" (reportAssignmentType) +generics_paramspec_variance.py:37:26 - error: "covariant" is unknown parameter to ParamSpec (reportGeneralTypeIssues) +generics_paramspec_variance.py:46:46 - error: Type "CovariantParamSpecOld[(int)]" is not assignable to declared type "CovariantParamSpecOld[(object)]" +  "CovariantParamSpecOld[(int)]" is not assignable to "CovariantParamSpecOld[(object)]" +    Type parameter "OutP@CovariantParamSpecOld" is invariant, but "(int)" is not the same as "(object)" (reportAssignmentType) +generics_paramspec_variance.py:47:15 - error: Type "CovariantParamSpecOld[(object)]" is not assignable to declared type "CovariantParamSpecOld[(int)]" +  "CovariantParamSpecOld[(object)]" is not assignable to "CovariantParamSpecOld[(int)]" +    Type parameter "OutP@CovariantParamSpecOld" is invariant, but "(object)" is not the same as "(int)" (reportAssignmentType) +""" diff --git a/conformance/results/pyright/generics_typevartuple_variance.toml b/conformance/results/pyright/generics_typevartuple_variance.toml new file mode 100644 index 000000000..2ae12eb0d --- /dev/null +++ b/conformance/results/pyright/generics_typevartuple_variance.toml @@ -0,0 +1,40 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 31: Expected 1 errors +Line 41: Expected 1 errors +Line 14: Unexpected errors ['generics_typevartuple_variance.py:14:42 - error: Type "ContravariantTypeVarTuple[(object)]" is not assignable to declared type "ContravariantTypeVarTuple[(int)]"'] +Line 23: Unexpected errors ['generics_typevartuple_variance.py:23:42 - error: Type "CovariantTypeVarTuple[(int)]" is not assignable to declared type "CovariantTypeVarTuple[(object)]"'] +Line 26: Unexpected errors ['generics_typevartuple_variance.py:26:29 - error: "contravariant" is unknown parameter to TypeVarTuple (reportGeneralTypeIssues)'] +Line 34: Unexpected errors ['generics_typevartuple_variance.py:34:49 - error: Type "ContravariantTypeVarTupleOld[object]" is not assignable to declared type "ContravariantTypeVarTupleOld[int]"'] +Line 37: Unexpected errors ['generics_typevartuple_variance.py:37:31 - error: "covariant" is unknown parameter to TypeVarTuple (reportGeneralTypeIssues)'] +Line 46: Unexpected errors ['generics_typevartuple_variance.py:46:49 - error: Type "CovariantTypeVarTupleOld[int]" is not assignable to declared type "CovariantTypeVarTupleOld[object]"'] +""" +output = """ +generics_typevartuple_variance.py:14:42 - error: Type "ContravariantTypeVarTuple[(object)]" is not assignable to declared type "ContravariantTypeVarTuple[(int)]" +  "ContravariantTypeVarTuple[(object)]" is not assignable to "ContravariantTypeVarTuple[(int)]" +    Type parameter "InTs@ContravariantTypeVarTuple" is invariant, but "(object)" is not the same as "(int)" (reportAssignmentType) +generics_typevartuple_variance.py:15:10 - error: Type "ContravariantTypeVarTuple[(int)]" is not assignable to declared type "ContravariantTypeVarTuple[(object)]" +  "ContravariantTypeVarTuple[(int)]" is not assignable to "ContravariantTypeVarTuple[(object)]" +    Type parameter "InTs@ContravariantTypeVarTuple" is invariant, but "(int)" is not the same as "(object)" (reportAssignmentType) +generics_typevartuple_variance.py:23:42 - error: Type "CovariantTypeVarTuple[(int)]" is not assignable to declared type "CovariantTypeVarTuple[(object)]" +  "CovariantTypeVarTuple[(int)]" is not assignable to "CovariantTypeVarTuple[(object)]" +    Type parameter "OutTs@CovariantTypeVarTuple" is invariant, but "(int)" is not the same as "(object)" (reportAssignmentType) +generics_typevartuple_variance.py:24:11 - error: Type "CovariantTypeVarTuple[(object)]" is not assignable to declared type "CovariantTypeVarTuple[(int)]" +  "CovariantTypeVarTuple[(object)]" is not assignable to "CovariantTypeVarTuple[(int)]" +    Type parameter "OutTs@CovariantTypeVarTuple" is invariant, but "(object)" is not the same as "(int)" (reportAssignmentType) +generics_typevartuple_variance.py:26:29 - error: "contravariant" is unknown parameter to TypeVarTuple (reportGeneralTypeIssues) +generics_typevartuple_variance.py:34:49 - error: Type "ContravariantTypeVarTupleOld[object]" is not assignable to declared type "ContravariantTypeVarTupleOld[int]" +  "ContravariantTypeVarTupleOld[object]" is not assignable to "ContravariantTypeVarTupleOld[int]" +    Type parameter "InTs@ContravariantTypeVarTupleOld" is invariant, but "*tuple[object]" is not the same as "*tuple[int]" (reportAssignmentType) +generics_typevartuple_variance.py:35:14 - error: Type "ContravariantTypeVarTupleOld[int]" is not assignable to declared type "ContravariantTypeVarTupleOld[object]" +  "ContravariantTypeVarTupleOld[int]" is not assignable to "ContravariantTypeVarTupleOld[object]" +    Type parameter "InTs@ContravariantTypeVarTupleOld" is invariant, but "*tuple[int]" is not the same as "*tuple[object]" (reportAssignmentType) +generics_typevartuple_variance.py:37:31 - error: "covariant" is unknown parameter to TypeVarTuple (reportGeneralTypeIssues) +generics_typevartuple_variance.py:46:49 - error: Type "CovariantTypeVarTupleOld[int]" is not assignable to declared type "CovariantTypeVarTupleOld[object]" +  "CovariantTypeVarTupleOld[int]" is not assignable to "CovariantTypeVarTupleOld[object]" +    Type parameter "OutTs@CovariantTypeVarTupleOld" is invariant, but "*tuple[int]" is not the same as "*tuple[object]" (reportAssignmentType) +generics_typevartuple_variance.py:47:15 - error: Type "CovariantTypeVarTupleOld[object]" is not assignable to declared type "CovariantTypeVarTupleOld[int]" +  "CovariantTypeVarTupleOld[object]" is not assignable to "CovariantTypeVarTupleOld[int]" +    Type parameter "OutTs@CovariantTypeVarTupleOld" is invariant, but "*tuple[object]" is not the same as "*tuple[int]" (reportAssignmentType) +""" diff --git a/conformance/results/results.html b/conformance/results/results.html index 3ddb751cd..0f8c1c35d 100644 --- a/conformance/results/results.html +++ b/conformance/results/results.html @@ -335,6 +335,13 @@

Python Type System Conformance Test Results

Pass Pass +     generics_paramspec_variance +Unsupported +Unsupported +Unsupported +Unsupported +Unsupported +      generics_scoping Pass Pass @@ -461,6 +468,13 @@

Python Type System Conformance Test Results

Pass Unsupported +     generics_typevartuple_variance +Unsupported +Unsupported +Unsupported +Unsupported +Unsupported +      generics_upper_bound
Partial

Does not reject use of type variable within an upper bound.

Pass diff --git a/conformance/results/ty/generics_paramspec_variance.toml b/conformance/results/ty/generics_paramspec_variance.toml new file mode 100644 index 000000000..c2c23d85f --- /dev/null +++ b/conformance/results/ty/generics_paramspec_variance.toml @@ -0,0 +1,30 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 15: Expected 1 errors +Line 24: Expected 1 errors +Line 35: Expected 1 errors +Line 47: Expected 1 errors +Line 26: Unexpected errors ['generics_paramspec_variance.py:26:7: error[invalid-paramspec] The variance and bound arguments for `ParamSpec` do not have defined semantics yet'] +Line 29: Unexpected errors ['generics_paramspec_variance.py:29:33: error[invalid-argument-type] `ParamSpec` is not a valid argument to `Generic`'] +Line 30: Unexpected errors ['generics_paramspec_variance.py:30:23: error[empty-body] Function always implicitly returns `None`, which is not assignable to return type `(...) -> Unknown`', 'generics_paramspec_variance.py:30:32: error[invalid-type-form] Variable of type `ParamSpec` is not allowed in a return type annotation', 'generics_paramspec_variance.py:30:32: error[invalid-type-form] The first argument to `Callable` must be either a list of types, ParamSpec, Concatenate, or `...`'] +Line 37: Unexpected errors ['generics_paramspec_variance.py:37:8: error[invalid-paramspec] The variance and bound arguments for `ParamSpec` do not have defined semantics yet'] +Line 40: Unexpected errors ['generics_paramspec_variance.py:40:29: error[invalid-argument-type] `ParamSpec` is not a valid argument to `Generic`'] +Line 42: Unexpected errors ['generics_paramspec_variance.py:42:34: error[invalid-type-form] Variable of type `ParamSpec` is not allowed in a parameter annotation', 'generics_paramspec_variance.py:42:34: error[invalid-type-form] The first argument to `Callable` must be either a list of types, ParamSpec, Concatenate, or `...`'] +""" +output = """ +generics_paramspec_variance.py:26:7: error[invalid-paramspec] The variance and bound arguments for `ParamSpec` do not have defined semantics yet +generics_paramspec_variance.py:29:33: error[invalid-argument-type] `ParamSpec` is not a valid argument to `Generic` +generics_paramspec_variance.py:30:23: error[empty-body] Function always implicitly returns `None`, which is not assignable to return type `(...) -> Unknown` +generics_paramspec_variance.py:30:32: error[invalid-type-form] Variable of type `ParamSpec` is not allowed in a return type annotation +generics_paramspec_variance.py:30:32: error[invalid-type-form] The first argument to `Callable` must be either a list of types, ParamSpec, Concatenate, or `...` +generics_paramspec_variance.py:31:34: error[invalid-type-form] Variable of type `ParamSpec` is not allowed in a parameter annotation +generics_paramspec_variance.py:31:34: error[invalid-type-form] The first argument to `Callable` must be either a list of types, ParamSpec, Concatenate, or `...` +generics_paramspec_variance.py:37:8: error[invalid-paramspec] The variance and bound arguments for `ParamSpec` do not have defined semantics yet +generics_paramspec_variance.py:40:29: error[invalid-argument-type] `ParamSpec` is not a valid argument to `Generic` +generics_paramspec_variance.py:41:23: error[empty-body] Function always implicitly returns `None`, which is not assignable to return type `(...) -> Unknown` +generics_paramspec_variance.py:41:32: error[invalid-type-form] Variable of type `ParamSpec` is not allowed in a return type annotation +generics_paramspec_variance.py:41:32: error[invalid-type-form] The first argument to `Callable` must be either a list of types, ParamSpec, Concatenate, or `...` +generics_paramspec_variance.py:42:34: error[invalid-type-form] Variable of type `ParamSpec` is not allowed in a parameter annotation +generics_paramspec_variance.py:42:34: error[invalid-type-form] The first argument to `Callable` must be either a list of types, ParamSpec, Concatenate, or `...` +""" diff --git a/conformance/results/ty/generics_typevartuple_variance.toml b/conformance/results/ty/generics_typevartuple_variance.toml new file mode 100644 index 000000000..dd031a3a0 --- /dev/null +++ b/conformance/results/ty/generics_typevartuple_variance.toml @@ -0,0 +1,18 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 15: Expected 1 errors +Line 24: Expected 1 errors +Line 35: Expected 1 errors +Line 41: Expected 1 errors +Line 47: Expected 1 errors +Line 26: Unexpected errors ['generics_typevartuple_variance.py:26:29: error[unknown-argument] Argument `contravariant` does not match any known parameter of function `__new__`'] +Line 37: Unexpected errors ['generics_typevartuple_variance.py:37:31: error[unknown-argument] Argument `covariant` does not match any known parameter of function `__new__`'] +Line 42: Unexpected errors ['generics_typevartuple_variance.py:42:24: error[empty-body] Function always implicitly returns `None`, which is not assignable to return type `tuple[@Todo(TypeVarTuple), ...]`'] +""" +output = """ +generics_typevartuple_variance.py:26:29: error[unknown-argument] Argument `contravariant` does not match any known parameter of function `__new__` +generics_typevartuple_variance.py:31:24: error[empty-body] Function always implicitly returns `None`, which is not assignable to return type `tuple[@Todo(TypeVarTuple), ...]` +generics_typevartuple_variance.py:37:31: error[unknown-argument] Argument `covariant` does not match any known parameter of function `__new__` +generics_typevartuple_variance.py:42:24: error[empty-body] Function always implicitly returns `None`, which is not assignable to return type `tuple[@Todo(TypeVarTuple), ...]` +""" diff --git a/conformance/results/zuban/generics_paramspec_variance.toml b/conformance/results/zuban/generics_paramspec_variance.toml new file mode 100644 index 000000000..78a4e2880 --- /dev/null +++ b/conformance/results/zuban/generics_paramspec_variance.toml @@ -0,0 +1,22 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 24: Expected 1 errors +Line 31: Expected 1 errors +Line 47: Expected 1 errors +Line 23: Unexpected errors ['generics_paramspec_variance.py:23: error: Incompatible types in assignment (expression has type "CovariantParamSpec[[int]]", variable has type "CovariantParamSpec[[object]]") [assignment]'] +Line 26: Unexpected errors ['generics_paramspec_variance.py:26: error: The variance and bound arguments to ParamSpec do not have defined semantics yet [misc]'] +Line 30: Unexpected errors ['generics_paramspec_variance.py:30: error: Missing return statement [empty-body]'] +Line 37: Unexpected errors ['generics_paramspec_variance.py:37: error: The variance and bound arguments to ParamSpec do not have defined semantics yet [misc]'] +Line 46: Unexpected errors ['generics_paramspec_variance.py:46: error: Incompatible types in assignment (expression has type "CovariantParamSpecOld[[int]]", variable has type "CovariantParamSpecOld[[object]]") [assignment]'] +""" +output = """ +generics_paramspec_variance.py:15: error: Incompatible types in assignment (expression has type "ContravariantParamSpec[[int]]", variable has type "ContravariantParamSpec[[object]]") [assignment] +generics_paramspec_variance.py:23: error: Incompatible types in assignment (expression has type "CovariantParamSpec[[int]]", variable has type "CovariantParamSpec[[object]]") [assignment] +generics_paramspec_variance.py:26: error: The variance and bound arguments to ParamSpec do not have defined semantics yet [misc] +generics_paramspec_variance.py:30: error: Missing return statement [empty-body] +generics_paramspec_variance.py:35: error: Incompatible types in assignment (expression has type "ContravariantParamSpecOld[[int]]", variable has type "ContravariantParamSpecOld[[object]]") [assignment] +generics_paramspec_variance.py:37: error: The variance and bound arguments to ParamSpec do not have defined semantics yet [misc] +generics_paramspec_variance.py:41: error: Missing return statement [empty-body] +generics_paramspec_variance.py:46: error: Incompatible types in assignment (expression has type "CovariantParamSpecOld[[int]]", variable has type "CovariantParamSpecOld[[object]]") [assignment] +""" diff --git a/conformance/results/zuban/generics_typevartuple_variance.toml b/conformance/results/zuban/generics_typevartuple_variance.toml new file mode 100644 index 000000000..d0fd66ac2 --- /dev/null +++ b/conformance/results/zuban/generics_typevartuple_variance.toml @@ -0,0 +1,22 @@ +conformant = "Unsupported" +conformance_automated = "Fail" +errors_diff = """ +Line 24: Expected 1 errors +Line 35: Expected 1 errors +Line 41: Expected 1 errors +Line 23: Unexpected errors ['generics_typevartuple_variance.py:23: error: Incompatible types in assignment (expression has type "CovariantTypeVarTuple[[int]]", variable has type "CovariantTypeVarTuple[[object]]") [assignment]'] +Line 26: Unexpected errors ['generics_typevartuple_variance.py:26: error: Unexpected keyword argument "contravariant" for "TypeVarTuple" [call-arg]'] +Line 34: Unexpected errors ['generics_typevartuple_variance.py:34: error: Incompatible types in assignment (expression has type "ContravariantTypeVarTupleOld[object]", variable has type "ContravariantTypeVarTupleOld[int]") [assignment]'] +Line 37: Unexpected errors ['generics_typevartuple_variance.py:37: error: Unexpected keyword argument "covariant" for "TypeVarTuple" [call-arg]'] +Line 42: Unexpected errors ['generics_typevartuple_variance.py:42: error: Missing return statement [empty-body]'] +""" +output = """ +generics_typevartuple_variance.py:15: error: Incompatible types in assignment (expression has type "ContravariantTypeVarTuple[[int]]", variable has type "ContravariantTypeVarTuple[[object]]") [assignment] +generics_typevartuple_variance.py:23: error: Incompatible types in assignment (expression has type "CovariantTypeVarTuple[[int]]", variable has type "CovariantTypeVarTuple[[object]]") [assignment] +generics_typevartuple_variance.py:26: error: Unexpected keyword argument "contravariant" for "TypeVarTuple" [call-arg] +generics_typevartuple_variance.py:31: error: Missing return statement [empty-body] +generics_typevartuple_variance.py:34: error: Incompatible types in assignment (expression has type "ContravariantTypeVarTupleOld[object]", variable has type "ContravariantTypeVarTupleOld[int]") [assignment] +generics_typevartuple_variance.py:37: error: Unexpected keyword argument "covariant" for "TypeVarTuple" [call-arg] +generics_typevartuple_variance.py:42: error: Missing return statement [empty-body] +generics_typevartuple_variance.py:47: error: Incompatible types in assignment (expression has type "CovariantTypeVarTupleOld[object]", variable has type "CovariantTypeVarTupleOld[int]") [assignment] +""" diff --git a/conformance/tests/generics_paramspec_variance.py b/conformance/tests/generics_paramspec_variance.py new file mode 100644 index 000000000..1c0e780ce --- /dev/null +++ b/conformance/tests/generics_paramspec_variance.py @@ -0,0 +1,47 @@ +""" +Tests variance of ParamSpec. +""" + +# Specification: https://typing.readthedocs.io/en/latest/spec/generics.html#semantics + + +from typing import Callable, Generic, ParamSpec + +class ContravariantParamSpec[**InP]: + def f(self, *args: InP.args, **kwargs: InP.kwargs): ... + +in_obj: ContravariantParamSpec[object] = ContravariantParamSpec() +in_int: ContravariantParamSpec[int] = in_obj # OK +in_obj = in_int # E + + +class CovariantParamSpec[**OutP]: + def f(self, fn: Callable[OutP, None]) -> None: ... + + +out_int: CovariantParamSpec[int] = CovariantParamSpec() +out_obj: CovariantParamSpec[object] = out_int # OK +out_int = out_obj # E + +InP = ParamSpec("InP", contravariant=True) + + +class ContravariantParamSpecOld(Generic[InP]): + def in_f(self) -> Callable[InP, None]: ... # OK + def out_f(self, fn: Callable[InP, None]) -> None: ... # E + +in_obj_old: ContravariantParamSpecOld[object] = ContravariantParamSpecOld() +in_int_old: ContravariantParamSpecOld[int] = in_obj_old # OK +in_obj_old = in_int_old # E + +OutP = ParamSpec("OutP", covariant=True) + + +class CovariantParamSpecOld(Generic[OutP]): + def in_f(self) -> Callable[OutP, None]: ... # E + def out_f(self, fn: Callable[OutP, None]) -> None: ... # OK + + +out_int_old: CovariantParamSpecOld[int] = CovariantParamSpecOld() +out_obj_old: CovariantParamSpecOld[object] = out_int_old # OK +out_int_old = out_obj_old # E diff --git a/conformance/tests/generics_typevartuple_variance.py b/conformance/tests/generics_typevartuple_variance.py new file mode 100644 index 000000000..f38a78699 --- /dev/null +++ b/conformance/tests/generics_typevartuple_variance.py @@ -0,0 +1,47 @@ +""" +Tests variance of TypeVarTuple. +""" + +# Specification: https://typing.readthedocs.io/en/latest/spec/generics.html#semantics + + +from typing import Callable, Generic, TypeVarTuple + +class ContravariantTypeVarTuple[**InTs]: + def f(self, *args: InTs.args, **kwargs: InTs.kwargs): ... + +in_obj: ContravariantTypeVarTuple[object] = ContravariantTypeVarTuple() +in_int: ContravariantTypeVarTuple[int] = in_obj # OK +in_obj = in_int # E + + +class CovariantTypeVarTuple[**OutTs]: + def f(self, fn: Callable[OutTs, None]) -> None: ... + + +out_int: CovariantTypeVarTuple[int] = CovariantTypeVarTuple() +out_obj: CovariantTypeVarTuple[object] = out_int # OK +out_int = out_obj # E + +InTs = TypeVarTuple("InTs", contravariant=True) + + +class ContravariantTypeVarTupleOld(Generic[*InTs]): + def in_f(self, *args: *InTs) -> None: ... # OK + def out_f(self) -> tuple[*InTs]: ... # E + +in_obj_old: ContravariantTypeVarTupleOld[object] = ContravariantTypeVarTupleOld() +in_int_old: ContravariantTypeVarTupleOld[int] = in_obj_old # OK +in_obj_old = in_int_old # E + +OutTs = TypeVarTuple("OutTs", covariant=True) + + +class CovariantTypeVarTupleOld(Generic[*OutTs]): + def in_f(self, *args: *OutTs) -> None: ... # E + def out_f(self) -> tuple[*OutTs]: ... # OK + + +out_int_old: CovariantTypeVarTupleOld[int] = CovariantTypeVarTupleOld() +out_obj_old: CovariantTypeVarTupleOld[object] = out_int_old # OK +out_int_old = out_obj_old # E diff --git a/docs/spec/generics.rst b/docs/spec/generics.rst index c1fa05325..887e87bf1 100644 --- a/docs/spec/generics.rst +++ b/docs/spec/generics.rst @@ -1189,12 +1189,11 @@ for two reasons: * To improve readability: the star also functions as an explicit visual indicator that the type variable tuple is not a normal type variable. -Variance, Type Constraints and Type Bounds: Not Supported +Type Constraints and Type Bounds: Not Supported """"""""""""""""""""""""""""""""""""""""""""""""""""""""" ``TypeVarTuple`` does not currently support specification of: -* Variance (e.g. ``TypeVar('T', covariant=True)``) * Type constraints (``TypeVar('T', int, float)``) * Type bounds (``TypeVar('T', bound=ParentClass)``) @@ -2712,15 +2711,12 @@ The algorithm for computing the variance of a type parameter is as follows. For each type parameter in a generic class: -1. If the type parameter is variadic (``TypeVarTuple``) or a parameter -specification (``ParamSpec``), it is always considered invariant. No further -inference is needed. +1. If the type parameter comes from a traditional +``TypeVar``/``TypeVarTuple``/``ParamSpec`` declaration and is not specified +as ``infer_variance`` (see below), its variance is specified by the +constructor call. No further inference is needed. -2. If the type parameter comes from a traditional ``TypeVar`` declaration and -is not specified as ``infer_variance`` (see below), its variance is specified -by the ``TypeVar`` constructor call. No further inference is needed. - -3. Create two specialized versions of the class. We'll refer to these as +2. Create two specialized versions of the class. We'll refer to these as ``upper`` and ``lower`` specializations. In both of these specializations, replace all type parameters other than the one being inferred by a dummy type instance (a concrete anonymous class that is assumed to meet the bounds or @@ -2730,7 +2726,7 @@ specialization ignores the type parameter's upper bound or constraints. In the ``lower`` specialized class, specialize the target type parameter with itself (i.e. the corresponding type argument is the type parameter itself). -4. Determine whether ``lower`` can be assigned to ``upper`` using normal +3. Determine whether ``lower`` can be assigned to ``upper`` using normal assignability rules. If so, the target type parameter is covariant. If not, determine whether ``upper`` can be assigned to ``lower``. If so, the target type parameter is contravariant. If neither of these combinations are