1
0
mirror of https://github.com/golang/go synced 2024-11-24 23:07:56 -07:00

cmd/gc: another special (%hhS) case for method names.

Fixes #2877

R=rsc
CC=golang-dev
https://golang.org/cl/5637047
This commit is contained in:
Luuk van Dijk 2012-02-06 16:38:59 +01:00
parent 5efd5624cc
commit 0b9f090861
4 changed files with 52 additions and 0 deletions

View File

@ -1097,6 +1097,16 @@ exprfmt(Fmt *f, Node *n, int prec)
return fmtprint(f, "%V", &n->val); return fmtprint(f, "%V", &n->val);
case ONAME: case ONAME:
// Special case: explicit name of func (*T) method(...) is turned into pkg.(*T).method,
// but for export, this should be rendered as (*pkg.T).meth.
// These nodes have the special property that they are names with a left OTYPE and a right ONAME.
if(fmtmode == FExp && n->left && n->left->op == OTYPE && n->right && n->right->op == ONAME) {
if(isptr[n->left->type->etype])
return fmtprint(f, "(%T).%hhS", n->left->type, n->right->sym);
else
return fmtprint(f, "%T.%hhS", n->left->type, n->right->sym);
}
//fallthrough
case OPACK: case OPACK:
case ONONAME: case ONONAME:
return fmtprint(f, "%S", n->sym); return fmtprint(f, "%S", n->sym);

View File

@ -0,0 +1,20 @@
// Copyright 2012 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 one
// Issue 2877
type T struct {
f func(t *T, arg int)
g func(t T, arg int)
}
func (t *T) foo(arg int) {}
func (t T) goo(arg int) {}
func (t *T) F() { t.f = (*T).foo }
func (t *T) G() { t.g = T.goo }

View File

@ -0,0 +1,15 @@
// Copyright 2012 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.
// Use the functions in one.go so that the inlined
// forms get type-checked.
package two
import "./one"
func use() {
var r one.T
r.F()
}

7
test/fixedbugs/bug407.go Normal file
View File

@ -0,0 +1,7 @@
// $G $D/$F.dir/one.go && $G $D/$F.dir/two.go
// Copyright 2011 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 ignored