diff --git a/src/cmd/compile/internal/noder/unified.go b/src/cmd/compile/internal/noder/unified.go index 22d6f71329..6bc23cc5f9 100644 --- a/src/cmd/compile/internal/noder/unified.go +++ b/src/cmd/compile/internal/noder/unified.go @@ -7,6 +7,7 @@ package noder import ( "fmt" "internal/pkgbits" + "internal/types/errors" "io" "runtime" "sort" @@ -403,7 +404,10 @@ func readPackage(pr *pkgReader, importpkg *types.Pkg, localStub bool) { r := pr.newReader(pkgbits.RelocMeta, pkgbits.PublicRootIdx, pkgbits.SyncPublic) pkg := r.pkg() - base.Assertf(pkg == importpkg, "have package %q (%p), want package %q (%p)", pkg.Path, pkg, importpkg.Path, importpkg) + if pkg != importpkg { + base.ErrorfAt(base.AutogeneratedPos, errors.BadImportPath, "mismatched import path, have %q (%p), want %q (%p)", pkg.Path, pkg, importpkg.Path, importpkg) + base.ErrorExit() + } r.Bool() // TODO(mdempsky): Remove; was "has init" diff --git a/test/fixedbugs/issue54542.go b/test/fixedbugs/issue54542.go new file mode 100644 index 0000000000..165bcc582e --- /dev/null +++ b/test/fixedbugs/issue54542.go @@ -0,0 +1,67 @@ +// run + +//go:build !js && !wasip1 + +// 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. + +package main + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "path/filepath" +) + +const aSrc = `package a + +func A() { println("a") } +` + +const mainSrc = `package main + +import "a" + +func main() { a.A() } +` + +var srcs = map[string]string{ + "a.go": aSrc, + "main.go": mainSrc, +} + +func main() { + dir, err := os.MkdirTemp("", "issue54542") + if err != nil { + panic(err) + } + defer os.RemoveAll(dir) + + for fn, src := range srcs { + if err := os.WriteFile(filepath.Join(dir, fn), []byte(src), 0644); err != nil { + panic(err) + } + } + + if _, err := runInDir(dir, "tool", "compile", "-p=lie", "a.go"); err != nil { + panic(err) + } + + out, err := runInDir(dir, "tool", "compile", "-I=.", "-p=main", "main.go") + if err == nil { + panic("compiling succeed unexpectedly") + } + + if bytes.Contains(out, []byte("internal compiler error:")) { + panic(fmt.Sprintf("unexpected ICE:\n%s", string(out))) + } +} + +func runInDir(dir string, args ...string) ([]byte, error) { + cmd := exec.Command("go", args...) + cmd.Dir = dir + return cmd.CombinedOutput() +}