anchor.diff:                  uint64   -> "0, 0"; %% varint-based
                   bool     -> "0, 0"; %% varint-based
                   {enum,_} -> "0, 0"; %% varint-based
  -                fixed32  -> "";
  -                sfixed32 -> "";
  -                float    -> "";
  -                fixed64  -> "";
  -                sfixed64 -> "";
  -                double   -> "";
  +                fixed32  -> if Fill == fill -> "0, 0"; true -> "" end;
  +                sfixed32 -> if Fill == fill -> "0, 0"; true -> "" end;
  +                float    -> if Fill == fill -> "0, 0"; true -> "" end;
  +                fixed64  -> if Fill == fill -> "0, 0"; true -> "" end;
  +                sfixed64 -> if Fill == fill -> "0, 0"; true -> "" end;
  +                double   -> if Fill == fill -> "0, 0"; true -> "" end;
                   string   -> "0, 0"; %% varint-based
                   bytes    -> "0, 0"; %% varint-based
                   {msg,_}  -> "0, 0"  %% varint-based
  
positive.code:     end.
  
  format_field_decoders(MsgName, MsgDef, Opts) ->
      [[format_field_decoder(MsgName, FieldDef, Opts), "\n"]
       || FieldDef <- MsgDef].
  
  format_field_decoder(MsgName, FieldDef, Opts) ->
      case is_packed(FieldDef) of
          false -> format_non_packed_field_decoder(MsgName, FieldDef, Opts);
          true  -> format_packed_field_decoder(MsgName, FieldDef, Opts)
      end.
  
  format_non_packed_field_decoder(MsgName, #field{type=Type}=FieldDef, Opts)->
      case Type of
          sint32   -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          sint64   -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          int32    -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          int64    -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          uint32   -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          uint64   -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          bool     -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          {enum,_} -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          fixed32  -> format_uf32_field_decoder(MsgName, FieldDef);
          sfixed32 -> format_sf32_field_decoder(MsgName, FieldDef);
          float    -> format_float_field_decoder(MsgName, FieldDef);
          fixed64  -> format_uf64_field_decoder(MsgName, FieldDef);
          sfixed64 -> format_sf64_field_decoder(MsgName, FieldDef);
          double   -> format_double_field_decoder(MsgName, FieldDef);
          string   -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          bytes    -> format_vi_based_field_decoder(MsgName, FieldDef, Opts);
          {msg,_}  -> format_vi_based_field_decoder(MsgName, FieldDef, Opts)
      end.
  
  format_packed_field_decoder(MsgName,#field{name=FName}=FieldDef, Opts)->
      DecodePackWrapFn = mk_fn(d_field_, MsgName, FName),
      #field{opts=FOpts} = FieldDef,
      FieldDefAsNonpacked = FieldDef#field{opts = FOpts -- [packed]},
      [f("~p(<<1:1, X:7, Rest/binary>>, N, Acc, Msg) ->~n", [DecodePackWrapFn]),
       f("    ~p(Rest, N+7, X bsl N + Acc, Msg);~n", [DecodePackWrapFn]),
  
negative.code:      f("    <<PackedBytes:Len/binary, Rest2/binary>> = Rest,~n"),
       f("    NewSeq = ~p(PackedBytes~sAccSeq),~n",
         [mk_fn(d_packed_field_, MsgName, FName),
          case mk_field_decoder_vi_params(FieldDefAsNonpacked, no_fill) of
              ""     -> [", "];
              Params -> [", ", Params, ", "]
          end]),
  