From 2ceb3f9c9f60212eb76c96c1aa83e3fb140ff7b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 6 Sep 2022 11:20:07 +0200 Subject: [PATCH] Fix crash in ``dataclass`` brain --- ChangeLog | 3 +++ astroid/brain/brain_dataclasses.py | 4 +++- tests/unittest_brain_dataclasses.py | 23 +++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index bdf36d531c..f655c16e64 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,6 +17,9 @@ What's New in astroid 2.12.7? ============================= Release date: TBA +* Fixed a crash in the ``dataclass`` brain for uninferable bases. + + Closes PyCQA/pylint#7418 What's New in astroid 2.12.6? diff --git a/astroid/brain/brain_dataclasses.py b/astroid/brain/brain_dataclasses.py index 6549300cf1..3c83a25986 100644 --- a/astroid/brain/brain_dataclasses.py +++ b/astroid/brain/brain_dataclasses.py @@ -231,7 +231,9 @@ def _generate_dataclass_init( assignments.append(assignment_str) try: - base: ClassDef = next(next(iter(node.bases)).infer()) + base = next(next(iter(node.bases)).infer()) + if not isinstance(base, ClassDef): + raise InferenceError base_init: FunctionDef | None = base.locals["__init__"][0] except (StopIteration, InferenceError, KeyError): base_init = None diff --git a/tests/unittest_brain_dataclasses.py b/tests/unittest_brain_dataclasses.py index ad2f648afa..492d9ea555 100644 --- a/tests/unittest_brain_dataclasses.py +++ b/tests/unittest_brain_dataclasses.py @@ -824,3 +824,26 @@ class Dee(Cee): "ee", ] assert [a.name for a in dee_init.args.kwonlyargs] == [] + + +def test_dataclass_with_unknown_base() -> None: + """Regression test for dataclasses with unknown base classes. + + Reported in https://github.com/PyCQA/pylint/issues/7418 + """ + node = astroid.extract_node( + """ + import dataclasses + + from unknown import Unknown + + + @dataclasses.dataclass + class MyDataclass(Unknown): + pass + + MyDataclass() + """ + ) + + assert next(node.infer())