Commit d5a5855b authored by Luuk van Dijk's avatar Luuk van Dijk

gc: Preserve original blank name for .anon substitution on out params.

Fixes #1802.

R=rsc
CC=golang-dev
https://golang.org/cl/5364043
parent 151b2f15
......@@ -573,7 +573,7 @@ funchdr(Node *n)
static void
funcargs(Node *nt)
{
Node *n;
Node *n, *nn;
NodeList *l;
int gen;
......@@ -615,6 +615,10 @@ funcargs(Node *nt)
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 @@ funccompile(Node *n, int isclosure)
funcdepth = 0;
dclcontext = PEXTERN;
}
......@@ -542,6 +542,7 @@ static int
typefmt(Fmt *fp, Type *t)
{
Type *t1;
Sym *s;
if(t == T)
return fmtstrcpy(fp, "<T>");
......@@ -680,10 +681,23 @@ typefmt(Fmt *fp, Type *t)
case TFIELD:
if(!(fp->flags&FmtShort)) {
if(t->sym != S && !t->embedded)
fmtprint(fp, "%hS ", t->sym);
if((!t->sym || t->embedded) && fmtmode == FExp)
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)
......
package one
func Foo() (n int64, _ *int) {
return 42, nil
}
package two
import _ "./one"
// $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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment