anchor.diff:      merge_bool(A);
   merge_types({atom,A}, bool) ->
       merge_bool(A);
  -merge_types({match_context,B0,Slots},{match_context,B1,Slots}) ->
  -    {match_context,B0 bor B1,Slots};
  -merge_types({match_context,_,_}=M, _) ->
  +merge_types(#ms{valid=B0,slots=Slots}=M,#ms{valid=B1,slots=Slots}) ->
  +    M#ms{valid=B0 bor B1,slots=Slots};
  +merge_types(#ms{}=M, _) ->
       M;
  -merge_types(_, {match_context,_,_}=M) ->
  +merge_types(_, #ms{}=M) ->
       M;
   merge_types(T1, T2) when T1 =/= T2 ->
       %% Too different. All we know is that the type is a 'term'.
  
positive.code: 	initialized -> error({unassigned,Src});
  	{catchtag,_} -> error({catchtag,Src});
  	{trytag,_} -> error({trytag,Src});
  	{match_context,_,_} -> error({match_context,Src});
  	Type -> Type
      end.
  
  
negative.code: %%%
  
  bsm_match_state(Slots) ->
      #ms{slots=Slots}.
  
  bsm_validate_context(Reg, Vst) ->
      _ = bsm_get_context(Reg, Vst),
  