cloudfoundry-community/bosh-cloudstack-cpi

View on GitHub
go_agent/src/code.google.com/p/go.tools/go/types/testdata/expr3.src

Summary

Maintainability
Test Coverage
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package expr3

func indexes() {
    _ = 1 /* ERROR "cannot index" */ [0]
    _ = indexes /* ERROR "cannot index" */ [0]
    _ = ( /* ERROR "cannot slice" */ 12 + 3)[1:2]

    var a [10]int
    _ = a[true /* ERROR "cannot convert" */ ]
    _ = a["foo" /* ERROR "cannot convert" */ ]
    _ = a[1.1 /* ERROR "truncated" */ ]
    _ = a[1.0]
    _ = a[- /* ERROR "negative" */ 1]
    _ = a[- /* ERROR "negative" */ 1 :]
    _ = a[: - /* ERROR "negative" */ 1]
    _ = a[::] /* ERROR "3-index slice" */
    _ = a[0::] /* ERROR "3-index slice" */
    _ = a[0::10] /* ERROR "3-index slice" */
    _ = a[:10:10]

    var a0 int
    a0 = a[0]
    _ = a0
    var a1 int32
    a1 = a /* ERROR "cannot assign" */ [1] 
    _ = a1

    _ = a[9]
    _ = a[10 /* ERROR "index .* out of bounds" */ ]
    _ = a[1 /* ERROR "overflows" */ <<100]
    _ = a[10:]
    _ = a[:10]
    _ = a[10:10]
    _ = a[11 /* ERROR "index .* out of bounds" */ :]
    _ = a[: 11 /* ERROR "index .* out of bounds" */ ]
    _ = a[: 1 /* ERROR "overflows" */ <<100]
    _ = a[:10:10]
    _ = a[:11 /* ERROR "index .* out of bounds" */ :10]
    _ = a[:10:11 /* ERROR "index .* out of bounds" */ ]
    _ = a[10:0:10] /* ERROR "invalid slice indices" */
    _ = a[0:10:0] /* ERROR "invalid slice indices" */
    _ = a[10:0:0] /* ERROR "invalid slice indices" */

    pa := &a
    _ = pa[9]
    _ = pa[10 /* ERROR "index .* out of bounds" */ ]
    _ = pa[1 /* ERROR "overflows" */ <<100]
    _ = pa[10:]
    _ = pa[:10]
    _ = pa[10:10]
    _ = pa[11 /* ERROR "index .* out of bounds" */ :]
    _ = pa[: 11 /* ERROR "index .* out of bounds" */ ]
    _ = pa[: 1 /* ERROR "overflows" */ <<100]
    _ = pa[:10:10]
    _ = pa[:11 /* ERROR "index .* out of bounds" */ :10]
    _ = pa[:10:11 /* ERROR "index .* out of bounds" */ ]
    _ = pa[10:0:10] /* ERROR "invalid slice indices" */
    _ = pa[0:10:0] /* ERROR "invalid slice indices" */
    _ = pa[10:0:0] /* ERROR "invalid slice indices" */

    var b [0]int
    _ = b[0 /* ERROR "index .* out of bounds" */ ]
    _ = b[:]
    _ = b[0:]
    _ = b[:0]
    _ = b[0:0]
    _ = b[0:0:0]
    _ = b[1 /* ERROR "index .* out of bounds" */ :0:0]

    var s []int
    _ = s[- /* ERROR "negative" */ 1]
    _ = s[- /* ERROR "negative" */ 1 :]
    _ = s[: - /* ERROR "negative" */ 1]
    _ = s[0]
    _ = s[1:2]
    _ = s[2:1] /* ERROR "invalid slice indices" */
    _ = s[2:]
    _ = s[: 1 /* ERROR "overflows" */ <<100]
    _ = s[1 /* ERROR "overflows" */ <<100 :]
    _ = s[1 /* ERROR "overflows" */ <<100 : 1 /* ERROR "overflows" */ <<100]
    _ = s[::] /* ERROR "3-index slice" */
    _ = s[:10:10]
    _ = s[10:0:10] /* ERROR "invalid slice indices" */
    _ = s[0:10:0] /* ERROR "invalid slice indices" */
    _ = s[10:0:0] /* ERROR "invalid slice indices" */

    var t string
    _ = t[- /* ERROR "negative" */ 1]
    _ = t[- /* ERROR "negative" */ 1 :]
    _ = t[: - /* ERROR "negative" */ 1]
    _ = t /* ERROR "3-index slice of string" */ [1:2:3]
    _ = "foo" /* ERROR "3-index slice of string" */ [1:2:3]
    var t0 byte
    t0 = t[0]
    _ = t0
    var t1 rune
    t1 = t /* ERROR "cannot assign" */ [2]
    _ = t1
    _ = ("foo" + "bar")[5]
    _ = ("foo" + "bar")[6 /* ERROR "index .* out of bounds" */ ]

    const c = "foo"
    _ = c[- /* ERROR "negative" */ 1]
    _ = c[- /* ERROR "negative" */ 1 :]
    _ = c[: - /* ERROR "negative" */ 1]
    var c0 byte
    c0 = c[0]
    _ = c0
    var c2 float32
    c2 = c /* ERROR "cannot assign" */ [2]
    _ = c[3 /* ERROR "index .* out of bounds" */ ]
    _ = ""[0 /* ERROR "index .* out of bounds" */ ]
    _ = c2

    _ = s[1<<30] // no compile-time error here

    // issue 4913
    type mystring string
    var ss string
    var ms mystring
    var i, j int
    ss = "foo"[1:2]
    ss = "foo"[i:j]
    ms = "foo" /* ERROR "cannot assign" */ [1:2]
    ms = "foo" /* ERROR "cannot assign" */ [i:j]
    _, _ = ss, ms
}

