From 987a580b9f91dfe0709d6927525952acf9101fc9 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 7 Mar 2012 01:55:17 -0500 Subject: [PATCH] cmd/gc: do not confuse unexported methods of same name Fixes #3146. R=ken2 CC=golang-dev https://golang.org/cl/5756074 --- src/cmd/gc/dcl.c | 15 +++++++++++---- test/bugs/424.go | 9 --------- .../424.dir => fixedbugs/bug424.dir}/lib.go | 0 .../424.dir/main.go => fixedbugs/bug424.go} | 18 ++++++++++++++++-- 4 files changed, 27 insertions(+), 15 deletions(-) delete mode 100644 test/bugs/424.go rename test/{bugs/424.dir => fixedbugs/bug424.dir}/lib.go (100%) rename test/{bugs/424.dir/main.go => fixedbugs/bug424.go} (75%) diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index 4a0e7430ac6..b7176259035 100644 --- a/src/cmd/gc/dcl.c +++ b/src/cmd/gc/dcl.c @@ -1195,10 +1195,17 @@ methodsym(Sym *nsym, Type *t0, int iface) if(t0->width < types[tptr]->width) suffix = "·i"; } - if(t0->sym == S && isptr[t0->etype]) - p = smprint("(%-hT).%s%s", t0, nsym->name, suffix); - else - p = smprint("%-hT.%s%s", t0, nsym->name, suffix); + if(nsym->pkg != s->pkg && !exportname(nsym->name)) { + if(t0->sym == S && isptr[t0->etype]) + p = smprint("(%-hT).%s.%s%s", t0, nsym->pkg->prefix, nsym->name, suffix); + else + p = smprint("%-hT.%s.%s%s", t0, nsym->pkg->prefix, nsym->name, suffix); + } else { + if(t0->sym == S && isptr[t0->etype]) + p = smprint("(%-hT).%s%s", t0, nsym->name, suffix); + else + p = smprint("%-hT.%s%s", t0, nsym->name, suffix); + } s = pkglookup(p, s->pkg); free(p); return s; diff --git a/test/bugs/424.go b/test/bugs/424.go deleted file mode 100644 index b22776086e3..00000000000 --- a/test/bugs/424.go +++ /dev/null @@ -1,9 +0,0 @@ -// $G $D/$F.dir/lib.go && $G $D/$F.dir/main.go && $L main.$A && $A.out - -// 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. - -// Test case for embedded method invocation. - -ignored diff --git a/test/bugs/424.dir/lib.go b/test/fixedbugs/bug424.dir/lib.go similarity index 100% rename from test/bugs/424.dir/lib.go rename to test/fixedbugs/bug424.dir/lib.go diff --git a/test/bugs/424.dir/main.go b/test/fixedbugs/bug424.go similarity index 75% rename from test/bugs/424.dir/main.go rename to test/fixedbugs/bug424.go index 64a600b5548..484febc1d20 100644 --- a/test/bugs/424.dir/main.go +++ b/test/fixedbugs/bug424.go @@ -1,3 +1,5 @@ +// run + // 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. @@ -9,7 +11,9 @@ package main -import "./lib" +import "./bug424.dir" +import "reflect" +import "fmt" type localI interface { m() string @@ -53,9 +57,19 @@ func main() { println("BUG: myT2:", i.m(), "called") } + t3 := new(myT3) + if t3.m() != "main.localT.m" { + println("BUG: t3:", t3.m(), "called") + } + i = new(myT3) if i.m() != "main.localT.m" { + t := reflect.TypeOf(i) + n := t.NumMethod() + for j := 0; j < n; j++ { + m := t.Method(j) + fmt.Printf("#%d: %s.%s %s\n", j, m.PkgPath, m.Name, m.Type) + } println("BUG: myT3:", i.m(), "called") } - }