Source file test/complit1.go

     1  // errorcheck
     2  
     3  // Copyright 2011 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Verify that illegal composite literals are detected.
     8  // Does not compile.
     9  
    10  package main
    11  
    12  var m map[int][3]int
    13  
    14  func f() [3]int
    15  
    16  func fp() *[3]int
    17  
    18  var mp map[int]*[3]int
    19  
    20  var (
    21  	_ = [3]int{1, 2, 3}[:] // ERROR "slice of unaddressable value"
    22  	_ = m[0][:]            // ERROR "slice of unaddressable value"
    23  	_ = f()[:]             // ERROR "slice of unaddressable value"
    24  
    25  	_ = 301[:]  // ERROR "cannot slice|attempt to slice object that is not"
    26  	_ = 3.1[:]  // ERROR "cannot slice|attempt to slice object that is not"
    27  	_ = true[:] // ERROR "cannot slice|attempt to slice object that is not"
    28  
    29  	// these are okay because they are slicing a pointer to an array
    30  	_ = (&[3]int{1, 2, 3})[:]
    31  	_ = mp[0][:]
    32  	_ = fp()[:]
    33  )
    34  
    35  type T struct {
    36  	i    int
    37  	f    float64
    38  	s    string
    39  	next *T
    40  }
    41  
    42  type TP *T
    43  type Ti int
    44  
    45  var (
    46  	_ = &T{0, 0, "", nil}               // ok
    47  	_ = &T{i: 0, f: 0, s: "", next: {}} // ERROR "missing type in composite literal|omit types within composite literal"
    48  	_ = &T{0, 0, "", {}}                // ERROR "missing type in composite literal|omit types within composite literal"
    49  	_ = TP{i: 0, f: 0, s: ""}           // ERROR "invalid composite literal type TP"
    50  	_ = &Ti{}                           // ERROR "invalid composite literal type Ti|expected.*type for composite literal"
    51  )
    52  
    53  type M map[T]T
    54  
    55  var (
    56  	_ = M{{i: 1}: {i: 2}}
    57  	_ = M{T{i: 1}: {i: 2}}
    58  	_ = M{{i: 1}: T{i: 2}}
    59  	_ = M{T{i: 1}: T{i: 2}}
    60  )
    61  
    62  type S struct{ s [1]*M1 }
    63  type M1 map[S]int
    64  
    65  var _ = M1{{s: [1]*M1{&M1{{}: 1}}}: 2}
    66  

View as plain text