Skip to content

Commit c1243cf

Browse files
[Backport maintenance/2.17.x] Fix crash in invalid-metaclass check (#8700)
* Fix crash in `invalid-metaclass` check (#8699) (cherry picked from commit 7a562dd) * Remove test case for inconsistent-mro This was added only to cover the second exception type that needs to be handled here; but backporting it to branches supporting 3.7 would require rewriting the test case. --------- Co-authored-by: Jacob Walls <[email protected]>
1 parent d590864 commit c1243cf

File tree

4 files changed

+17
-1
lines changed

4 files changed

+17
-1
lines changed

doc/whatsnew/fragments/8698.bugfix

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix crash in ``invalid-metaclass`` check when a metaclass had duplicate bases.
2+
3+
Closes #8698

pylint/checkers/typecheck.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,10 @@ def _no_context_variadic(
745745

746746

747747
def _is_invalid_metaclass(metaclass: nodes.ClassDef) -> bool:
748-
mro = metaclass.mro()
748+
try:
749+
mro = metaclass.mro()
750+
except (astroid.DuplicateBasesError, astroid.InconsistentMroError):
751+
return True
749752
return not any(is_builtin_object(cls) and cls.name == "type" for cls in mro)
750753

751754

tests/functional/i/invalid/invalid_metaclass.py

+8
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,11 @@ class Invalid(metaclass=invalid_metaclass_1): # [invalid-metaclass]
6868

6969
class InvalidSecond(metaclass=invalid_metaclass_2): # [invalid-metaclass]
7070
pass
71+
72+
73+
class MetaclassWithInvalidMRO(type(object), type(object)): # [duplicate-bases]
74+
pass
75+
76+
77+
class FifthInvalid(metaclass=MetaclassWithInvalidMRO): # [invalid-metaclass]
78+
pass

tests/functional/i/invalid/invalid_metaclass.txt

+2
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ invalid-metaclass:49:0:49:18:ThirdInvalid:Invalid metaclass '2' used:UNDEFINED
44
invalid-metaclass:53:0:53:19:FourthInvalid:Invalid metaclass 'Instance of invalid_metaclass.InvalidAsMetaclass' used:UNDEFINED
55
invalid-metaclass:65:0:65:13:Invalid:Invalid metaclass 'int' used:UNDEFINED
66
invalid-metaclass:69:0:69:19:InvalidSecond:Invalid metaclass '1' used:UNDEFINED
7+
duplicate-bases:73:0:73:29:MetaclassWithInvalidMRO:Duplicate bases for class 'MetaclassWithInvalidMRO':UNDEFINED
8+
invalid-metaclass:77:0:77:18:FifthInvalid:Invalid metaclass 'MetaclassWithInvalidMRO' used:UNDEFINED

0 commit comments

Comments
 (0)