# Buggy code
def visit_class_def(self, tdef: ClassDef) -> None:
    # NamedTuple base classes are validated in check_namedtuple_classdef; we don't have to
    # check them again here.
    self.scope.enter_class(tdef.info)
    if not tdef.info.is_named_tuple:
        types = list(tdef.info.bases)  # type: List[Type]
        for tvar in tdef.type_vars:
            if tvar.upper_bound:
                types.append(tvar.upper_bound)
            if tvar.values:
                types.extend(tvar.values)
        self.analyze_types(types, tdef.info)
        for type in tdef.info.bases:
            if tdef.info.is_protocol:
                if not isinstance(type, Instance) or not type.type.is_protocol:
                    if type.type.fullname() != "builtins.object":
                        self.fail("All bases of a protocol must be protocols", tdef)
    # Recompute MRO now that we have analyzed all modules, to pick
    # up superclasses of bases imported from other modules in an
    # import loop. (Only do so if we succeeded the first time.)
    if tdef.info.mro:
        tdef.info.mro = []  # Force recomputation
        self.sem.calculate_class_mro(tdef)
    if tdef.analyzed is not None:
        # Also check synthetic types associated with this ClassDef.
        # Currently these are TypedDict, and NamedTuple.
        if isinstance(tdef.analyzed, TypedDictExpr):
            self.analyze(tdef.analyzed.info.typeddict_type, tdef.analyzed, warn=True)
        elif isinstance(tdef.analyzed, NamedTupleExpr):
            self.analyze(tdef.analyzed.info.tuple_type, tdef.analyzed, warn=True)
            self.analyze_info(tdef.analyzed.info)
    super().visit_class_def(tdef)
    self.analyze_symbol_table(tdef.info.names)
    self.scope.leave()


# Traceback (TypeError)
typetest.py:5: error: Recursive types not fully supported yet, nested types replaced with "Any"
typetest.py: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/issues version: 0.610
Traceback (most recent call last):
File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/__main__.py", line 11, in <module>
main(None)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/main.py", line 91, in main
res = type_check_only(sources, bin_dir, options, flush_errors, fscache)  # noqa
File "/home/jo/.local/lib/python3.6/site-packages/mypy/main.py", line 148, in type_check_only
fscache=fscache)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/build.py", line 185, in build
flush_errors, fscache)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/build.py", line 285, in _build
graph = dispatch(sources, manager)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/build.py", line 2398, in dispatch
process_graph(graph, manager)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/build.py", line 2691, in process_graph
process_stale_scc(graph, scc, manager)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/build.py", line 2820, in process_stale_scc
graph[id].finish_passes()
File "/home/jo/.local/lib/python3.6/site-packages/mypy/build.py", line 2067, in finish_passes
manager.report_file(self.tree, self.type_map(), self.options)
File "/usr/lib/python3.6/contextlib.py", line 99, in __exit__
self.gen.throw(type, value, traceback)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/build.py", line 1818, in wrap_context
yield
File "/home/jo/.local/lib/python3.6/site-packages/mypy/build.py", line 2062, in finish_passes
self._patch_indirect_dependencies(self.type_checker().module_refs, self.type_map())
File "/home/jo/.local/lib/python3.6/site-packages/mypy/build.py", line 2076, in _patch_indirect_dependencies
encountered = self.manager.indirection_detector.find_modules(types) | module_refs
File "/home/jo/.local/lib/python3.6/site-packages/mypy/indirection.py", line 29, in find_modules
return self._visit(*typs)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/indirection.py", line 37, in _visit
modules = typ.accept(self)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/types.py", line 1042, in accept
return visitor.visit_tuple_type(self)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/indirection.py", line 91, in visit_tuple_type
return self._visit(*t.items) | self._visit(t.fallback)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/indirection.py", line 37, in _visit
modules = typ.accept(self)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/types.py", line 512, in accept
return visitor.visit_instance(self)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/indirection.py", line 70, in visit_instance
out = self._visit(*t.args)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/indirection.py", line 37, in _visit
modules = typ.accept(self)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/types.py", line 512, in accept
return visitor.visit_instance(self)
File "/home/jo/.local/lib/python3.6/site-packages/mypy/indirection.py", line 75, in visit_instance
for s in t.type.mro:
TypeError: 'NoneType' object is not iterable
typetest.py: : note: use --pdb to drop into pdb

# Fixed code
def visit_class_def(self, tdef: ClassDef) -> None:
    # NamedTuple base classes are validated in check_namedtuple_classdef; we don't have to
    # check them again here.
    self.scope.enter_class(tdef.info)
    if not tdef.info.is_named_tuple:
        types = list(tdef.info.bases)  # type: List[Type]
        for tvar in tdef.type_vars:
            if tvar.upper_bound:
                types.append(tvar.upper_bound)
            if tvar.values:
                types.extend(tvar.values)
        if tdef.info.tuple_type:
            types.append(tdef.info.tuple_type)
        self.analyze_types(types, tdef.info)
        for type in tdef.info.bases:
            if tdef.info.is_protocol:
                if not isinstance(type, Instance) or not type.type.is_protocol:
                    if type.type.fullname() != "builtins.object":
                        self.fail("All bases of a protocol must be protocols", tdef)
    # Recompute MRO now that we have analyzed all modules, to pick
    # up superclasses of bases imported from other modules in an
    # import loop. (Only do so if we succeeded the first time.)
    if tdef.info.mro:
        tdef.info.mro = []  # Force recomputation
        self.sem.calculate_class_mro(tdef)
    if tdef.analyzed is not None:
        # Also check synthetic types associated with this ClassDef.
        # Currently these are TypedDict, and NamedTuple.
        if isinstance(tdef.analyzed, TypedDictExpr):
            self.analyze(tdef.analyzed.info.typeddict_type, tdef.analyzed, warn=True)
        elif isinstance(tdef.analyzed, NamedTupleExpr):
            self.analyze(tdef.analyzed.info.tuple_type, tdef.analyzed, warn=True)
            self.analyze_info(tdef.analyzed.info)
    super().visit_class_def(tdef)
    self.analyze_symbol_table(tdef.info.names)
    self.scope.leave()