# Buggy code
def make(
    cls,
    name,
    code,
    f_locals,
    f_globals,
    defaults,
    kw_defaults,
    closure,
    annotations,
    late_annotations,
    vm,
):
    """Get an InterpreterFunction.

    Things like anonymous functions and generator expressions are created
    every time the corresponding code executes. Caching them makes it easier
    to detect when the environment hasn't changed and a function call can be
    optimized away.

    Arguments:
      name: Function name.
      code: A code object.
      f_locals: The locals used for name resolution.
      f_globals: The globals used for name resolution.
      defaults: Default arguments.
      kw_defaults: Default arguments for kwonly parameters.
      closure: The free variables this closure binds to.
      annotations: Function annotations. Dict of name -> AtomicAbstractValue.
      late_annotations: Late-evaled annotations. Dict of name -> str.
      vm: VirtualMachine instance.

    Returns:
      An InterpreterFunction.
    """
    annotations = annotations or {}
    if "return" in annotations:
        # Check Generator/AsyncGenerator return type
        ret_type = annotations["return"]
        if code.has_generator():
            if not abstract_utils.matches_generator(ret_type):
                error = "Expected Generator, Iterable or Iterator"
                vm.errorlog.invalid_annotation(vm.frames, ret_type, error)
        elif code.has_async_generator():
            if not abstract_utils.matches_async_generator(ret_type):
                error = "Expected AsyncGenerator, AsyncIterable or AsyncIterator"
                vm.errorlog.invalid_annotation(vm.frames, ret_type, error)
    late_annotations = late_annotations or {}
    overloads = vm.frame.overloads[name]
    key = (
        name,
        code,
        abstract_utils.hash_all_dicts(
            (f_globals.members, set(code.co_names)),
            (f_locals.members, set(f_locals.members) - set(code.co_varnames)),
            (
                {
                    key: vm.program.NewVariable([value], [], vm.root_cfg_node)
                    for key, value in annotations.items()
                },
                None,
            ),
            (
                dict(
                    enumerate(
                        vm.program.NewVariable([f], [], vm.root_cfg_node)
                        for f in overloads
                    )
                ),
                None,
            ),
            (dict(enumerate(defaults)), None),
            (dict(enumerate(closure or ())), None),
        ),
    )
    if key not in cls._function_cache:
        cls._function_cache[key] = cls(
            name,
            code,
            f_locals,
            f_globals,
            defaults,
            kw_defaults,
            closure,
            annotations,
            late_annotations,
            overloads,
            vm,
        )
    return cls._function_cache[key]


