// errchk $G $D/$F.go

// Copyright 2009 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 main

type T struct {
	x, x int  // ERROR "duplicate"
}

/*
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-
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.
*/
