From 66bf1a0c38a7b4c398eedf3830bc4acbdf984392 Mon Sep 17 00:00:00 2001 From: STerliakov Date: Sat, 2 Aug 2025 01:04:24 +0200 Subject: [PATCH 1/2] Fix Instance creation --- mypy/plugins/dataclasses.py | 3 +-- test-data/unit/check-dataclasses.test | 11 +++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/mypy/plugins/dataclasses.py b/mypy/plugins/dataclasses.py index ee6f8889b894..e916ded01dd2 100644 --- a/mypy/plugins/dataclasses.py +++ b/mypy/plugins/dataclasses.py @@ -410,13 +410,12 @@ def _add_dunder_replace(self, attributes: list[DataclassAttribute]) -> None: for attr in attributes if attr.is_in_init ] - type_vars = [tv for tv in self._cls.type_vars] add_method_to_class( self._api, self._cls, "__replace__", args=args, - return_type=Instance(self._cls.info, type_vars), + return_type=fill_typevars(self._cls.info), ) def _add_internal_replace_method(self, attributes: list[DataclassAttribute]) -> None: diff --git a/test-data/unit/check-dataclasses.test b/test-data/unit/check-dataclasses.test index a6ac30e20c36..525773fbcb33 100644 --- a/test-data/unit/check-dataclasses.test +++ b/test-data/unit/check-dataclasses.test @@ -2682,3 +2682,14 @@ class ClassB(ClassA): def value(self) -> int: # E: Name "value" already defined on line 10 return 0 [builtins fixtures/dict.pyi] + +[case testDataclassWithTypeVarTuple] +# flags: --python-version 3.13 +# https://github.com/python/mypy/issues/19559 +from typing import Callable +from dataclasses import dataclass + +@dataclass +class Test[*Ts, R]: + a: Callable[[*Ts], R] +[builtins fixtures/dict.pyi] From 12f892c7784fcf49eb9fc5946359d31bc3efdde1 Mon Sep 17 00:00:00 2001 From: STerliakov Date: Sat, 2 Aug 2025 01:20:46 +0200 Subject: [PATCH 2/2] Move testcase to 3.12+ --- test-data/unit/check-dataclasses.test | 11 ----------- test-data/unit/check-python312.test | 11 +++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/test-data/unit/check-dataclasses.test b/test-data/unit/check-dataclasses.test index 525773fbcb33..a6ac30e20c36 100644 --- a/test-data/unit/check-dataclasses.test +++ b/test-data/unit/check-dataclasses.test @@ -2682,14 +2682,3 @@ class ClassB(ClassA): def value(self) -> int: # E: Name "value" already defined on line 10 return 0 [builtins fixtures/dict.pyi] - -[case testDataclassWithTypeVarTuple] -# flags: --python-version 3.13 -# https://github.com/python/mypy/issues/19559 -from typing import Callable -from dataclasses import dataclass - -@dataclass -class Test[*Ts, R]: - a: Callable[[*Ts], R] -[builtins fixtures/dict.pyi] diff --git a/test-data/unit/check-python312.test b/test-data/unit/check-python312.test index bfd6334b5077..d275503dc411 100644 --- a/test-data/unit/check-python312.test +++ b/test-data/unit/check-python312.test @@ -2084,3 +2084,14 @@ reveal_type(A1().x) # N: Revealed type is "builtins.int" reveal_type(A2().x) # N: Revealed type is "builtins.int" reveal_type(A3().x) # N: Revealed type is "builtins.list[builtins.int]" [builtins fixtures/tuple.pyi] + +[case testDataclassWithTypeVarTuple] +# flags: --python-version 3.13 +# https://github.com/python/mypy/issues/19559 +from typing import Callable +from dataclasses import dataclass + +@dataclass +class Test[*Ts, R]: + a: Callable[[*Ts], R] +[builtins fixtures/dict.pyi]