blob: b42974c4860f0cd303862dcefae3d4ea6bc871a3 [file] [log] [blame]
// errorcheck -0 -d=escapedebug=1
// Copyright 2024 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.
// Test the data word used for interface conversions
// that might otherwise allocate.
package dataword
var sink interface{}
func string1() {
sink = "abc" // ERROR "using global for interface value"
}
func string2() {
v := "abc"
sink = v // ERROR "using global for interface value"
}
func string3() {
sink = "" // ERROR "using global for interface value"
}
func string4() {
v := ""
sink = v // ERROR "using global for interface value"
}
func string5() {
var a any = "abc" // ERROR "using global for interface value"
_ = a
}
func string6() {
var a any
v := "abc"
a = v // ERROR "using global for interface value"
_ = a
}
// string7 can be inlined.
func string7(v string) {
sink = v
}
func string8() {
v0 := "abc"
v := v0
string7(v) // ERROR "using global for interface value"
}
func string9() {
v0 := "abc"
v := v0
f := func() {
string7(v)
}
f() // ERROR "using global for interface value"
}
func string10() {
v0 := "abc"
v := v0
f := func() {
f2 := func() {
string7(v)
}
f2()
}
f() // ERROR "using global for interface value"
}
func string11() {
v0 := "abc"
v := v0
defer func() {
string7(v) // ERROR "using global for interface value"
}()
}
func integer1() {
sink = 42 // ERROR "using global for interface value"
}
func integer2() {
v := 42
sink = v // ERROR "using global for interface value"
}
func integer3() {
sink = 0 // ERROR "using global for interface value"
}
func integer4a() {
v := 0
sink = v // ERROR "using global for interface value"
}
func integer4b() {
v := uint8(0)
sink = v // ERROR "using global for single-byte interface value"
}
func integer5() {
var a any = 42 // ERROR "using global for interface value"
_ = a
}
func integer6() {
var a any
v := 42
a = v // ERROR "using global for interface value"
_ = a
}
func integer7(v int) {
sink = v
}
type M interface{ M() }
type MyInt int
func (m MyInt) M() {}
func escapes(m M) {
sink = m
}
func named1a() {
sink = MyInt(42) // ERROR "using global for interface value"
}
func named1b() {
escapes(MyInt(42)) // ERROR "using global for interface value"
}
func named2a() {
v := MyInt(0)
sink = v // ERROR "using global for interface value"
}
func named2b() {
v := MyInt(42)
escapes(v) // ERROR "using global for interface value"
}
func named2c() {
v := 42
sink = MyInt(v) // ERROR "using global for interface value"
}
func named2d() {
v := 42
escapes(MyInt(v)) // ERROR "using global for interface value"
}
func named3a() {
sink = MyInt(42) // ERROR "using global for interface value"
}
func named3b() {
escapes(MyInt(0)) // ERROR "using global for interface value"
}
func named4a() {
v := MyInt(0)
sink = v // ERROR "using global for interface value"
}
func named4b() {
v := MyInt(0)
escapes(v) // ERROR "using global for interface value"
}
func named4c() {
v := 0
sink = MyInt(v) // ERROR "using global for interface value"
}
func named4d() {
v := 0
escapes(MyInt(v)) // ERROR "using global for interface value"
}
func named5() {
var a any = MyInt(42) // ERROR "using global for interface value"
_ = a
}
func named6() {
var a any
v := MyInt(42)
a = v // ERROR "using global for interface value"
_ = a
}
func named7a(v MyInt) {
sink = v
}
func named7b(v MyInt) {
escapes(v)
}
type S struct{ a, b int64 }
func struct1() {
sink = S{1, 1} // ERROR "using global for interface value"
}
func struct2() {
v := S{1, 1}
sink = v // ERROR "using global for interface value"
}
func struct3() {
sink = S{} // ERROR "using global for zero value interface value"
}
func struct4() {
v := S{}
sink = v // ERROR "using global for zero value interface value"
}
func struct5() {
var a any = S{1, 1} // ERROR "using global for interface value"
_ = a
}
func struct6() {
var a any
v := S{1, 1}
a = v // ERROR "using global for interface value"
_ = a
}
func struct7(v S) {
sink = v
}
func emptyStruct1() {
sink = struct{}{} // ERROR "using global for zero-sized interface value"
}
func emptyStruct2() {
v := struct{}{}
sink = v // ERROR "using global for zero-sized interface value"
}
func emptyStruct3(v struct{}) { // ERROR "using global for zero-sized interface value"
sink = v
}
// Some light emulation of conditional debug printing (such as in #53465).
func Printf(format string, args ...any) {
for _, arg := range args {
sink = arg
}
}
var enabled = true
func debugf(format string, args ...interface{}) {
if enabled {
Printf(format, args...)
}
}
//go:noinline
func debugf2(format string, args ...interface{}) {
if enabled {
Printf(format, args...)
}
}
func f1() {
v := 1000
debugf("hello %d", v) // ERROR "using global for interface value"
}
func f2() {
v := 1000
debugf2("hello %d", v) // ERROR "using global for interface value"
}
//go:noinline
func f3(i int) {
debugf("hello %d", i)
}
func f4() {
f3(1000)
}