cmd/compile: add call to ImportedBody() when exporting shape inst body

When we export a shape instantiation, because a particular
fully-instantiated type is needed by an inlineable function, we possibly
export the body of the instantiation, if it is inlineable. In this case,
we should have been calling ImportedBody() to make sure that the
function body had already been read in (if it is actually imported from
another package).

Fixes #50598

Change-Id: I512d2bcc745faa6ff3a97e25bc8f46e2c2643d23
Reviewed-on: https://go-review.googlesource.com/c/go/+/378494
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Dan Scales 2022-01-13 13:20:19 -08:00
parent e550c30545
commit b41185c5c3
6 changed files with 75 additions and 0 deletions

View file

@ -252,6 +252,7 @@ func (p *crawler) checkForFullyInst(t *types.Type) {
if HaveInlineBody(methNode.Func) {
// Export the body as well if
// instantiation is inlineable.
ImportedBody(methNode.Func)
methNode.Func.SetExportInline(true)
}
}

View file

@ -0,0 +1,23 @@
// Copyright 2022 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 a0
type Builder[T any] struct{}
func (r Builder[T]) New1() T {
var v T
return v
}
func (r Builder[T]) New2() T {
var v T
return v
}
type IntBuilder struct{}
func (b IntBuilder) New() int {
return Builder[int]{}.New2()
}

View file

@ -0,0 +1,11 @@
// Copyright 2022 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 a1
import "a0"
func New() int {
return a0.IntBuilder{}.New()
}

View file

@ -0,0 +1,11 @@
// Copyright 2022 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 a2
import "a0"
func New() int {
return a0.Builder[int]{}.New1()
}

View file

@ -0,0 +1,22 @@
// Copyright 2022 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 (
"fmt"
"a1"
"a2"
)
func New() int {
return a1.New() + a2.New()
}
func main() {
if got, want := New(), 0; got != want {
panic(fmt.Sprintf("got %d, want %d", got, want))
}
}

View file

@ -0,0 +1,7 @@
// rundir -G=3
// Copyright 2022 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 ignored