golang.org/x/exp@v0.0.0-20240506185415-9bf2ced13842/apidiff/testdata/basics.go (about)

     1  package p
     2  
     3  // Same type in both: OK.
     4  // both
     5  type A int
     6  
     7  // Changing the type is an incompatible change.
     8  // old
     9  type B int
    10  
    11  // new
    12  // i B: changed from int to string
    13  type B string
    14  
    15  // Adding a new type, whether alias or not, is a compatible change.
    16  // new
    17  // c AA: added
    18  type AA = A
    19  
    20  // c B1: added
    21  type B1 bool
    22  
    23  // Change of type for an unexported name doesn't matter...
    24  // old
    25  type t int
    26  
    27  // new
    28  type t string // OK: t isn't part of the API
    29  
    30  // ...unless it is exposed.
    31  // both
    32  var V2 u
    33  
    34  // old
    35  type u string
    36  
    37  // new
    38  // i u: changed from string to int
    39  type u int
    40  
    41  // An exposed, unexported type can be renamed.
    42  // both
    43  type u2 int
    44  
    45  // old
    46  type u1 int
    47  
    48  var V5 u1
    49  
    50  // new
    51  var V5 u2 // OK: V5 has changed type, but old u1 corresopnds to new u2
    52  
    53  // Splitting a single type into two is an incompatible change.
    54  // both
    55  type u3 int
    56  
    57  // old
    58  type (
    59  	Split1 = u1
    60  	Split2 = u1
    61  )
    62  
    63  // new
    64  type (
    65  	Split1 = u2 // OK, since old u1 corresponds to new u2
    66  
    67  	// This tries to make u1 correspond to u3
    68  	// i Split2: changed from u1 to u3
    69  	Split2 = u3
    70  )
    71  
    72  // Merging two types into one is OK.
    73  // old
    74  type (
    75  	GoodMerge1 = u2
    76  	GoodMerge2 = u3
    77  )
    78  
    79  // new
    80  type (
    81  	GoodMerge1 = u3
    82  	GoodMerge2 = u3
    83  )
    84  
    85  // Merging isn't OK here because a method is lost.
    86  // both
    87  type u4 int
    88  
    89  func (u4) M() {}
    90  
    91  // old
    92  type (
    93  	BadMerge1 = u3
    94  	BadMerge2 = u4
    95  )
    96  
    97  // new
    98  type (
    99  	BadMerge1 = u3
   100  	// i u4.M: removed
   101  	// What's really happening here is that old u4 corresponds to new u3,
   102  	// and new u3's method set is not a superset of old u4's.
   103  	BadMerge2 = u3
   104  )
   105  
   106  // old
   107  type Rem int
   108  
   109  // new
   110  // i Rem: removed