]> Cypherpunks repositories - gostls13.git/commitdiff
gc: Preserve original blank name for .anon substitution on out params.
authorLuuk van Dijk <lvd@golang.org>
Wed, 9 Nov 2011 10:27:27 +0000 (11:27 +0100)
committerLuuk van Dijk <lvd@golang.org>
Wed, 9 Nov 2011 10:27:27 +0000 (11:27 +0100)
Fixes #1802.

R=rsc
CC=golang-dev
https://golang.org/cl/5364043

src/cmd/gc/dcl.c
src/cmd/gc/fmt.c
test/fixedbugs/bug377.dir/one.go [new file with mode: 0644]
test/fixedbugs/bug377.dir/two.go [new file with mode: 0644]
test/fixedbugs/bug377.go [new file with mode: 0644]

index 71afbf1e50093aee0b4aa11f362e0010620b024a..12c7001846fffc9e30814af414e90a71dec10ef5 100644 (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;
 }
-
-
-
index 9447e9b1eb84c71bd0cee5c70e621dffa3fbe60b..f64a2314be46d6eb28cac0efcc32a1ab806813ba 100644 (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)
diff --git a/test/fixedbugs/bug377.dir/one.go b/test/fixedbugs/bug377.dir/one.go
new file mode 100644 (file)
index 0000000..c906075
--- /dev/null
@@ -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 (file)
index 0000000..8a5346a
--- /dev/null
@@ -0,0 +1,4 @@
+package two
+
+import _ "./one"
+
diff --git a/test/fixedbugs/bug377.go b/test/fixedbugs/bug377.go
new file mode 100644 (file)
index 0000000..b6b5509
--- /dev/null
@@ -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