type T struct {
    x int
    y func()
}

func (*T) m() {}

func method_expressions() {
    _ = T /* ERROR "no field or method" */ .a
    _ = T /* ERROR "has no method" */ .x
    _ = T /* ERROR "not in method set" */ .m
    _ = (*T).m

    var f func(*T) = T /* ERROR "not in method set" */ .m
    var g func(*T) = (*T).m
    _, _ = f, g

    _ = T /* ERROR "has no method" */ .y
    _ = ( /* ERROR "has no method" */ *T).y
}

func struct_literals() {
    type T0 struct {
        a, b, c int
    }

    type T1 struct {
        T0
        a, b int
        u float64
        s string
    }

    // keyed elements
    _ = T1{}
    _ = T1{a: 0, 1 /* ERROR "mixture of .* elements" */ }
    _ = T1{aa /* ERROR "unknown field" */ : 0}
    _ = T1{1 /* ERROR "invalid field name" */ : 0}
    _ = T1{a: 0, s: "foo", u: 0, a /* ERROR "duplicate field" */: 10}
    _ = T1{a: "foo" /* ERROR "cannot convert" */ }
    _ = T1{c /* ERROR "unknown field" */ : 0}
    _ = T1{T0: { /* ERROR "missing type" */ }}
    _ = T1{T0: T0{}}
    _ = T1{T0 /* ERROR "invalid field name" */ .a: 0}

    // unkeyed elements
    _ = T0{1, 2, 3}
    _ = T0{1, b /* ERROR "mixture" */ : 2, 3}
    _ = T0{1, 2} /* ERROR "too few values" */
    _ = T0{1, 2, 3, 4  /* ERROR "too many values" */ }
    _ = T0{1, "foo" /* ERROR "cannot convert" */, 3.4  /* ERROR "truncated" */}

    // invalid type
    type P *struct{
        x int
    }
    _ = P /* ERROR "invalid composite literal type" */ {}
}

