redeclare(Sym *s, char *where)
{
Strlit *pkgstr;
+ int line1, line2;
if(s->lastlineno == 0) {
pkgstr = s->origpkg ? s->origpkg->path : s->pkg->path;
yyerror("%S redeclared %s\n"
"\tprevious declaration during import \"%Z\"",
s, where, pkgstr);
- } else
- yyerror("%S redeclared %s\n"
+ } else {
+ line1 = parserline();
+ line2 = s->lastlineno;
+
+ // When an import and a declaration collide in separate files,
+ // present the import as the "redeclared", because the declaration
+ // is visible where the import is, but not vice versa.
+ // See issue 4510.
+ if(s->def == N) {
+ line2 = line1;
+ line1 = s->lastlineno;
+ }
+
+ yyerrorl(line1, "%S redeclared %s (%#N)\n"
"\tprevious declaration at %L",
- s, where, s->lastlineno);
+ s, where, s->def, line2);
+ }
}
static int vargen;
--- /dev/null
+// 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.
+
+package p
+
+import "fmt" // ERROR "fmt redeclared"
+
+var _ = fmt.Printf
--- /dev/null
+// 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.
+
+package p
+
+func fmt() {}
--- /dev/null
+// errorcheckdir
+
+// 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.
+
+package ignored