# The idea is to set up some types in the TPI stream, and then have records in
# the IPI stream that refer to them.  There are three types of IPI records that
# can refer to TPI records.  They are:
# 1) LF_PROCEDURE - Referred to by LF_FUNC_ID
# 2) LF_STRUCTURE - Referred to by LF_UDT_MOD_SRC_LINE
#                   Referred to by LF_UDT_SRC_LINE
# 3) LF_MFUNCTION - Referred to by LF_MFUNC_ID
# We will set up one of each of these, and then create IPI records that refer to
# them.  We intentionally choose an unintuitive ordering of the records in both
# streams (while still maintaining the topological sorting required by CodeView
# type streams), to make sure the merging algorithm is sufficiently exercised.
# For easy understanding, a semantic representation of the types we will set up
# is as follows:
#  - int main(int, char**)
#
#  - struct FooBar {
#    public:
#      void *FooMember;
#      void FooMethod(int);
#    };
TpiStream:
  Records:
    # TypeIndex: 4096 (0x1000)
    # char**
    - Kind:            LF_POINTER
      Pointer:         
        ReferentType:    1136
        Attrs:           32778
    # TypeIndex: 4097 (0x1001)
    # public void *FooMember
    - Kind:            LF_FIELDLIST
      FieldList:       
        - Kind:            LF_MEMBER
          DataMember:      
            Attrs:           3           # public
            Type:            1027        # void*
            FieldOffset:     0
            Name:            FooMember   # FooMember
    # TypeIndex: 4098 (0x1002)
    # (int, char**)
    - Kind:            LF_ARGLIST
      ArgList:         
        ArgIndices:      [ 116, 4096 ]
    # TypeIndex: 4099 (0x1003)
    # struct FooBar {
    # public:
    #   void *FooMember;
    # };
    - Kind:            LF_STRUCTURE
      Class:           
        MemberCount:     1
        Options:         [ None, HasUniqueName ]
        FieldList:       4097
        Name:            FooBar
        UniqueName:      'FooBar'
        DerivationList:  0
        VTableShape:     0
        Size:            4
    # TypeIndex: 4100 (0x1004)
    # FooBar *
    - Kind:            LF_POINTER
      Pointer:         
        ReferentType:    4099       # FooBar
        Attrs:           32778
    # TypeIndex: 4101 (0x1005)
    # (int)
    - Kind:            LF_ARGLIST
      ArgList:         
        ArgIndices:      [ 116 ]
    # TypeIndex: 4102 (0x1006)
    - Kind:            LF_MFUNCTION
      MemberFunction:  
        ReturnType:      3                      # void
        ClassType:       4099                   # struct FooBar
        ThisType:        4100                   # FooBar *
        CallConv:        ThisCall
        Options:         [ None, Constructor ]
        ParameterCount:  1
        ArgumentList:    4101                   # (int)
        ThisPointerAdjustment: 0
    # TypeIndex: 4103 (0x1007)
    # int (int, char**)
    - Kind:            LF_PROCEDURE
      Procedure:       
        ReturnType:      116         # int
        CallConv:        NearC
        Options:         [ None ]
        ParameterCount:  2
        ArgumentList:    4098        # (int, char**)
IpiStream:
  Records:
    # TypeIndex: 4096 (0x1000)
    # int main(int, char **)
    - Kind:            LF_FUNC_ID
      FuncId:          
        ParentScope:     0
        FunctionType:    4103       # int main(int, char**)
        Name:            main
    # TypeIndex: 4097 (0x1001)
    # void FooBar::FooMethod(int)
    - Kind:            LF_MFUNC_ID
      MemberFuncId:    
        ClassType:       4099       # struct FooBar
        FunctionType:    4102       # void FooMethod(int)
        Name:            FooMethod
    # TypeIndex: 4098 (0x1002)
    # struct FooBar
    - Kind:            LF_UDT_MOD_SRC_LINE
      UdtModSourceLine: 
        UDT:             4099       # struct FooBar
        SourceFile:      0          # We don't support this yet
        LineNumber:      0
        Module:          0          # We don't support this yet
