// 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 import "time" func indexes() { var x int _ = 1 /* ERROR "cannot index" */ [0] _ = x /* 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 "middle index required" */ : /* ERROR "final index required" */ ] _ = a[0: /* ERROR "middle index required" */ : /* ERROR "final index required" */ ] _ = a[0: /* ERROR "middle index required" */ :10] _ = a[:10:10] var a0 int a0 = a[0] _ = a0 var a1 int32 a1 = a /* ERROR "cannot use .* in assignment" */ [1] _ = a1 _ = a[9] _ = a[10 /* ERROR "index .* out of bounds" */ ] _ = a[1 /* ERROR "overflows" */ <<100] _ = a[1<< /* ERROR "constant shift overflow" */ 1000] // no out-of-bounds follow-on error _ = 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" */ _ = &a /* ERROR "cannot take address" */ [:10] 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" */ _ = &pa /* ERROR "cannot take address" */ [:10] 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 "middle index required" */ : /* ERROR "final index required" */ ] _ = 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" */ _ = &s /* ERROR "cannot take address" */ [:10] var m map[string]int _ = m[0 /* ERROR "cannot use .* in map index" */ ] _ = m /* ERROR "cannot slice" */ ["foo" : "bar"] _ = m["foo"] // ok is of type bool type mybool bool var ok mybool _, ok = m["bar"] _ = ok _ = m[0 /* ERROR "cannot use 0" */ ] + "foo" // ERROR "mismatched types int and untyped string" 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 use .* in assignment" */ [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 use .* in assignment" */ [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 use .* in assignment" */ [1:2] ms = "foo" /* ERROR "cannot use .* in assignment" */ [i:j] _, _ = ss, ms } type T struct { x int y func() } func (*T) m() {} func method_expressions() { _ = T.a /* ERROR "no field or method" */ _ = T.x /* ERROR "has no method" */ _ = T.m /* ERROR "cannot call pointer method m on T" */ _ = (*T).m var f func(*T) = T.m /* ERROR "cannot call pointer method m on T" */ var g func(*T) = (*T).m _, _ = f, g _ = T.y /* ERROR "has no method" */ _ = (*T).y /* ERROR "has no method" */ } 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 use .* in struct literal" */ } _ = T1{c /* ERROR "unknown field" */ : 0} _ = T1{T0: { /* ERROR "missing type" */ }} // struct literal element type may not be elided _ = 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 use .* in struct literal" */, 3.4 /* ERROR "cannot use .*\(truncated\)" */} // invalid type type P *struct{ x int } _ = P /* ERROR "invalid composite literal type" */ {} // unexported fields _ = time.Time{} _ = time.Time{sec /* ERROR "unknown field" */ : 0} _ = time.Time{ 0 /* ERROR implicit assignment to unexported field wall in time.Time literal */, 0 /* ERROR implicit assignment */ , nil /* ERROR implicit assignment */ , } } 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 use .* in array or slice literal" */ } // 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 use .* in assignment" */ _, _ = 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) // composite literal element types may be elided type T []int _ = [10]T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}} a6 := [...]T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}} assert(len(a6) == 8) // recursively so _ = [10][10]T{{}, [10]T{{}}, {{1, 2, 3}}} // 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 use .* in array or slice literal" */ } // 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} // composite literal element types may be elided type T []int _ = []T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}} _ = [][]int{{1, 2, 3}, {4, 5}} // recursively so _ = [][]T{{}, []T{{}}, {{1, 2, 3}}} // issue 17954 type T0 *struct { s string } _ = []T0{{}} _ = []T0{{"foo"}} type T1 *struct{ int } _ = []T1{} _ = []T1{{0}, {1}, {2}} type T2 T1 _ = []T2{} _ = []T2{{0}, {1}, {2}} _ = map[T0]T2{} _ = map[T0]T2{{}: {}} } const index2 int = 2 type N int func (N) f() {} 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 use .* in map literal" */ : 2} _ = M0{"foo": "bar" /* ERROR "cannot use .* in map literal" */ } _ = M0{"foo": 1, "bar": 2, "foo" /* ERROR "duplicate key" */ : 3 } _ = map[interface{}]int{2: 1, 2 /* ERROR "duplicate key" */ : 1} _ = map[interface{}]int{int(2): 1, int16(2): 1} _ = map[interface{}]int{int16(2): 1, int16 /* ERROR "duplicate key" */ (2): 1} type S string _ = map[interface{}]int{"a": 1, "a" /* ERROR "duplicate key" */ : 1} _ = map[interface{}]int{"a": 1, S("a"): 1} _ = map[interface{}]int{S("a"): 1, S /* ERROR "duplicate key" */ ("a"): 1} _ = map[interface{}]int{1.0: 1, 1.0 /* ERROR "duplicate key" */: 1} _ = map[interface{}]int{int64(-1): 1, int64 /* ERROR "duplicate key" */ (-1) : 1} _ = map[interface{}]int{^uint64(0): 1, ^ /* ERROR "duplicate key" */ uint64(0): 1} _ = map[interface{}]int{complex(1,2): 1, complex /* ERROR "duplicate key" */ (1,2) : 1} type I interface { f() } _ = map[I]int{N(0): 1, N(2): 1} _ = map[I]int{N(2): 1, N /* ERROR "duplicate key" */ (2): 1} // 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} // composite literal element types may be elided type T [2]int _ = map[int]T{0: T{3, 4}, 1: {5, 6}} // recursively so _ = map[int][]T{0: {}, 1: {{}, T{1, 2}}} // composite literal key types may be elided _ = map[T]int{T{3, 4}: 0, {5, 6}: 1} // recursively so _ = map[[2]T]int{{}: 0, {{}}: 1, [2]T{{}}: 2, {T{1, 2}}: 3} // composite literal element and key types may be elided _ = map[T]T{{}: {}, {1, 2}: T{3, 4}, T{4, 5}: {}} _ = map[T]M0{{} : {}, T{1, 2}: M0{"foo": 0}, {1, 3}: {"foo": 1}} // recursively so _ = map[[2]T][]T{{}: {}, {{}}: {{}, T{1, 2}}, [2]T{{}}: nil, {T{1, 2}}: {{}, {}}} // from the spec type Point struct { x, y float32 } _ = map[string]Point{"orig": {0, 0}} _ = map[*Point]string{{0, 0}: "orig"} // issue 17954 type T0 *struct{ s string } type T1 *struct{ int } type T2 T1 _ = map[T0]T2{} _ = map[T0]T2{{}: {}} } var key2 string = "bar" type I interface { m() } type I2 interface { m(int) } type T1 struct{} type T2 struct{} func (T2) m(int) {} type mybool bool func type_asserts() { var x int _ = x /* ERROR "not an interface" */ .(int) var e interface{} var ok bool x, ok = e.(int) _ = ok // ok value is of type bool var myok mybool _, myok = e.(int) _ = myok 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 /* STRICT "wrong type for method m" */ .(I2) // only an error in strict mode (issue 8561) // 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 "not enough arguments" */ f1(x, y /* ERROR "too many arguments" */ ) f1(s /* ERROR "cannot use .* in argument" */ ) f1(x ... /* ERROR "cannot use ..." */ ) f1(g0 /* ERROR "used as value" */ ()) f1(g1()) f1(g2 /* ERROR "too many arguments" */ ()) f2() /* ERROR "not enough arguments" */ f2(3.14) /* ERROR "not enough arguments" */ f2(3.14, "foo") f2(x /* ERROR "cannot use .* in argument" */ , "foo") f2(g0 /* ERROR "used as value" */ ()) f2(g1()) /* ERROR "not enough arguments" */ f2(g2()) fs() /* ERROR "not enough arguments" */ fs(g0 /* ERROR "used as value" */ ()) fs(g1 /* ERROR "cannot use .* in argument" */ ()) fs(g2 /* ERROR "too many arguments" */ ()) fs(gs()) fv() fv(1, 2.0, x) fv(s /* ERROR "cannot use .* in argument" */ ) fv(s...) fv(x /* ERROR "cannot use" */ ...) fv(1, s /* ERROR "too many arguments" */ ... ) fv(gs /* ERROR "cannot use .* in argument" */ ()) fv(gs /* ERROR "cannot use .* in argument" */ ()...) var t T t.fm() t.fm(1, 2.0, x) t.fm(s /* ERROR "cannot use .* in argument" */ ) t.fm(g1()) t.fm(1, s /* ERROR "too many arguments" */ ... ) t.fm(gs /* ERROR "cannot use .* in argument" */ ()) t.fm(gs /* ERROR "cannot use .* in argument" */ ()...) T.fm(t, ) T.fm(t, 1, 2.0, x) T.fm(t, s /* ERROR "cannot use .* in argument" */ ) T.fm(t, g1()) T.fm(t, 1, s /* ERROR "too many arguments" */ ... ) T.fm(t, gs /* ERROR "cannot use .* in argument" */ ()) T.fm(t, gs /* ERROR "cannot use .* in argument" */ ()...) var i interface{ fm(x ...int) } = t i.fm() i.fm(1, 2.0, x) i.fm(s /* ERROR "cannot use .* in argument" */ ) i.fm(g1()) i.fm(1, s /* ERROR "too many arguments" */ ... ) i.fm(gs /* ERROR "cannot use .* in argument" */ ()) i.fm(gs /* ERROR "cannot use .* in argument" */ ()...) fi() fi(1, 2.0, x, 3.14, "foo") fi(g2()) fi(0, g2) fi(0, g2 /* ERROR "2-valued g2" */ ()) } func issue6344() { type T []interface{} var x T fi(x...) // ... applies also to named slices }