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:
Ian Lance Taylor 2015-07-14 22:17:41 -07:00
parent 749b391c55
commit 2e4b659954
6 changed files with 59 additions and 2 deletions

View file

@ -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 {

View file

@ -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 {

View 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
}

View 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{}
}

View 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")
}

View 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