Update to go1.25.0
This commit is contained in:
297
test/escape_iface_data.go
Normal file
297
test/escape_iface_data.go
Normal file
@@ -0,0 +1,297 @@
|
||||
// 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)
|
||||
}
|
||||
Reference in New Issue
Block a user