anchor.diff:  %%  N.B. Field names are full expressions here but only atoms are allowed
   %%  by the *linter*!.
   
  -record_inits([{record_field,Lf,{atom,La,F},Val0}|Is]) ->
  +record_inits([{record_field,Af,{atom,Aa,F},Val0}|Is]) ->
       Val1 = expr(Val0),
  -    [{record_field,Lf,{atom,La,F},Val1}|record_inits(Is)];
  -record_inits([{record_field,Lf,{var,La,'_'},Val0}|Is]) ->
  +    [{record_field,Af,{atom,Aa,F},Val1}|record_inits(Is)];
  +record_inits([{record_field,Af,{var,Aa,'_'},Val0}|Is]) ->
       Val1 = expr(Val0),
  -    [{record_field,Lf,{var,La,'_'},Val1}|record_inits(Is)];
  +    [{record_field,Af,{var,Aa,'_'},Val1}|record_inits(Is)];
   record_inits([]) -> [].
   
   %% -type record_updates([RecordUpd]) -> [RecordUpd].
   %%  N.B. Field names are full expressions here but only atoms are allowed
   %%  by the *linter*!.
   
  -record_updates([{record_field,Lf,{atom,La,F},Val0}|Us]) ->
  +record_updates([{record_field,Af,{atom,Aa,F},Val0}|Us]) ->
       Val1 = expr(Val0),
  -    [{record_field,Lf,{atom,La,F},Val1}|record_updates(Us)];
  +    [{record_field,Af,{atom,Aa,F},Val1}|record_updates(Us)];
   record_updates([]) -> [].
   
   %% -type icr_clauses([Clause]) -> [Clause].
  
positive.code: %%  that the ordering is correct!
  
  %% First the various attributes.
  form({attribute,Line,module,Mod}) ->
      {attribute,Line,module,Mod};
  form({attribute,Line,file,{File,Line}}) ->	%This is valid anywhere.
      {attribute,Line,file,{File,Line}};
  form({attribute,Line,export,Es0}) ->
      Es1 = farity_list(Es0),
      {attribute,Line,export,Es1};
  form({attribute,Line,import,{Mod,Is0}}) ->
      Is1 = farity_list(Is0),
      {attribute,Line,import,{Mod,Is1}};
  form({attribute,Line,export_type,Es0}) ->
      Es1 = farity_list(Es0),
      {attribute,Line,export_type,Es1};
  form({attribute,Line,optional_callbacks,Es0}) ->
      try farity_list(Es0) of
          Es1 ->
              {attribute,Line,optional_callbacks,Es1}
      catch
          _:_ ->
              {attribute,Line,optional_callbacks,Es0}
      end;
  form({attribute,Line,compile,C}) ->
      {attribute,Line,compile,C};
  form({attribute,Line,record,{Name,Defs0}}) ->
      Defs1 = record_defs(Defs0),
      {attribute,Line,record,{Name,Defs1}};
  form({attribute,Line,asm,{function,N,A,Code}}) ->
      {attribute,Line,asm,{function,N,A,Code}};
  form({attribute,Line,type,{N,T,Vs}}) ->
      T1 = type(T),
      Vs1 = variable_list(Vs),
      {attribute,Line,type,{N,T1,Vs1}};
  form({attribute,Line,opaque,{N,T,Vs}}) ->
      T1 = type(T),
      Vs1 = variable_list(Vs),
      {attribute,Line,opaque,{N,T1,Vs1}};
  form({attribute,Line,spec,{{N,A},FTs}}) ->
      FTs1 = function_type_list(FTs),
      {attribute,Line,spec,{{N,A},FTs1}};
  form({attribute,Line,spec,{{M,N,A},FTs}}) ->
      FTs1 = function_type_list(FTs),
      {attribute,Line,spec,{{M,N,A},FTs1}};
  form({attribute,Line,callback,{{N,A},FTs}}) ->
      FTs1 = function_type_list(FTs),
      {attribute,Line,callback,{{N,A},FTs1}};
  form({attribute,Line,Attr,Val}) ->		%The general attribute.
      {attribute,Line,Attr,Val};
  form({function,Line,Name0,Arity0,Clauses0}) ->
      {Name,Arity,Clauses} = function(Name0, Arity0, Clauses0),
      {function,Line,Name,Arity,Clauses};
  %% Extra forms from the parser.
  form({error,E}) -> {error,E};
  form({warning,W}) -> {warning,W};
  form({eof,Line}) -> {eof,Line}.
  
  %% -type farity_list([Farity]) -> [Farity] when Farity <= {atom(),integer()}.
  
  
negative.code:     [E1|gexpr_list(Es)];
  gexpr_list([]) -> [].
  
  grecord_inits([{record_field,Af,{atom,Aa,F},Val0}|Is]) ->
      Val1 = gexpr(Val0),
      [{record_field,Af,{atom,Aa,F},Val1}|grecord_inits(Is)];
  grecord_inits([{record_field,Af,{var,Aa,'_'},Val0}|Is]) ->
      Val1 = gexpr(Val0),
      [{record_field,Af,{var,Aa,'_'},Val1}|grecord_inits(Is)];
  grecord_inits([]) -> [].
  
  %% -type exprs([Expression]) -> [Expression].
  