anchor.diff:  			      S#c_literal{val=T}), Cons);
   pat_alias(#c_cons{anno=Anno,hd=H1,tl=T1}, #c_cons{hd=H2,tl=T2}) ->
       ann_c_cons(Anno, pat_alias(H1, H2), pat_alias(T1, T2));
  +
  +%% alias tuples
   pat_alias(#c_tuple{anno=Anno,es=Es1}, #c_literal{val=T}) when is_tuple(T) ->
       Es2 = [#c_literal{val=E} || E <- tuple_to_list(T)],
       ann_c_tuple(Anno, pat_alias_list(Es1, Es2));
  
positive.code:     %% no need to hold any used/new annotations in a pattern.
      {#c_binary{anno=lineno_anno(L, St),segments=pat_bin(Ps, St)},[],St};
  pattern({match,_,P1,P2}, St) ->
      {Cp1,[],St1} = pattern(P1, St),
      {Cp2,[],St2} = pattern(P2, St1),
      {pat_alias(Cp1,Cp2),[],St2}.
  
  %% pattern_map_pairs([MapFieldExact],State) -> [#c_map_pairs{}]
  pattern_map_pairs(Ps, St) ->
  
negative.code:     ann_c_tuple(Anno, pat_alias_list(Es1, Es2));
  pat_alias(#c_tuple{anno=Anno,es=Es1}, #c_tuple{es=Es2}) ->
      ann_c_tuple(Anno, pat_alias_list(Es1, Es2));
  
  %% alias maps
  %% There are no literals in maps patterns (patterns are always abstract)
  pat_alias(#c_map{es=Es1}=M,#c_map{es=Es2}) ->
      M#c_map{es=pat_alias_map_pairs(Es1,Es2)};
  
  pat_alias(#c_alias{var=V1,pat=P1},
  	  #c_alias{var=V2,pat=P2}) ->
      if V1 =:= V2 -> #c_alias{var=V1,pat=pat_alias(P1, P2)};
  