diff --git a/doc/whatsnew/fragments/8698.bugfix b/doc/whatsnew/fragments/8698.bugfix new file mode 100644 index 0000000000..278a14fba1 --- /dev/null +++ b/doc/whatsnew/fragments/8698.bugfix @@ -0,0 +1,3 @@ +Fix crash in ``invalid-metaclass`` check when a metaclass had duplicate bases. + +Closes #8698 diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py index 1a628f2312..76a98dadfe 100644 --- a/pylint/checkers/typecheck.py +++ b/pylint/checkers/typecheck.py @@ -745,7 +745,10 @@ def _no_context_variadic( def _is_invalid_metaclass(metaclass: nodes.ClassDef) -> bool: - mro = metaclass.mro() + try: + mro = metaclass.mro() + except (astroid.DuplicateBasesError, astroid.InconsistentMroError): + return True return not any(is_builtin_object(cls) and cls.name == "type" for cls in mro) diff --git a/tests/functional/i/invalid/invalid_metaclass.py b/tests/functional/i/invalid/invalid_metaclass.py index 3b264d693e..f2f857c71f 100644 --- a/tests/functional/i/invalid/invalid_metaclass.py +++ b/tests/functional/i/invalid/invalid_metaclass.py @@ -68,3 +68,11 @@ class Invalid(metaclass=invalid_metaclass_1): # [invalid-metaclass] class InvalidSecond(metaclass=invalid_metaclass_2): # [invalid-metaclass] pass + + +class MetaclassWithInvalidMRO(type(object), type(object)): # [duplicate-bases] + pass + + +class FifthInvalid(metaclass=MetaclassWithInvalidMRO): # [invalid-metaclass] + pass diff --git a/tests/functional/i/invalid/invalid_metaclass.txt b/tests/functional/i/invalid/invalid_metaclass.txt index 21b31f3c6e..257d300595 100644 --- a/tests/functional/i/invalid/invalid_metaclass.txt +++ b/tests/functional/i/invalid/invalid_metaclass.txt @@ -4,3 +4,5 @@ invalid-metaclass:49:0:49:18:ThirdInvalid:Invalid metaclass '2' used:UNDEFINED invalid-metaclass:53:0:53:19:FourthInvalid:Invalid metaclass 'Instance of invalid_metaclass.InvalidAsMetaclass' used:UNDEFINED invalid-metaclass:65:0:65:13:Invalid:Invalid metaclass 'int' used:UNDEFINED invalid-metaclass:69:0:69:19:InvalidSecond:Invalid metaclass '1' used:UNDEFINED +duplicate-bases:73:0:73:29:MetaclassWithInvalidMRO:Duplicate bases for class 'MetaclassWithInvalidMRO':UNDEFINED +invalid-metaclass:77:0:77:18:FifthInvalid:Invalid metaclass 'MetaclassWithInvalidMRO' used:UNDEFINED