diff --git a/go/internal/gccgoimporter/importer_test.go b/go/internal/gccgoimporter/importer_test.go index 87b5ff2a..2c6f1cb4 100644 --- a/go/internal/gccgoimporter/importer_test.go +++ b/go/internal/gccgoimporter/importer_test.go @@ -104,6 +104,7 @@ var importerTests = []importerTest{ {pkgpath: "unicode", name: "IsUpper", want: "func IsUpper(r rune) bool"}, {pkgpath: "unicode", name: "MaxRune", want: "const MaxRune untyped rune", wantval: "1114111"}, {pkgpath: "imports", wantinits: []string{"imports..import", "fmt..import", "math..import"}}, + {pkgpath: "escapeinfo", name: "NewT", want: "func NewT(data []byte) *T"}, } func TestGoxImporter(t *testing.T) { diff --git a/go/internal/gccgoimporter/parser.go b/go/internal/gccgoimporter/parser.go index 08e3bb99..9e20df0e 100644 --- a/go/internal/gccgoimporter/parser.go +++ b/go/internal/gccgoimporter/parser.go @@ -228,6 +228,14 @@ func (p *parser) parseField(pkg *types.Package) (field *types.Var, tag string) { // Param = Name ["..."] Type . func (p *parser) parseParam(pkg *types.Package) (param *types.Var, isVariadic bool) { name := p.parseName() + if p.tok == '<' && p.scanner.Peek() == 'e' { + // EscInfo = "" . (optional and ignored) + p.next() + p.expectKeyword("esc") + p.expect(':') + p.expect(scanner.Int) + p.expect('>') + } if p.tok == '.' { p.next() p.expect('.') @@ -741,7 +749,7 @@ func (p *parser) discardDirectiveWhileParsingTypes(pkg *types.Package) { case ';': return case '<': - p.parseType(p.pkg) + p.parseType(pkg) case scanner.EOF: p.error("unexpected EOF") default: diff --git a/go/internal/gccgoimporter/testdata/escapeinfo.go b/go/internal/gccgoimporter/testdata/escapeinfo.go new file mode 100644 index 00000000..103ad954 --- /dev/null +++ b/go/internal/gccgoimporter/testdata/escapeinfo.go @@ -0,0 +1,13 @@ +// Test case for escape info in export data. To compile and extract .gox file: +// gccgo -fgo-optimize-allocs -c escapeinfo.go +// objcopy -j .go_export escapeinfo.o escapeinfo.gox + +package escapeinfo + +type T struct{ data []byte } + +func NewT(data []byte) *T { + return &T{data} +} + +func (*T) Read(p []byte) {} diff --git a/go/internal/gccgoimporter/testdata/escapeinfo.gox b/go/internal/gccgoimporter/testdata/escapeinfo.gox new file mode 100644 index 00000000..1db81562 Binary files /dev/null and b/go/internal/gccgoimporter/testdata/escapeinfo.gox differ