mirror of
https://github.com/golang/go
synced 2024-11-25 13:27:57 -07:00
- added comment with various viewpoints so we have whole story
once we close this R=r OCL=23239 CL=23239
This commit is contained in:
parent
61590c4c44
commit
e1e158a90c
@ -15,3 +15,66 @@ Accessing obj.x for obj of type T will lead to an error so this cannot
|
|||||||
be used in a program, but I would argue that this should be a compile-
|
be used in a program, but I would argue that this should be a compile-
|
||||||
tume error at the declaration point.
|
tume error at the declaration point.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Condensed e-mail thread:
|
||||||
|
|
||||||
|
---------- Russ Cox
|
||||||
|
I don't think this is an error as long as you don't refer to x. I like the fact that you could name
|
||||||
|
multiple elements in the struct "pad".
|
||||||
|
|
||||||
|
|
||||||
|
---------- Rob 'Commander' Pike to Russ, me, go-dev, reviewlog2
|
||||||
|
the real question is whether this program matches the spec and if not, which is in error.
|
||||||
|
|
||||||
|
|
||||||
|
---------- Russ Cox to Rob, me, go-dev, reviewlog2
|
||||||
|
true enough. the spec disagrees with 6g.
|
||||||
|
when we discussed the disambiguation
|
||||||
|
rules for anonymous structs i thought we'd
|
||||||
|
mentioned this issue too and decided the
|
||||||
|
opposite, but i'm happy to make 6g agree
|
||||||
|
with the spec.
|
||||||
|
|
||||||
|
|
||||||
|
---------- Robert Griesemer to Russ, Rob, go-dev, reviewlog2
|
||||||
|
I think the spec could perhaps be more definitive. Note that 6g also accepts:
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
x int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *T) x() {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *T) x() {
|
||||||
|
}
|
||||||
|
|
||||||
|
The spec says that the scope of methods and fields is selectors of the form obj.selector. In a scope an identifier can be declared only once. I'd conclude that in the scope of fields and selectors of T, there are multiple x. But it's somewhat indirect. From a programmer's point of view making this an error seems less surprising, at least to me.
|
||||||
|
|
||||||
|
|
||||||
|
---------- Ken Thompson to me, Russ, Rob, go-dev, reviewlog2
|
||||||
|
obviously i dont think this is an error, or
|
||||||
|
i would have made it an error. it seems like
|
||||||
|
a small point if the error comes up at
|
||||||
|
declaration or use.
|
||||||
|
|
||||||
|
|
||||||
|
---------- Robert Griesemer to Ken, Russ, Rob, go-dev, reviewlog2
|
||||||
|
I don't really care too much, but I think it should be consistent. The following code:
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
x int;
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *T) x() {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *T) x(a, b, c int) {
|
||||||
|
}
|
||||||
|
|
||||||
|
does result in an error (method redeclared). I don't quite see why this should behave any different then if both x() had the same parameter list.
|
||||||
|
|
||||||
|
PS: I agree that the spec is saying two different things here - or at least should be more precise; the section on selectors (which arguably is the newer section), would allow such a declaration. I suspect that the case below leads to an early error possibly due to some interaction with code that checks for forward declaration of functions/methods (this not having looked at 6g).
|
||||||
|
|
||||||
|
I am happy to go either way. It's a small item and we can close it once we all agree.
|
||||||
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user