anchor.diff:      {[T], [T]};
   infer_success_type(_Op, _Args, _Ts, _Ds) ->
       {[], []}.
  +
  +infer_eq_lit(#b_set{op={bif,tuple_size},args=[#b_var{}=Tuple]},
  +             #b_literal{val=Size}) when is_integer(Size) ->
  +    [{Tuple,#t_tuple{exact=true,size=Size}}];
  +infer_eq_lit(#b_set{op=get_tuple_element,
  +                    args=[#b_var{}=Tuple,#b_literal{val=N}]},
  +             #b_literal{}=Lit) ->
  +    Index = N + 1,
  +    Es = beam_types:set_element_type(Index, raw_type(Lit, #{}), #{}),
  +    [{Tuple,#t_tuple{size=Index,elements=Es}}];
  +infer_eq_lit(_, _) ->
  +    [].
   
   join_types(Ts0, Ts1) ->
       if
  
positive.code: infer_type({bif,is_tuple}, [Arg], _Ts, _Ds) ->
      T = {Arg, #t_tuple{}},
      {[T], [T]};
  infer_type(_Op, _Args, _Ts, _Ds) ->
      {[], []}.
  
  
negative.code:     end.
  
  infer_types_switch(V, Lit, Ts, #d{ds=Ds}) ->
      {PosTypes, _} = infer_type({bif,'=:='}, [V, Lit], Ts, Ds),
      meet_types(PosTypes, Ts).
  
  infer_type(succeeded, [#b_var{}=Src], Ts, Ds) ->
      #b_set{op=Op,args=Args} = maps:get(Src, Ds),
  