// 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. // builtin calls package builtins import "unsafe" func f0() {} func append1() { var b byte var x int var s []byte _ = append() // ERROR "not enough arguments" _ = append("foo" /* ERROR "must be a slice" */ ) _ = append(nil /* ERROR "must be a slice" */ , s) _ = append(x /* ERROR "must be a slice" */ , s) _ = append(s) _ = append(s, nil...) append /* ERROR "not used" */ (s) _ = append(s, b) _ = append(s, x /* ERROR "cannot use x" */ ) _ = append(s, s /* ERROR "cannot use s" */ ) _ = append(s...) /* ERROR "not enough arguments" */ _ = append(s, b, s /* ERROR "too many arguments" */ ...) _ = append(s, 1, 2, 3) _ = append(s, 1, 2, 3, x /* ERROR "cannot use x" */ , 5, 6, 6) _ = append(s, 1, 2 /* ERROR "too many arguments" */, s...) _ = append([]interface{}(nil), 1, 2, "foo", x, 3.1425, false) type S []byte type T string var t T _ = append(s, "foo" /* ERRORx `cannot use .* in argument to append` */ ) _ = append(s, "foo"...) _ = append(S(s), "foo" /* ERRORx `cannot use .* in argument to append` */ ) _ = append(S(s), "foo"...) _ = append(s, t /* ERROR "cannot use t" */ ) _ = append(s, t...) _ = append(s, T("foo")...) _ = append(S(s), t /* ERROR "cannot use t" */ ) _ = append(S(s), t...) _ = append(S(s), T("foo")...) _ = append([]string{}, t /* ERROR "cannot use t" */ , "foo") _ = append([]T{}, t, "foo") } // from the spec func append2() { s0 := []int{0, 0} s1 := append(s0, 2) // append a single element s1 == []int{0, 0, 2} s2 := append(s1, 3, 5, 7) // append multiple elements s2 == []int{0, 0, 2, 3, 5, 7} s3 := append(s2, s0...) // append a slice s3 == []int{0, 0, 2, 3, 5, 7, 0, 0} s4 := append(s3[3:6], s3[2:]...) // append overlapping slice s4 == []int{3, 5, 7, 2, 3, 5, 7, 0, 0} var t []interface{} t = append(t, 42, 3.1415, "foo") // t == []interface{}{42, 3.1415, "foo"} var b []byte b = append(b, "bar"...) // append string contents b == []byte{'b', 'a', 'r' } _ = s4 } func append3() { f1 := func() (s []int) { return } f2 := func() (s []int, x int) { return } f3 := func() (s []int, x, y int) { return } f5 := func() (s []interface{}, x int, y float32, z string, b bool) { return } ff := func() (int, float32) { return 0, 0 } _ = append(f0 /* ERROR "used as value" */ ()) _ = append(f1()) _ = append(f2()) _ = append(f3()) _ = append(f5()) _ = append(ff /* ERROR "must be a slice" */ ()) // TODO(gri) better error message } func cap1() { var a [10]bool var p *[20]int var c chan string _ = cap() // ERROR "not enough arguments" _ = cap(1, 2) // ERROR "too many arguments" _ = cap(42 /* ERROR "invalid" */) const _3 = cap(a) assert(_3 == 10) const _4 = cap(p) assert(_4 == 20) _ = cap(c) cap /* ERROR "not used" */ (c) // issue 4744 type T struct{ a [10]int } const _ = cap(((*T)(nil)).a) var s [][]byte _ = cap(s) _ = cap(s... /* ERROR "invalid use of ..." */ ) } func cap2() { f1a := func() (a [10]int) { return } f1s := func() (s []int) { return } f2 := func() (s []int, x int) { return } _ = cap(f0 /* ERROR "used as value" */ ()) _ = cap(f1a()) _ = cap(f1s()) _ = cap(f2()) // ERROR "too many arguments" } // test cases for issue 7387 func cap3() { var f = func() int { return 0 } var x = f() const ( _ = cap([4]int{}) _ = cap([4]int{x}) _ = cap /* ERROR "not constant" */ ([4]int{f()}) _ = cap /* ERROR "not constant" */ ([4]int{cap([]int{})}) _ = cap([4]int{cap([4]int{})}) ) var y float64 var z complex128 const ( _ = cap([4]float64{}) _ = cap([4]float64{y}) _ = cap([4]float64{real(2i)}) _ = cap /* ERROR "not constant" */ ([4]float64{real(z)}) ) var ch chan [10]int const ( _ = cap /* ERROR "not constant" */ (<-ch) _ = cap /* ERROR "not constant" */ ([4]int{(<-ch)[0]}) ) } func clear1() { var a [10]int var m map[float64]string var s []byte clear(a /* ERROR "cannot clear a" */) clear(&/* ERROR "cannot clear &a" */a) clear(m) clear(s) clear([]int{}) } func close1() { var c chan int var r <-chan int close() // ERROR "not enough arguments" close(1, 2) // ERROR "too many arguments" close(42 /* ERROR "cannot close non-channel" */) close(r /* ERROR "receive-only channel" */) close(c) _ = close /* ERROR "used as value" */ (c) var s []chan int close(s... /* ERROR "invalid use of ..." */ ) } func close2() { f1 := func() (ch chan int) { return } f2 := func() (ch chan int, x int) { return } close(f0 /* ERROR "used as value" */ ()) close(f1()) close(f2()) // ERROR "too many arguments" } func complex1() { var i32 int32 var f32 float32 var f64 float64 var c64 complex64 var c128 complex128 _ = complex() // ERROR "not enough arguments" _ = complex(1) // ERROR "not enough arguments" _ = complex(true /* ERROR "mismatched types" */ , 0) _ = complex(i32 /* ERROR "expected floating-point" */ , 0) _ = complex("foo" /* ERROR "mismatched types" */ , 0) _ = complex(c64 /* ERROR "expected floating-point" */ , 0) _ = complex(0 /* ERROR "mismatched types" */ , true) _ = complex(0 /* ERROR "expected floating-point" */ , i32) _ = complex(0 /* ERROR "mismatched types" */ , "foo") _ = complex(0 /* ERROR "expected floating-point" */ , c64) _ = complex(f32, f32) _ = complex(f32, 1) _ = complex(f32, 1.0) _ = complex(f32, 'a') _ = complex(f64, f64) _ = complex(f64, 1) _ = complex(f64, 1.0) _ = complex(f64, 'a') _ = complex(f32 /* ERROR "mismatched types" */ , f64) _ = complex(f64 /* ERROR "mismatched types" */ , f32) _ = complex(1, 1) _ = complex(1, 1.1) _ = complex(1, 'a') complex /* ERROR "not used" */ (1, 2) var _ complex64 = complex(f32, f32) var _ complex64 = complex /* ERRORx `cannot use .* in variable declaration` */ (f64, f64) var _ complex128 = complex /* ERRORx `cannot use .* in variable declaration` */ (f32, f32) var _ complex128 = complex(f64, f64) // untyped constants const _ int = complex(1, 0) const _ float32 = complex(1, 0) const _ complex64 = complex(1, 0) const _ complex128 = complex(1, 0) const _ = complex(0i, 0i) const _ = complex(0i, 0) const _ int = 1.0 + complex(1, 0i) const _ int = complex /* ERROR "int" */ (1.1, 0) const _ float32 = complex /* ERROR "float32" */ (1, 2) // untyped values var s uint _ = complex(1 /* ERROR "integer" */ <