]> Cypherpunks repositories - gostls13.git/commitdiff
bug generating duplicate interface signatures
authorKen Thompson <ken@golang.org>
Thu, 11 Sep 2008 02:49:35 +0000 (19:49 -0700)
committerKen Thompson <ken@golang.org>
Thu, 11 Sep 2008 02:49:35 +0000 (19:49 -0700)
R=r
OCL=15119
CL=15119

src/cmd/6g/gsubr.c
src/cmd/6g/obj.c
src/cmd/gc/dcl.c
src/cmd/gc/go.h
src/cmd/gc/walk.c

index 20654fa9d89b72084abf3eb4ef2e3599f8d38d74..ac807c651e33deaf35aac5b4a48ccd8c14665d13 100644 (file)
@@ -322,7 +322,11 @@ loop:
 
        s = t->sym;
        if(s == S)
-               fatal("nodtypesig: no sym for type");
+               fatal("signame: no sym for type");
+
+       // mark it as used so signature will be generated
+       if(s->local == 1)
+               s->local = 2;
 
        snprint(namebuf, sizeof(namebuf), "%s_%s", e, s->name);
        s = pkglookup(namebuf, s->package);
index 709ece3c3809a79fcb6c37b7ea2110791d8ef202..f1f86ee988f1fcc1efcc5d91f26dcb3a91b145a0 100644 (file)
@@ -459,7 +459,7 @@ sigcmp(Sig *a, Sig *b)
 void
 dumpsignatures(void)
 {
-       Dcl *d;
+       Dcl *d, *x;
        Type *t, *f;
        Sym *s1, *s;
        int et, o, wi, ot;
@@ -468,6 +468,44 @@ dumpsignatures(void)
        Prog *p;
        char *sp;
 
+       // copy externdcl list to signatlist
+       for(d=externdcl; d!=D; d=d->forw) {
+               if(d->op != OTYPE)
+                       continue;
+
+               t = d->dtype;
+               if(t == T)
+                       continue;
+
+               et = t->etype;
+               if(et != TSTRUCT && et != TINTER)
+                       continue;
+
+               s = d->dsym;
+               if(s == S)
+                       continue;
+
+               if(s->name[0] == '_')
+                       continue;
+
+               // if it was imported
+               if(s->local == 0)
+                       continue;
+
+// until i can figure out
+// when/if it is used, do them all
+//             // if not used and not exported
+//             if(s->local == 1 && !s->export)
+//                     continue;
+
+               x = mal(sizeof(*d));
+               x->op = OTYPE;
+               x->dsym = s;
+               x->dtype = t;
+               x->forw = signatlist;
+               signatlist = x;
+       }
+
        /*
         * put all the names into a linked
         * list so that it may be generated in sorted order.
@@ -505,7 +543,7 @@ dumpsignatures(void)
 
        wi = types[TINT32]->width;
 
-       for(d=externdcl; d!=D; d=d->forw) {
+       for(d=signatlist; d!=D; d=d->forw) {
                if(d->op != OTYPE)
                        continue;
 
index 54c437d3cd2bf4c138e2e913b49bb5d2f7f38bf8..01b4902179bc167abb6f12b9d89c3149efc28d8c 100644 (file)
@@ -52,6 +52,7 @@ dodcltype(Type *n, Type *t)
        }
        if(exportadj)
                exportsym(n->sym);
+       n->sym->local = 1;
        addtyp(n, t, dclcontext);
 }
 
index 11d8b56b9c58565ff04c80738f404ea520ea63e9..b7019bccbd06dac9c8767641b05d11bd858a6b27 100644 (file)
@@ -195,8 +195,9 @@ struct      Sym
 
        uchar   undef;          // a diagnostic has been generated
        uchar   export;         // marked as export
-       uchar   exported;       // has been exported
+       uchar   exported;       // exported
        uchar   sym;            // huffman encoding in object file
+       uchar   local;          // created in this file
 
        char*   opackage;       // original package name
        char*   package;        // package name
@@ -429,6 +430,7 @@ EXTERN      Dcl*    autodcl;
 EXTERN Dcl*    paramdcl;
 EXTERN Dcl*    externdcl;
 EXTERN Dcl*    exportlist;
+EXTERN Dcl*    signatlist;
 EXTERN int     dclcontext;     // PEXTERN/PAUTO
 EXTERN int     importflag;
 EXTERN int     inimportsys;
index c317fbdaea82c404d2b582d223e44276b2f51d36..8612f6d1303b59deb1e4e2ee935a6842257a018c 100644 (file)
@@ -1970,8 +1970,6 @@ mapop(Node *n, int top)
                        goto shape;
 
                // mapassign1(hmap *map[any-1]any-2, key any-3, val any-4);
-
-//dump("assign1", n);
                if(n->left->op != OINDEX)
                        goto shape;
 
@@ -1999,8 +1997,6 @@ mapop(Node *n, int top)
 
        assign2:
                // mapassign2(hmap *map[any]any, key any, val any, pres bool);
-
-//dump("assign2", n);
                if(n->left->op != OINDEX)
                        goto shape;