# Traceback (AttributeError)
from typing import Any
def __getattr__(name: Any) -> Any: ...
# Caught error in pytype: 'LateAnnotation' object has no attribute 'Bindings'
# Traceback (most recent call last):
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/io.py", line 131, in check_or_generate_pyi
#     input_filename=options.input, options=options, loader=loader)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/io.py", line 89, in generate_pyi
#     analyze.infer_types, input_filename, options, loader)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/io.py", line 62, in _call
#     deep=deep)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/analyze.py", line 668, in infer_types
#     tracer.exitpoint = tracer.analyze(loc, defs, maximum_depth)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/analyze.py", line 407, in analyze
#     return self.analyze_toplevel(node, defs)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/analyze.py", line 370, in analyze_toplevel
#     new_node = self.analyze_class(node, value)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/analyze.py", line 352, in analyze_class
#     node = self.analyze_method_var(node, name, b)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/analyze.py", line 202, in analyze_method_var
#     node2 = self.maybe_analyze_method(node1, val)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/analyze.py", line 157, in maybe_analyze_method
#     node, _ = self.call_function_with_args(node, val, args)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/analyze.py", line 121, in call_function_with_args
#     new_node, ret = self.call_function_in_frame(node, fvar, *args)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/analyze.py", line 132, in call_function_in_frame
#     state, var, args, kwargs, starargs, starstarargs)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/vm.py", line 917, in call_function_with_state
#     starstarargs=starstarargs), fallback_to_unsolvable, allow_noreturn=True)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/vm.py", line 953, in call_function
#     new_node, one_result = func.call(node, funcv, args)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/abstract.py", line 3247, in call
#     alias_map=self.alias_map)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/abstract.py", line 3051, in call
#     node2, ret = self.vm.run_frame(frame, node)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/vm.py", line 292, in run_frame
#     state = self.run_instruction(op, state)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/vm.py", line 253, in run_instruction
#     state = bytecode_fn(state, op)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/vm.py", line 1980, in byte_LOAD_ATTR
#     state, val = self.load_attr(state, obj, name)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/vm.py", line 1224, in load_attr
#     node, result, errors = self._retrieve_attr(state.node, obj, attr)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/vm.py", line 1195, in _retrieve_attr
#     node, val.data, attr, val)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/attribute.py", line 65, in get_attribute
#     return self._get_instance_attribute(node, obj, name, valself)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/attribute.py", line 234, in _get_instance_attribute
#     return self._get_attribute(node, obj, obj.cls, name, valself)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/attribute.py", line 270, in _get_attribute
#     node, attr = self.get_attribute(node, cls, name, valself)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/attribute.py", line 58, in get_attribute
#     return self._get_class_attribute(node, obj, name, valself)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/attribute.py", line 229, in _get_class_attribute
#     return self._get_attribute(node, cls, meta, name, valself)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/attribute.py", line 284, in _get_attribute
#     attr = self._filter_var(node, attr)
#   File "/Users/name/.pyenv/versions/3.7.3/envs/venv/lib/python3.7/site-packages/pytype/attribute.py", line 426, in _filter_var
#     bindings = var.Bindings(node, strict=False)
# AttributeError: 'LateAnnotation' object has no attribute 'Bindings'

# Fixed code
def make(
    cls,
    name,
    code,
    f_locals,
    f_globals,
    defaults,
    kw_defaults,
    closure,
    annotations,
    vm,
):
    """Get an InterpreterFunction.

    Things like anonymous functions and generator expressions are created
    every time the corresponding code executes. Caching them makes it easier
    to detect when the environment hasn't changed and a function call can be
    optimized away.

    Arguments:
      name: Function name.
      code: A code object.
      f_locals: The locals used for name resolution.
      f_globals: The globals used for name resolution.
      defaults: Default arguments.
      kw_defaults: Default arguments for kwonly parameters.
      closure: The free variables this closure binds to.
      annotations: Function annotations. Dict of name -> AtomicAbstractValue.
      vm: VirtualMachine instance.

    Returns:
      An InterpreterFunction.
    """
    annotations = annotations or {}
    if "return" in annotations:
        # Check Generator/AsyncGenerator return type
        ret_type = annotations["return"]
        if code.has_generator():
            if not abstract_utils.matches_generator(ret_type):
                error = "Expected Generator, Iterable or Iterator"
                vm.errorlog.invalid_annotation(vm.frames, ret_type, error)
        elif code.has_async_generator():
            if not abstract_utils.matches_async_generator(ret_type):
                error = "Expected AsyncGenerator, AsyncIterable or AsyncIterator"
                vm.errorlog.invalid_annotation(vm.frames, ret_type, error)
    overloads = vm.frame.overloads[name]
    key = (
        name,
        code,
        abstract_utils.hash_all_dicts(
            (f_globals.members, set(code.co_names)),
            (f_locals.members, set(f_locals.members) - set(code.co_varnames)),
            (
                {
                    key: vm.program.NewVariable([value], [], vm.root_cfg_node)
                    for key, value in annotations.items()
                },
                None,
            ),
            (
                dict(
                    enumerate(
                        vm.program.NewVariable([f], [], vm.root_cfg_node)
                        for f in overloads
                    )
                ),
                None,
            ),
            (dict(enumerate(defaults)), None),
            (dict(enumerate(closure or ())), None),
        ),
    )
    if key not in cls._function_cache:
        cls._function_cache[key] = cls(
            name,
            code,
            f_locals,
            f_globals,
            defaults,
            kw_defaults,
            closure,
            annotations,
            overloads,
            vm,
        )
    return cls._function_cache[key]