anchor.diff:  macro_arg([], _E, Arg) ->
       {lists:reverse(Arg),[]}.
   
  -%% expand_macro(MacroDef, MacroTokenInfo, RestTokens, Bindings)
  -%% expand_arg(Argtokens, MacroTokens, MacroLocation, RestTokens, Bindings)
  +%% expand_macro(MacroDef, MacroTokenAnno, RestTokens, Bindings)
  +%% expand_arg(Argtokens, MacroTokens, TokenAnno, RestTokens, Bindings)
   %%  Insert the macro expansion replacing macro parameters with their
   %%  argument values, inserting the location of first the macro call
   %%  and then the macro arguments, i.e. simulate textual expansion.
   
  -expand_macro([{var,_Lv,V}|Ts], L, Rest, Bs) ->
  +expand_macro([{var,_Av,V}|Ts], Anno, Rest, Bs) ->
       case Bs of
   	#{V:=Val} ->
  -	    expand_arg(Val, Ts, L, Rest, Bs);
  +	    expand_arg(Val, Ts, Anno, Rest, Bs);
   	_ ->
  -	    [{var,L,V}|expand_macro(Ts, L, Rest, Bs)]
  -    end;
  -expand_macro([{'?', _}, {'?', _}, {var,_Lv,V}|Ts], L, Rest, Bs) ->
  +	    [{var,Anno,V}|expand_macro(Ts, Anno, Rest, Bs)]
  +    end;
  +expand_macro([{'?', _}, {'?', _}, {var,_Av,V}|Ts], Anno, Rest, Bs) ->
       case Bs of
   	#{V:=Val} ->
  -            expand_arg(stringify(Val, L), Ts, L, Rest, Bs);
  +            expand_arg(stringify(Val, Anno), Ts, Anno, Rest, Bs);
   	_ ->
  -	    [{var,L,V}|expand_macro(Ts, L, Rest, Bs)]
  -    end;
  -expand_macro([T|Ts], L, Rest, Bs) ->
  -    [setelement(2, T, L)|expand_macro(Ts, L, Rest, Bs)];
  -expand_macro([], _L, Rest, _Bs) -> Rest.
  -
  -expand_arg([A|As], Ts, _L, Rest, Bs) ->
  -    %% It is not obvious that the location of arguments should replace L.
  -    NextL = element(2, A),
  -    [A|expand_arg(As, Ts, NextL, Rest, Bs)];
  -expand_arg([], Ts, L, Rest, Bs) ->
  -    expand_macro(Ts, L, Rest, Bs).
  +	    [{var,Anno,V}|expand_macro(Ts, Anno, Rest, Bs)]
  +    end;
  +expand_macro([T|Ts], Anno, Rest, Bs) ->
  +    [setelement(2, T, Anno)|expand_macro(Ts, Anno, Rest, Bs)];
  +expand_macro([], _Anno, Rest, _Bs) -> Rest.
  +
  +expand_arg([A|As], Ts, _Anno, Rest, Bs) ->
  +    %% It is not obvious that the annotation of arguments should
  +    %% replace _Anno.
  +    NextAnno = element(2, A),
  +    [A|expand_arg(As, Ts, NextAnno, Rest, Bs)];
  +expand_arg([], Ts, Anno, Rest, Bs) ->
  +    expand_macro(Ts, Anno, Rest, Bs).
   
   %%%
   %%% Here follows support for the ?FUNCTION_NAME and ?FUNCTION_ARITY
  
positive.code: 
  skip_toks(From, St, [I|Sis]) ->
      case io:scan_erl_form(St#epp.file, '', St#epp.location) of
  	{ok,[{'-',_Lh},{atom,_Li,ifdef}|_Toks],Cl} ->
  	    skip_toks(From, St#epp{location=Cl}, [ifdef,I|Sis]);
  	{ok,[{'-',_Lh},{atom,_Li,ifndef}|_Toks],Cl} ->
  	    skip_toks(From, St#epp{location=Cl}, [ifndef,I|Sis]);
  	{ok,[{'-',_Lh},{'if',_Li}|_Toks],Cl} ->
  	    skip_toks(From, St#epp{location=Cl}, ['if',I|Sis]);
  	{ok,[{'-',_Lh},{atom,_Le,'else'}=Else|_Toks],Cl}->
  	    skip_else(Else, From, St#epp{location=Cl}, [I|Sis]);
  	{ok,[{'-',_Lh},{atom,_Le,'elif'}=Elif|Toks],Cl}->
  	    skip_elif(Toks, Elif, From, St#epp{location=Cl}, [I|Sis]);
  	{ok,[{'-',_Lh},{atom,_Le,endif}|_Toks],Cl} ->
  	    skip_toks(From, St#epp{location=Cl}, Sis);
  	{ok,_Toks,Cl} ->
  	    skip_toks(From, St#epp{location=Cl}, [I|Sis]);
  
negative.code: 
  %% Macro expansion
  %% Note: io:scan_erl_form() does not return comments or white spaces.
  expand_macros([{'?',_Aq},{atom,_Am,M}=MacT|Toks], St) ->
      expand_macros(MacT, M, Toks, St);
  %% Special macros
  expand_macros([{'?',_Aq},{var,Lm,'FUNCTION_NAME'}=Token|Toks], St0) ->
      St = update_fun_name(Token, St0),
      case St#epp.fname of
  	undefined ->
  	    [{'?',_Aq},Token];
  	{Name,_} ->
  	    [{atom,Lm,Name}]
      end ++ expand_macros(Toks, St);
  expand_macros([{'?',_Aq},{var,Lm,'FUNCTION_ARITY'}=Token|Toks], St0) ->
      St = update_fun_name(Token, St0),
      case St#epp.fname of
  	undefined ->
  	    [{'?',_Aq},Token];
  	{_,Arity} ->
  	    [{integer,Lm,Arity}]
      end ++ expand_macros(Toks, St);
  expand_macros([{'?',_Aq},{var,Lm,'LINE'}=Tok|Toks], St) ->
      Line = erl_scan:line(Tok),
      [{integer,Lm,Line}|expand_macros(Toks, St)];
  expand_macros([{'?',_Aq},{var,_Am,M}=MacT|Toks], St) ->
      expand_macros(MacT, M, Toks, St);
  %% Illegal macros
  expand_macros([{'?',_Aq},Token|_Toks], _St) ->
      T = case erl_scan:text(Token) of
              Text when is_list(Text) ->
                  Text;
  