// 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) }