From 6312208388417220cdb035180d08b973c0d3fd20 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 27 Oct 2020 13:52:20 -0700 Subject: [PATCH] go/internal/gccgoimporter: support notinheap annotation Port https://golang.org/cl/265702 from the main Go repo. Original CL description: The gofrontend has started emitting a notinheap annotation for types marked go:notinheap. For golang/go#41761 Change-Id: Ic14ffda4b0c3eef850ad85dbf9af755283a5196b Reviewed-on: https://go-review.googlesource.com/c/tools/+/265718 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Than McIntosh gopls-CI: kokoro TryBot-Result: Go Bot --- go/internal/gccgoimporter/importer_test.go | 1 + go/internal/gccgoimporter/parser.go | 7 +++++++ go/internal/gccgoimporter/testdata/notinheap.go | 4 ++++ go/internal/gccgoimporter/testdata/notinheap.gox | 7 +++++++ 4 files changed, 19 insertions(+) create mode 100644 go/internal/gccgoimporter/testdata/notinheap.go create mode 100644 go/internal/gccgoimporter/testdata/notinheap.gox diff --git a/go/internal/gccgoimporter/importer_test.go b/go/internal/gccgoimporter/importer_test.go index 6c3644efd7..d6fe970a06 100644 --- a/go/internal/gccgoimporter/importer_test.go +++ b/go/internal/gccgoimporter/importer_test.go @@ -100,6 +100,7 @@ var importerTests = [...]importerTest{ {pkgpath: "issue30628", name: "Apple", want: "type Apple struct{hey sync.RWMutex; x int; RQ [517]struct{Count uintptr; NumBytes uintptr; Last uintptr}}"}, {pkgpath: "issue31540", name: "S", gccgoVersion: 7, want: "type S struct{b int; map[Y]Z}"}, {pkgpath: "issue34182", name: "T1", want: "type T1 struct{f *T2}"}, + {pkgpath: "notinheap", name: "S", want: "type S struct{}"}, } func TestGoxImporter(t *testing.T) { diff --git a/go/internal/gccgoimporter/parser.go b/go/internal/gccgoimporter/parser.go index 29e8c60c23..7f07553e8f 100644 --- a/go/internal/gccgoimporter/parser.go +++ b/go/internal/gccgoimporter/parser.go @@ -521,6 +521,13 @@ func (p *parser) parseNamedType(nlist []interface{}) types.Type { p.errorf("%v has nil type", obj) } + if p.tok == scanner.Ident && p.lit == "notinheap" { + p.next() + // The go/types package has no way of recording that + // this type is marked notinheap. Presumably no user + // of this package actually cares. + } + // type alias if p.tok == '=' { p.next() diff --git a/go/internal/gccgoimporter/testdata/notinheap.go b/go/internal/gccgoimporter/testdata/notinheap.go new file mode 100644 index 0000000000..b1ac967227 --- /dev/null +++ b/go/internal/gccgoimporter/testdata/notinheap.go @@ -0,0 +1,4 @@ +package notinheap + +//go:notinheap +type S struct{} diff --git a/go/internal/gccgoimporter/testdata/notinheap.gox b/go/internal/gccgoimporter/testdata/notinheap.gox new file mode 100644 index 0000000000..cc438e75e0 --- /dev/null +++ b/go/internal/gccgoimporter/testdata/notinheap.gox @@ -0,0 +1,7 @@ +v3; +package notinheap +pkgpath notinheap +init notinheap ~notinheap +types 3 2 30 18 +type 1 "S" notinheap +type 2 struct { }