pass_map_ptr_value.go raw

   1  package main
   2  
   3  type PtrItem struct {
   4  	Value int32
   5  }
   6  
   7  type PtrContainer struct {
   8  	Items map[string]*PtrItem
   9  	First *PtrItem
  10  }
  11  
  12  func makePtrContainer() (c PtrContainer) {
  13  	c.Items = map[string]*PtrItem{}
  14  	item := &PtrItem{Value: 42}
  15  	c.Items["a"] = item
  16  	c.First = item
  17  	return
  18  }
  19  
  20  func makePtrContainerPtr() (c *PtrContainer) {
  21  	c = &PtrContainer{}
  22  	c.Items = map[string]*PtrItem{}
  23  	item := &PtrItem{Value: 99}
  24  	c.Items["b"] = item
  25  	c.First = item
  26  	return
  27  }
  28  
  29  type NestedMapStruct struct {
  30  	Inner NestedInner
  31  	Tag   int32
  32  }
  33  
  34  type NestedInner struct {
  35  	M map[string]int32
  36  }
  37  
  38  func makeNested() (n NestedMapStruct) {
  39  	n = NestedMapStruct{
  40  		Inner: NestedInner{M: map[string]int32{"n": 7, "m": 8}},
  41  		Tag:   123,
  42  	}
  43  	return
  44  }
  45  
  46  func main() {
  47  	c := makePtrContainer()
  48  	if c.First.Value == 42 && c.Items["a"].Value == 42 {
  49  		println("PASS:map-ptr-value-reloc")
  50  	} else {
  51  		println("FAIL:map-ptr-value-reloc")
  52  	}
  53  
  54  	cp := makePtrContainerPtr()
  55  	if cp.First.Value == 99 && cp.Items["b"].Value == 99 {
  56  		println("PASS:map-ptr-value-ptr-reloc")
  57  	} else {
  58  		println("FAIL:map-ptr-value-ptr-reloc")
  59  	}
  60  
  61  	n := makeNested()
  62  	if n.Inner.M["n"] == 7 && n.Inner.M["m"] == 8 && n.Tag == 123 {
  63  		println("PASS:map-nested-struct-return")
  64  	} else {
  65  		println("FAIL:map-nested-struct-return")
  66  	}
  67  }
  68