| // Copyright 2019 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 template_test | 
 |  | 
 | import ( | 
 | 	"bytes" | 
 | 	"internal/testenv" | 
 | 	"os" | 
 | 	"os/exec" | 
 | 	"path/filepath" | 
 | 	"testing" | 
 | ) | 
 |  | 
 | // Issue 36021: verify that text/template doesn't prevent the linker from removing | 
 | // unused methods. | 
 | func TestLinkerGC(t *testing.T) { | 
 | 	if testing.Short() { | 
 | 		t.Skip("skipping in short mode") | 
 | 	} | 
 | 	testenv.MustHaveGoBuild(t) | 
 | 	const prog = `package main | 
 |  | 
 | import ( | 
 | 	_ "text/template" | 
 | ) | 
 |  | 
 | type T struct{} | 
 |  | 
 | func (t *T) Unused() { println("THIS SHOULD BE ELIMINATED") } | 
 | func (t *T) Used() {} | 
 |  | 
 | var sink *T | 
 |  | 
 | func main() { | 
 | 	var t T | 
 | 	sink = &t | 
 | 	t.Used() | 
 | } | 
 | ` | 
 | 	td := t.TempDir() | 
 |  | 
 | 	if err := os.WriteFile(filepath.Join(td, "x.go"), []byte(prog), 0644); err != nil { | 
 | 		t.Fatal(err) | 
 | 	} | 
 | 	cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "x.exe", "x.go") | 
 | 	cmd.Dir = td | 
 | 	if out, err := cmd.CombinedOutput(); err != nil { | 
 | 		t.Fatalf("go build: %v, %s", err, out) | 
 | 	} | 
 | 	slurp, err := os.ReadFile(filepath.Join(td, "x.exe")) | 
 | 	if err != nil { | 
 | 		t.Fatal(err) | 
 | 	} | 
 | 	if bytes.Contains(slurp, []byte("THIS SHOULD BE ELIMINATED")) { | 
 | 		t.Error("binary contains code that should be deadcode eliminated") | 
 | 	} | 
 | } |