gc: Preserve original blank name for .anon substitution on out params.
Fixes #1802.
R=rsc
CC=golang-dev
https://golang.org/cl/5364043
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index 71afbf1..12c7001 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -573,7 +573,7 @@
static void
funcargs(Node *nt)
{
- Node *n;
+ Node *n, *nn;
NodeList *l;
int gen;
@@ -615,6 +615,10 @@
n->left->ntype = n->right;
if(isblank(n->left)) {
// Give it a name so we can assign to it during return.
+ // preserve the original in ->orig
+ nn = nod(OXXX, N, N);
+ *nn = *n->left;
+ n->left = nn;
snprint(namebuf, sizeof(namebuf), ".anon%d", gen++);
n->left->sym = lookup(namebuf);
}
@@ -1342,6 +1346,3 @@
funcdepth = 0;
dclcontext = PEXTERN;
}
-
-
-
diff --git a/src/cmd/gc/fmt.c b/src/cmd/gc/fmt.c
index 9447e9b..f64a231 100644
--- a/src/cmd/gc/fmt.c
+++ b/src/cmd/gc/fmt.c
@@ -28,9 +28,9 @@
//
// %T Type* Types
// Flags: +,- #: mode (see below)
-// 'l' definition instead of name.
+// 'l' definition instead of name.
// 'h' omit "func" and receiver in function types
-// 'u' (only in -/Sym mode) print type identifiers wit package name instead of prefix.
+// 'u' (only in -/Sym mode) print type identifiers wit package name instead of prefix.
//
// %N Node* Nodes
// Flags: +,- #: mode (see below)
@@ -41,7 +41,7 @@
// Flags: those of %N
// ',' separate items with ',' instead of ';'
//
-// %Z Strlit* String literals
+// %Z Strlit* String literals
//
// In mparith1.c:
// %B Mpint* Big integers
@@ -542,6 +542,7 @@
typefmt(Fmt *fp, Type *t)
{
Type *t1;
+ Sym *s;
if(t == T)
return fmtstrcpy(fp, "<T>");
@@ -680,10 +681,23 @@
case TFIELD:
if(!(fp->flags&FmtShort)) {
- if(t->sym != S && !t->embedded)
- fmtprint(fp, "%hS ", t->sym);
- if((!t->sym || t->embedded) && fmtmode == FExp)
- fmtstrcpy(fp, "? ");
+ s = t->sym;
+ switch(fmtmode) {
+ case FErr:
+ case FExp:
+ // Take the name from the original, lest we substituted it with .anon%d
+ if (t->nname)
+ s = t->nname->orig->sym;
+
+ if((s == S || t->embedded)) {
+ fmtstrcpy(fp, "? ");
+ break;
+ }
+ // fallthrough
+ default:
+ if(!(s == S || t->embedded))
+ fmtprint(fp, "%hS ", s);
+ }
}
if(t->isddd)
diff --git a/test/fixedbugs/bug377.dir/one.go b/test/fixedbugs/bug377.dir/one.go
new file mode 100644
index 0000000..c906075
--- /dev/null
+++ b/test/fixedbugs/bug377.dir/one.go
@@ -0,0 +1,6 @@
+package one
+
+func Foo() (n int64, _ *int) {
+ return 42, nil
+}
+
diff --git a/test/fixedbugs/bug377.dir/two.go b/test/fixedbugs/bug377.dir/two.go
new file mode 100644
index 0000000..8a5346a
--- /dev/null
+++ b/test/fixedbugs/bug377.dir/two.go
@@ -0,0 +1,4 @@
+package two
+
+import _ "./one"
+
diff --git a/test/fixedbugs/bug377.go b/test/fixedbugs/bug377.go
new file mode 100644
index 0000000..b6b5509
--- /dev/null
+++ b/test/fixedbugs/bug377.go
@@ -0,0 +1,9 @@
+// $G $D/$F.dir/one.go && $G $D/$F.dir/two.go
+
+// Copyright 2011 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 1802
+
+ignored