func array_literals() {
    type A0 [0]int
    _ = A0{}
    _ = A0{0 /* ERROR "index .* out of bounds" */}
    _ = A0{0 /* ERROR "index .* out of bounds" */ : 0}

    type A1 [10]int
    _ = A1{}
    _ = A1{0, 1, 2}
    _ = A1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    _ = A1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /* ERROR "index .* out of bounds" */ }
    _ = A1{- /* ERROR "negative" */ 1: 0}
    _ = A1{8: 8, 9}
    _ = A1{8: 8, 9, 10 /* ERROR "index .* out of bounds" */ }
    _ = A1{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4}
    _ = A1{5: 5, 6, 7, 3: 3, 4}
    _ = A1{5: 5, 6, 7, 3: 3, 4, 5 /* ERROR "duplicate index" */ }
    _ = A1{10 /* ERROR "index .* out of bounds" */ : 10, 10 /* ERROR "index .* out of bounds" */ : 10}
    _ = A1{5: 5, 6, 7, 3: 3, 1 /* ERROR "overflows" */ <<100: 4, 5 /* ERROR "duplicate index" */ }
    _ = A1{5: 5, 6, 7, 4: 4, 1 /* ERROR "overflows" */ <<100: 4}
    _ = A1{2.0}
    _ = A1{2.1 /* ERROR "truncated" */ }
    _ = A1{"foo" /* ERROR "cannot convert" */ }

    // indices must be integer constants
    i := 1
    const f = 2.1
    const s = "foo"
    _ = A1{i /* ERROR "index i must be integer constant" */ : 0}
    _ = A1{f /* ERROR "truncated" */ : 0}
    _ = A1{s /* ERROR "cannot convert" */ : 0}

    a0 := [...]int{}
    assert(len(a0) == 0)
    
    a1 := [...]int{0, 1, 2}
    assert(len(a1) == 3)
    var a13 [3]int
    var a14 [4]int
    a13 = a1
    a14 = a1 /* ERROR "cannot assign" */
    _, _ = a13, a14
    
    a2 := [...]int{- /* ERROR "negative" */ 1: 0}
    _ = a2

    a3 := [...]int{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4}
    assert(len(a3) == 5) // somewhat arbitrary

    a4 := [...]complex128{0, 1, 2, 1<<10-2: -1i, 1i, 400: 10, 12, 14}
    assert(len(a4) == 1024)

    // from the spec
    type Point struct { x, y float32 }
    _ = [...]Point{Point{1.5, -3.5}, Point{0, 0}}
    _ = [...]Point{{1.5, -3.5}, {0, 0}}
    _ = [][]int{[]int{1, 2, 3}, []int{4, 5}}
    _ = [][]int{{1, 2, 3}, {4, 5}}
    _ = [...]*Point{&Point{1.5, -3.5}, &Point{0, 0}}
    _ = [...]*Point{{1.5, -3.5}, {0, 0}}
}

func slice_literals() {
    type S0 []int
    _ = S0{}
    _ = S0{0, 1, 2}
    _ = S0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    _ = S0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    _ = S0{- /* ERROR "negative" */ 1: 0}
    _ = S0{8: 8, 9}
    _ = S0{8: 8, 9, 10}
    _ = S0{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4}
    _ = S0{5: 5, 6, 7, 3: 3, 4}
    _ = S0{5: 5, 6, 7, 3: 3, 4, 5 /* ERROR "duplicate index" */ }
    _ = S0{10: 10, 10 /* ERROR "duplicate index" */ : 10}
    _ = S0{5: 5, 6, 7, 3: 3, 1 /* ERROR "overflows" */ <<100: 4, 5 /* ERROR "duplicate index" */ }
    _ = S0{5: 5, 6, 7, 4: 4, 1 /* ERROR "overflows" */ <<100: 4}
    _ = S0{2.0}
    _ = S0{2.1 /* ERROR "truncated" */ }
    _ = S0{"foo" /* ERROR "cannot convert" */ }

    // indices must be resolved correctly
    const index1 = 1
    _ = S0{index1: 1}
    _ = S0{index2: 2}
    _ = S0{index3 /* ERROR "undeclared name" */ : 3}

    // indices must be integer constants
    i := 1
    const f = 2.1
    const s = "foo"
    _ = S0{i /* ERROR "index i must be integer constant" */ : 0}
    _ = S0{f /* ERROR "truncated" */ : 0}
    _ = S0{s /* ERROR "cannot convert" */ : 0}

}

const index2 int = 2

func map_literals() {
    type M0 map[string]int
    type M1 map[bool]int
    type M2 map[*int]int

    _ = M0{}
    _ = M0{1 /* ERROR "missing key" */ }
    _ = M0{1 /* ERROR "cannot convert" */ : 2}
    _ = M0{"foo": "bar" /* ERROR "cannot convert" */ }
    _ = M0{"foo": 1, "bar": 2, "foo" /* ERROR "duplicate key" */ : 3 }

    // map keys must be resolved correctly
    key1 := "foo"
    _ = M0{key1: 1}
    _ = M0{key2: 2}
    _ = M0{key3 /* ERROR "undeclared name" */ : 2}

    var value int
    _ = M1{true: 1, false: 0}
    _ = M2{nil: 0, &value: 1}
}

