mirror of
https://github.com/golang/go
synced 2024-11-22 09:24:41 -07:00
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:
parent
bf58d20999
commit
280c8b90e2
@ -604,8 +604,11 @@ typefmt(Fmt *fp, Type *t)
|
|||||||
if(!(fp->flags&FmtLong) && t->sym && t->etype != TFIELD && t != types[t->etype]) {
|
if(!(fp->flags&FmtLong) && t->sym && t->etype != TFIELD && t != types[t->etype]) {
|
||||||
switch(fmtmode) {
|
switch(fmtmode) {
|
||||||
case FTypeId:
|
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);
|
return fmtprint(fp, "%hS", t->sym);
|
||||||
|
}
|
||||||
if(fp->flags&FmtUnsigned)
|
if(fp->flags&FmtUnsigned)
|
||||||
return fmtprint(fp, "%uS", t->sym);
|
return fmtprint(fp, "%uS", t->sym);
|
||||||
// fallthrough
|
// fallthrough
|
||||||
|
39
test/fixedbugs/issue6269.go
Normal file
39
test/fixedbugs/issue6269.go
Normal 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"`)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user