1// run 2 3//go:build !js && !wasip1 4 5// Copyright 2024 The Go Authors. All rights reserved. 6// Use of this source code is governed by a BSD-style 7// license that can be found in the LICENSE file. 8 9package main 10 11import ( 12 "bytes" 13 "fmt" 14 "os" 15 "os/exec" 16 "path/filepath" 17) 18 19const aSrc = `package a 20 21func A() { println("a") } 22` 23 24const mainSrc = `package main 25 26import "a" 27 28func main() { a.A() } 29` 30 31var srcs = map[string]string{ 32 "a.go": aSrc, 33 "main.go": mainSrc, 34} 35 36func main() { 37 dir, err := os.MkdirTemp("", "issue54542") 38 if err != nil { 39 panic(err) 40 } 41 defer os.RemoveAll(dir) 42 43 for fn, src := range srcs { 44 if err := os.WriteFile(filepath.Join(dir, fn), []byte(src), 0644); err != nil { 45 panic(err) 46 } 47 } 48 49 if _, err := runInDir(dir, "tool", "compile", "-p=lie", "a.go"); err != nil { 50 panic(err) 51 } 52 53 out, err := runInDir(dir, "tool", "compile", "-I=.", "-p=main", "main.go") 54 if err == nil { 55 panic("compiling succeed unexpectedly") 56 } 57 58 if bytes.Contains(out, []byte("internal compiler error:")) { 59 panic(fmt.Sprintf("unexpected ICE:\n%s", string(out))) 60 } 61} 62 63func runInDir(dir string, args ...string) ([]byte, error) { 64 cmd := exec.Command("go", args...) 65 cmd.Dir = dir 66 return cmd.CombinedOutput() 67} 68