diff options
author | Ian Lance Taylor <iant@golang.org> | 2015-07-14 22:17:41 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2015-07-15 06:04:51 +0000 |
commit | 2e4b6599541a92b76857ca546679a8d304730b10 (patch) | |
tree | 1a6e1e265ed67f736ad3ccd27dfb263a0828a35d | |
parent | 749b391c55b0139910d86ac0f8a0c42957e01d1c (diff) | |
download | go-2e4b6599541a92b76857ca546679a8d304730b10.tar.gz go-2e4b6599541a92b76857ca546679a8d304730b10.zip |
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>
-rw-r--r-- | src/cmd/compile/internal/gc/go.y | 2 | ||||
-rw-r--r-- | src/cmd/compile/internal/gc/y.go | 2 | ||||
-rw-r--r-- | test/fixedbugs/issue10219.dir/a.go | 24 | ||||
-rw-r--r-- | test/fixedbugs/issue10219.dir/b.go | 11 | ||||
-rw-r--r-- | test/fixedbugs/issue10219.dir/c.go | 12 | ||||
-rw-r--r-- | test/fixedbugs/issue10219.go | 10 |
6 files changed, 59 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/gc/go.y b/src/cmd/compile/internal/gc/go.y index 65601b43ee..113d473858 100644 --- a/src/cmd/compile/internal/gc/go.y +++ b/src/cmd/compile/internal/gc/go.y @@ -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 { diff --git a/src/cmd/compile/internal/gc/y.go b/src/cmd/compile/internal/gc/y.go index e5517e98a9..935a9b154a 100644 --- a/src/cmd/compile/internal/gc/y.go +++ b/src/cmd/compile/internal/gc/y.go @@ -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 { diff --git a/test/fixedbugs/issue10219.dir/a.go b/test/fixedbugs/issue10219.dir/a.go new file mode 100644 index 0000000000..c61d02b66a --- /dev/null +++ b/test/fixedbugs/issue10219.dir/a.go @@ -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 +} diff --git a/test/fixedbugs/issue10219.dir/b.go b/test/fixedbugs/issue10219.dir/b.go new file mode 100644 index 0000000000..09d8911ff4 --- /dev/null +++ b/test/fixedbugs/issue10219.dir/b.go @@ -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{} +} diff --git a/test/fixedbugs/issue10219.dir/c.go b/test/fixedbugs/issue10219.dir/c.go new file mode 100644 index 0000000000..d331495df2 --- /dev/null +++ b/test/fixedbugs/issue10219.dir/c.go @@ -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") +} diff --git a/test/fixedbugs/issue10219.go b/test/fixedbugs/issue10219.go new file mode 100644 index 0000000000..325818cff2 --- /dev/null +++ b/test/fixedbugs/issue10219.go @@ -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 |