github.com/jd-ly/tools@v0.5.7/go/ssa/interp/testdata/complit.go (about)

     1  package main
     2  
     3  // Tests of composite literals.
     4  
     5  import "fmt"
     6  
     7  // Map literals.
     8  // TODO(adonovan): we can no longer print maps
     9  // until the interpreter supports (reflect.Value).MapRange.
    10  func _() {
    11  	type M map[int]int
    12  	m1 := []*M{{1: 1}, &M{2: 2}}
    13  	want := "map[1:1] map[2:2]"
    14  	if got := fmt.Sprint(*m1[0], *m1[1]); got != want {
    15  		panic(got)
    16  	}
    17  	m2 := []M{{1: 1}, M{2: 2}}
    18  	if got := fmt.Sprint(m2[0], m2[1]); got != want {
    19  		panic(got)
    20  	}
    21  }
    22  
    23  // Nonliteral keys in composite literal.
    24  func init() {
    25  	const zero int = 1
    26  	var v = []int{1 + zero: 42}
    27  	if x := fmt.Sprint(v); x != "[0 0 42]" {
    28  		panic(x)
    29  	}
    30  }
    31  
    32  // Test for in-place initialization.
    33  func init() {
    34  	// struct
    35  	type S struct {
    36  		a, b int
    37  	}
    38  	s := S{1, 2}
    39  	s = S{b: 3}
    40  	if s.a != 0 {
    41  		panic("s.a != 0")
    42  	}
    43  	if s.b != 3 {
    44  		panic("s.b != 3")
    45  	}
    46  	s = S{}
    47  	if s.a != 0 {
    48  		panic("s.a != 0")
    49  	}
    50  	if s.b != 0 {
    51  		panic("s.b != 0")
    52  	}
    53  
    54  	// array
    55  	type A [4]int
    56  	a := A{2, 4, 6, 8}
    57  	a = A{1: 6, 2: 4}
    58  	if a[0] != 0 {
    59  		panic("a[0] != 0")
    60  	}
    61  	if a[1] != 6 {
    62  		panic("a[1] != 6")
    63  	}
    64  	if a[2] != 4 {
    65  		panic("a[2] != 4")
    66  	}
    67  	if a[3] != 0 {
    68  		panic("a[3] != 0")
    69  	}
    70  	a = A{}
    71  	if a[0] != 0 {
    72  		panic("a[0] != 0")
    73  	}
    74  	if a[1] != 0 {
    75  		panic("a[1] != 0")
    76  	}
    77  	if a[2] != 0 {
    78  		panic("a[2] != 0")
    79  	}
    80  	if a[3] != 0 {
    81  		panic("a[3] != 0")
    82  	}
    83  }
    84  
    85  // Regression test for https://golang.org/issue/10127:
    86  // composite literal clobbers destination before reading from it.
    87  func init() {
    88  	// map
    89  	{
    90  		type M map[string]int
    91  		m := M{"x": 1, "y": 2}
    92  		m = M{"x": m["y"], "y": m["x"]}
    93  		if m["x"] != 2 || m["y"] != 1 {
    94  			panic(fmt.Sprint(m))
    95  		}
    96  
    97  		n := M{"x": 3}
    98  		m, n = M{"x": n["x"]}, M{"x": m["x"]} // parallel assignment
    99  		if got := fmt.Sprint(m["x"], n["x"]); got != "3 2" {
   100  			panic(got)
   101  		}
   102  	}
   103  
   104  	// struct
   105  	{
   106  		type T struct{ x, y, z int }
   107  		t := T{x: 1, y: 2, z: 3}
   108  
   109  		t = T{x: t.y, y: t.z, z: t.x} // all fields
   110  		if got := fmt.Sprint(t); got != "{2 3 1}" {
   111  			panic(got)
   112  		}
   113  
   114  		t = T{x: t.y, y: t.z + 3} // not all fields
   115  		if got := fmt.Sprint(t); got != "{3 4 0}" {
   116  			panic(got)
   117  		}
   118  
   119  		u := T{x: 5, y: 6, z: 7}
   120  		t, u = T{x: u.x}, T{x: t.x} // parallel assignment
   121  		if got := fmt.Sprint(t, u); got != "{5 0 0} {3 0 0}" {
   122  			panic(got)
   123  		}
   124  	}
   125  
   126  	// array
   127  	{
   128  		a := [3]int{0: 1, 1: 2, 2: 3}
   129  
   130  		a = [3]int{0: a[1], 1: a[2], 2: a[0]} //  all elements
   131  		if got := fmt.Sprint(a); got != "[2 3 1]" {
   132  			panic(got)
   133  		}
   134  
   135  		a = [3]int{0: a[1], 1: a[2] + 3} //  not all elements
   136  		if got := fmt.Sprint(a); got != "[3 4 0]" {
   137  			panic(got)
   138  		}
   139  
   140  		b := [3]int{0: 5, 1: 6, 2: 7}
   141  		a, b = [3]int{0: b[0]}, [3]int{0: a[0]} // parallel assignment
   142  		if got := fmt.Sprint(a, b); got != "[5 0 0] [3 0 0]" {
   143  			panic(got)
   144  		}
   145  	}
   146  
   147  	// slice
   148  	{
   149  		s := []int{0: 1, 1: 2, 2: 3}
   150  
   151  		s = []int{0: s[1], 1: s[2], 2: s[0]} //  all elements
   152  		if got := fmt.Sprint(s); got != "[2 3 1]" {
   153  			panic(got)
   154  		}
   155  
   156  		s = []int{0: s[1], 1: s[2] + 3} //  not all elements
   157  		if got := fmt.Sprint(s); got != "[3 4]" {
   158  			panic(got)
   159  		}
   160  
   161  		t := []int{0: 5, 1: 6, 2: 7}
   162  		s, t = []int{0: t[0]}, []int{0: s[0]} // parallel assignment
   163  		if got := fmt.Sprint(s, t); got != "[5] [3]" {
   164  			panic(got)
   165  		}
   166  	}
   167  }
   168  
   169  // Regression test for https://golang.org/issue/13341:
   170  // within a map literal, if a key expression is a composite literal,
   171  // Go 1.5 allows its type to be omitted.  An & operation may be implied.
   172  func init() {
   173  	type S struct{ x int }
   174  	// same as map[*S]bool{&S{x: 1}: true}
   175  	m := map[*S]bool{{x: 1}: true}
   176  	for s := range m {
   177  		if s.x != 1 {
   178  			panic(s) // wrong key
   179  		}
   180  		return
   181  	}
   182  	panic("map is empty")
   183  }
   184  
   185  func main() {
   186  }