var key2 string = "bar"

type I interface {
    m()
}

type I2 interface {
    m(int)
}

type T1 struct{}
type T2 struct{}

func (T2) m(int) {}

func type_asserts() {
    var x int
    _ = x /* ERROR "not an interface" */ .(int)

    var e interface{}
    var ok bool
    x, ok = e.(int)
    _ = ok

    var t I
    _ = t /* ERROR "use of .* outside type switch" */ .(type)
    _ = t /* ERROR "missing method m" */ .(T)
    _ = t.(*T)
    _ = t /* ERROR "missing method m" */ .(T1)
    _ = t /* ERROR "wrong type for method m" */ .(T2)
    _ = t /* ERROR "wrong type for method m" */ .(I2)

    // e doesn't statically have an m, but may have one dynamically.
    _ = e.(I2)
}

func f0() {}
func f1(x int) {}
func f2(u float32, s string) {}
func fs(s []byte) {}
func fv(x ...int) {}
func fi(x ... interface{}) {}
func (T) fm(x ...int)

func g0() {}
func g1() int { return 0}
func g2() (u float32, s string) { return }
func gs() []byte { return nil }

func _calls() {
    var x int
    var y float32
    var s []int

    f0()
    _ = f0 /* ERROR "used as value" */ ()
    f0(g0 /* ERROR "too many arguments" */ )

    f1(0)
    f1(x)
    f1(10.0)
    f1() /* ERROR "too few arguments" */
    f1(x, y /* ERROR "too many arguments" */ )
    f1(s /* ERROR "cannot pass" */ )
    f1(x ... /* ERROR "cannot use ..." */ )
    f1(g0 /* ERROR "used as value" */ ())
    f1(g1())
    // f1(g2()) // TODO(gri) missing position in error message

    f2() /* ERROR "too few arguments" */
    f2(3.14) /* ERROR "too few arguments" */
    f2(3.14, "foo")
    f2(x /* ERROR "cannot pass" */ , "foo")
    f2(g0 /* ERROR "used as value" */ ()) /* ERROR "too few arguments" */
    f2(g1 /* ERROR "cannot pass" */ ()) /* ERROR "too few arguments" */
    f2(g2())

    fs() /* ERROR "too few arguments" */
    fs(g0 /* ERROR "used as value" */ ())
    fs(g1 /* ERROR "cannot pass" */ ())
    fs(g2 /* ERROR "cannot pass" */ /* ERROR "too many arguments" */ ())
    fs(gs())

    fv()
    fv(1, 2.0, x)
    fv(s /* ERROR "cannot pass" */ )
    fv(s...)
    fv(x /* ERROR "cannot use" */ ...)
    fv(1, s /* ERROR "can only use ... with matching parameter" */ ...)
    fv(gs /* ERROR "cannot pass" */ ())
    fv(gs /* ERROR "cannot pass" */ ()...)

    var t T
    t.fm()
    t.fm(1, 2.0, x)
    t.fm(s /* ERROR "cannot pass" */ )
    t.fm(g1())
    t.fm(1, s /* ERROR "can only use ... with matching parameter" */ ...)
    t.fm(gs /* ERROR "cannot pass" */ ())
    t.fm(gs /* ERROR "cannot pass" */ ()...)

    T.fm(t, )
    T.fm(t, 1, 2.0, x)
    T.fm(t, s /* ERROR "cannot pass" */ )
    T.fm(t, g1())
    T.fm(t, 1, s /* ERROR "can only use ... with matching parameter" */ ...)
    T.fm(t, gs /* ERROR "cannot pass" */ ())
    T.fm(t, gs /* ERROR "cannot pass" */ ()...)

    var i interface{ fm(x ...int) } = t
    i.fm()
    i.fm(1, 2.0, x)
    i.fm(s /* ERROR "cannot pass" */ )
    i.fm(g1())
    i.fm(1, s /* ERROR "can only use ... with matching parameter" */ ...)
    i.fm(gs /* ERROR "cannot pass" */ ())
    i.fm(gs /* ERROR "cannot pass" */ ()...)

    fi()
    fi(1, 2.0, x, 3.14, "foo")
    fi(g2())
    fi(0, g2)
    fi(0, g2 /* ERROR "2-valued expression" */ ())
}

func issue6344() {
    type T []interface{}
    var x T
    fi(x...) // ... applies also to named slices
}