mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
cmd/compile: recognize embedded field in inlined function
There was already special code to recognize "?" in hidden_structdcl, which is used for inlined types and variables. This recognizes "?" in structdcl as well, a case that arises when a struct type appears within an inlined function body. Fixes #10219. Change-Id: Ic5257ae54f817e0d4a189c2294dcd633c9f2101a Reviewed-on: https://go-review.googlesource.com/12241 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
749b391c55
commit
2e4b659954
6 changed files with 59 additions and 2 deletions
|
@ -1632,7 +1632,7 @@ structdcl:
|
|||
|
||||
var n *Node
|
||||
l = $1;
|
||||
if l == nil {
|
||||
if l == nil || l.N.Sym.Name == "?" {
|
||||
// ? symbol, during import (list1(nil) == nil)
|
||||
n = $2;
|
||||
if n.Op == OIND {
|
||||
|
|
|
@ -2791,7 +2791,7 @@ yydefault:
|
|||
|
||||
var n *Node
|
||||
l = yyDollar[1].list
|
||||
if l == nil {
|
||||
if l == nil || l.N.Sym.Name == "?" {
|
||||
// ? symbol, during import (list1(nil) == nil)
|
||||
n = yyDollar[2].node
|
||||
if n.Op == OIND {
|
||||
|
|
24
test/fixedbugs/issue10219.dir/a.go
Normal file
24
test/fixedbugs/issue10219.dir/a.go
Normal file
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2015 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 a
|
||||
|
||||
type m struct {
|
||||
S string
|
||||
}
|
||||
|
||||
var g = struct {
|
||||
m
|
||||
P string
|
||||
}{
|
||||
m{"a"},
|
||||
"",
|
||||
}
|
||||
|
||||
type S struct{}
|
||||
|
||||
func (s *S) M(p string) {
|
||||
r := g
|
||||
r.P = p
|
||||
}
|
11
test/fixedbugs/issue10219.dir/b.go
Normal file
11
test/fixedbugs/issue10219.dir/b.go
Normal file
|
@ -0,0 +1,11 @@
|
|||
// Copyright 2015 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 b
|
||||
|
||||
import "./a"
|
||||
|
||||
func F() *a.S {
|
||||
return &a.S{}
|
||||
}
|
12
test/fixedbugs/issue10219.dir/c.go
Normal file
12
test/fixedbugs/issue10219.dir/c.go
Normal file
|
@ -0,0 +1,12 @@
|
|||
// Copyright 2015 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 c
|
||||
|
||||
import "./b"
|
||||
|
||||
func F() {
|
||||
s := b.F()
|
||||
s.M("c")
|
||||
}
|
10
test/fixedbugs/issue10219.go
Normal file
10
test/fixedbugs/issue10219.go
Normal file
|
@ -0,0 +1,10 @@
|
|||
// compiledir
|
||||
|
||||
// Copyright 2015 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.
|
||||
|
||||
// Issue 10219: failure of inlinable function that uses embedded types
|
||||
// in an anonymous struct via :=.
|
||||
|
||||
package ignored
|
Loading…
Reference in a new issue