]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: recognize embedded field in inlined function
authorIan Lance Taylor <iant@golang.org>
Wed, 15 Jul 2015 05:17:41 +0000 (22:17 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 15 Jul 2015 06:04:51 +0000 (06:04 +0000)
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>
src/cmd/compile/internal/gc/go.y
src/cmd/compile/internal/gc/y.go
test/fixedbugs/issue10219.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue10219.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue10219.dir/c.go [new file with mode: 0644]
test/fixedbugs/issue10219.go [new file with mode: 0644]

index 65601b43ee93ce10a797cd37c3669ded5225e3a2..113d47385891a712aad21b25c6c0182bba51c151 100644 (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 {
index e5517e98a9de33dacfcfb3843328f0d764d0b90e..935a9b154aaeeabaed1b8eed4b443875b5ad9497 100644 (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 {
diff --git a/test/fixedbugs/issue10219.dir/a.go b/test/fixedbugs/issue10219.dir/a.go
new file mode 100644 (file)
index 0000000..c61d02b
--- /dev/null
@@ -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 (file)
index 0000000..09d8911
--- /dev/null
@@ -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 (file)
index 0000000..d331495
--- /dev/null
@@ -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 (file)
index 0000000..325818c
--- /dev/null
@@ -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