mirror of
https://github.com/golang/go
synced 2024-11-18 05:44:47 -07:00
cmd/link: add a test that reflect.Value.Call does not bring methods live
reflect.Value.Call, if reachable, used to bring all exported methods live. CL 228792 fixes this, removing the check of reflect.Value.Call. This CL adds a test. Updates #38505. Change-Id: Ib4cab3c3c86c9c9702d041266e59b159d0ff0a97 Reviewed-on: https://go-review.googlesource.com/c/go/+/228878 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
f5291cf03d
commit
de2318e3c6
61
src/cmd/link/internal/ld/deadcode_test.go
Normal file
61
src/cmd/link/internal/ld/deadcode_test.go
Normal file
@ -0,0 +1,61 @@
|
||||
// Copyright 2020 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 ld
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"internal/testenv"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// This example uses reflect.Value.Call, but not
|
||||
// reflect.{Value,Type}.Method. This should not
|
||||
// need to bring all methods live.
|
||||
const deadcodeTestSrc = `
|
||||
package main
|
||||
import "reflect"
|
||||
|
||||
func f() { println("call") }
|
||||
|
||||
type T int
|
||||
func (T) M() {}
|
||||
|
||||
func main() {
|
||||
v := reflect.ValueOf(f)
|
||||
v.Call(nil)
|
||||
i := interface{}(T(1))
|
||||
println(i)
|
||||
}
|
||||
`
|
||||
|
||||
func TestDeadcode(t *testing.T) {
|
||||
testenv.MustHaveGoBuild(t)
|
||||
|
||||
tmpdir, err := ioutil.TempDir("", "TestDeadcode")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpdir)
|
||||
|
||||
src := filepath.Join(tmpdir, "main.go")
|
||||
err = ioutil.WriteFile(src, []byte(deadcodeTestSrc), 0666)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
exe := filepath.Join(tmpdir, "main.exe")
|
||||
|
||||
cmd := exec.Command(testenv.GoToolPath(t), "build", "-ldflags=-dumpdep", "-o", exe, src)
|
||||
out, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
t.Fatalf("%v: %v:\n%s", cmd.Args, err, out)
|
||||
}
|
||||
if bytes.Contains(out, []byte("main.T.M")) {
|
||||
t.Errorf("main.T.M should not be reachable. Output:\n%s", out)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user