# Buggy code
def assign_type(
    self,
    expr: Expression,
    type: Type,
    declared_type: Optional[Type],
    restrict_any: bool = False,
) -> None:
    if not isinstance(expr, BindableTypes):
        return None
    if not literal(expr):
        return
    self.invalidate_dependencies(expr)

    if declared_type is None:
        # Not sure why this happens.  It seems to mainly happen in
        # member initialization.
        return
    if not is_subtype(type, declared_type):
        # Pretty sure this is only happens when there's a type error.

        # Ideally this function wouldn't be called if the
        # expression has a type error, though -- do other kinds of
        # errors cause this function to get called at invalid
        # times?
        return

    enclosing_type = self.most_recent_enclosing_type(expr, type)
    if isinstance(enclosing_type, AnyType) and not restrict_any:
        # If x is Any and y is int, after x = y we do not infer that x is int.
        # This could be changed.
        if not isinstance(type, AnyType):
            # We narrowed type from Any in a recent frame (probably an
            # isinstance check), but now it is reassigned, so broaden back
            # to Any (which is the most recent enclosing type)
            self.put(expr, enclosing_type)
    elif isinstance(type, AnyType) and not (
        isinstance(declared_type, UnionType)
        and any(isinstance(item, AnyType) for item in declared_type.items)
    ):
        # Assigning an Any value doesn't affect the type to avoid false negatives, unless
        # there is an Any item in a declared union type.
        self.put(expr, declared_type)
    else:
        self.put(expr, type)

    for i in self.try_frames:
        # XXX This should probably not copy the entire frame, but
        # just copy this variable into a single stored frame.
        self.allow_jump(i)


# Traceback (AssertionError)
mypy --py2 --show-traceback test.py

test.py:6: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/issues version: 0.521-858f7512cf3b4e39c0f4e8de5a13eee0e1e138fb-dirty
Traceback (most recent call last):
File "/usr/local/Cellar/mypy/0.521/libexec/bin/mypy", line 11, in <module>
load_entry_point('mypy===0.521-858f7512cf3b4e39c0f4e8de5a13eee0e1e138fb-dirty', 'console_scripts', 'mypy')()
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/__main__.py", line 7, in console_entry
main(None)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/main.py", line 50, in main
res = type_check_only(sources, bin_dir, options)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/main.py", line 97, in type_check_only
options=options)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/build.py", line 196, in build
graph = dispatch(sources, manager)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/build.py", line 1801, in dispatch
process_graph(graph, manager)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/build.py", line 2044, in process_graph
process_stale_scc(graph, scc, manager)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/build.py", line 2147, in process_stale_scc
graph[id].type_check_first_pass()
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/build.py", line 1716, in type_check_first_pass
self.type_checker.check_first_pass()
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 185, in check_first_pass
self.accept(d)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 273, in accept
stmt.accept(self)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/nodes.py", line 565, in accept
return visitor.visit_func_def(self)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 519, in visit_func_def
self.check_func_item(defn, name=defn.name())
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 578, in check_func_item
self.check_func_def(defn, typ, name)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 738, in check_func_def
self.accept(item.body)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 273, in accept
stmt.accept(self)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/nodes.py", line 815, in accept
return visitor.visit_block(self)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 1202, in visit_block
self.accept(s)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 273, in accept
stmt.accept(self)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/nodes.py", line 859, in accept
return visitor.visit_assignment_stmt(self)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 1209, in visit_assignment_stmt
self.check_assignment(s.lvalues[-1], s.rvalue, s.type is None, s.new_syntax)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 1236, in check_assignment
infer_lvalue_type)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 1483, in check_assignment_to_multiple_lvalues
self.check_multi_assignment(lvalues, rvalue, context, infer_lvalue_type)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 1522, in check_multi_assignment
context, undefined_rvalue, infer_lvalue_type)
File "/usr/local/Cellar/mypy/0.521/libexec/lib/python3.6/site-packages/mypy/checker.py", line 1550, in check_multi_assignment_from_tuple
assert isinstance(reinferred_rvalue_type, TupleType)
AssertionError:
test.py:6: note: use --pdb to drop into pdb

# Fixed code
def assign_type(
    self,
    expr: Expression,
    type: Type,
    declared_type: Optional[Type],
    restrict_any: bool = False,
) -> None:
    if self.type_assignments is not None:
        # We are in a multiassign from union, defer the actual binding,
        # just collect the types.
        self.type_assignments[expr].append((type, declared_type))
        return
    if not isinstance(expr, BindableTypes):
        return None
    if not literal(expr):
        return
    self.invalidate_dependencies(expr)

    if declared_type is None:
        # Not sure why this happens.  It seems to mainly happen in
        # member initialization.
        return
    if not is_subtype(type, declared_type):
        # Pretty sure this is only happens when there's a type error.

        # Ideally this function wouldn't be called if the
        # expression has a type error, though -- do other kinds of
        # errors cause this function to get called at invalid
        # times?
        return

    enclosing_type = self.most_recent_enclosing_type(expr, type)
    if isinstance(enclosing_type, AnyType) and not restrict_any:
        # If x is Any and y is int, after x = y we do not infer that x is int.
        # This could be changed.
        if not isinstance(type, AnyType):
            # We narrowed type from Any in a recent frame (probably an
            # isinstance check), but now it is reassigned, so broaden back
            # to Any (which is the most recent enclosing type)
            self.put(expr, enclosing_type)
    elif isinstance(type, AnyType) and not (
        isinstance(declared_type, UnionType)
        and any(isinstance(item, AnyType) for item in declared_type.items)
    ):
        # Assigning an Any value doesn't affect the type to avoid false negatives, unless
        # there is an Any item in a declared union type.
        self.put(expr, declared_type)
    else:
        self.put(expr, type)

    for i in self.try_frames:
        # XXX This should probably not copy the entire frame, but
        # just copy this variable into a single stored frame.
        self.allow_jump(i)