anchor.diff:  types(erlang, 'not', [_]) ->
       Bool = beam_types:make_boolean(),
       sub_safe(Bool, [Bool]);
  -types(erlang, 'length', [_]) ->
  -    sub_safe(#t_integer{}, [proper_list()]);
  +types(erlang, 'length', [Src]) ->
  +    Min = case Src of
  +              #t_cons{} -> 1;
  +              _ -> 0
  +          end,
  +    sub_safe(#t_integer{elements={Min,?SIZE_UPPER_LIMIT}}, [proper_list()]);
   
   %% Boolean ops
   types(erlang, 'and', [_,_]) ->
  
positive.code:     end.
  
  %%
  %% Returns the inferred return and argument types for known functions, and
  %% whether it's safe to subtract argument types on failure.
  %%
  
negative.code:     %% Arg is an iodata(), despite its name.
      ArgType = beam_types:join(#t_list{}, #t_bitstring{size_unit=8}),
      sub_unsafe(#t_bitstring{size_unit=8}, [ArgType]);
  types(erlang, 'iolist_size', [_]) ->
      %% Arg is an iodata(), despite its name. The size is NOT limited
      %% by the size of memory.
      ArgType = beam_types:join(#t_list{}, #t_bitstring{size_unit=8}),
      sub_unsafe(#t_integer{}, [ArgType]);
  types(erlang, 'list_to_binary', [_]) ->
      %% Arg is an iolist(), despite its name.
      sub_unsafe(#t_bitstring{size_unit=8}, [#t_list{}]);
  