1
0
mirror of https://github.com/golang/go synced 2024-11-22 03:04:41 -07:00

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

Fixes #1802.

R=rsc
CC=golang-dev
https://golang.org/cl/5364043
This commit is contained in:
Luuk van Dijk 2011-11-09 11:27:27 +01:00
parent 151b2f1509
commit d5a5855ba1
5 changed files with 45 additions and 11 deletions

View File

@ -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;
}

View File

@ -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 @@ 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)
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)

View File

@ -0,0 +1,6 @@
package one
func Foo() (n int64, _ *int) {
return 42, nil
}

View File

@ -0,0 +1,4 @@
package two
import _ "./one"

9
test/fixedbugs/bug377.go Normal file
View File

@ -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