From: Ian Lance Taylor Date: Wed, 15 Jul 2015 05:17:41 +0000 (-0700) Subject: cmd/compile: recognize embedded field in inlined function X-Git-Tag: go1.5beta2~21 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=2e4b6599541a92b76857ca546679a8d304730b10;p=gostls13.git 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 Reviewed-by: Russ Cox --- 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