cmd/gc: make method names for function scoped types unique

Types in function scope can have methods on them if they embed another type, but we didn't make the name unique, meaning that 2 identically named types in different functions would conflict with eachother.

Fixes #6269.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/13326045
This commit is contained in:
Daniel Morsing 2013-08-29 16:48:44 +02:00
parent bf58d20999
commit 280c8b90e2
2 changed files with 43 additions and 1 deletions

View file

@ -604,8 +604,11 @@ typefmt(Fmt *fp, Type *t)
if(!(fp->flags&FmtLong) && t->sym && t->etype != TFIELD && t != types[t->etype]) {
switch(fmtmode) {
case FTypeId:
if(fp->flags&FmtShort)
if(fp->flags&FmtShort) {
if(t->vargen)
return fmtprint(fp, "%hS·%d", t->sym, t->vargen);
return fmtprint(fp, "%hS", t->sym);
}
if(fp->flags&FmtUnsigned)
return fmtprint(fp, "%uS", t->sym);
// fallthrough

View file

@ -0,0 +1,39 @@
// run
// Copyright 2013 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 6269: name collision on method names for function local types.
package main
type foo struct{}
func (foo) Error() string {
return "ok"
}
type bar struct{}
func (bar) Error() string {
return "fail"
}
func unused() {
type collision struct {
bar
}
_ = collision{}
}
func main() {
type collision struct {
foo
}
s := error(collision{})
if str := s.Error(); str != "ok" {
println("s.Error() ==", str)
panic(`s.Error() != "ok"`)
}
}