]> Cypherpunks repositories - gostls13.git/commitdiff
fix bugs in package locals
authorRuss Cox <rsc@golang.org>
Sat, 15 Nov 2008 01:31:29 +0000 (17:31 -0800)
committerRuss Cox <rsc@golang.org>
Sat, 15 Nov 2008 01:31:29 +0000 (17:31 -0800)
R=ken
OCL=19299
CL=19299

src/cmd/gc/export.c
src/cmd/gc/go.h
src/cmd/gc/subr.c

index 41d3fc4143896b6083da38a5badffbfb128ee61a..66a568cc4a98c926ef4db48610ec6b31ce1e064e 100644 (file)
@@ -270,7 +270,7 @@ pkgsym(char *name, char *pkg, int lexical)
  * return the sym for ss, which should match lexical
  */
 Sym*
-importsym(Node *ss, int lexical)
+importsym(int export, Node *ss, int lexical)
 {
        Sym *s;
 
@@ -282,7 +282,12 @@ importsym(Node *ss, int lexical)
        s = pkgsym(ss->sym->name, ss->psym->name, lexical);
        /* TODO botch - need some diagnostic checking for the following assignment */
        s->opackage = ss->osym->name;
-       s->export = 1;
+       if(export) {
+               if(s->export != export && s->export != 0)
+                       yyerror("export/package mismatch: %S", s);
+               s->export = export;
+       }
+       s->imported = 1;
        return s;
 }
 
@@ -303,7 +308,7 @@ pkgtype(char *name, char *pkg)
        n->psym = lookup(pkg);
        n->osym = n->psym;
        renamepkg(n);
-       s = importsym(n, LATYPE);
+       s = importsym(0, n, LATYPE);
 
        if(s->otype == T) {
                t = typ(TFORW);
@@ -332,14 +337,13 @@ importconst(int export, Node *ss, Type *t, Val *v)
        n->val = *v;
        n->type = t;
 
-       s = importsym(ss, LNAME);
+       s = importsym(export, ss, LNAME);
        if(s->oconst != N) {
                // TODO: check if already the same.
                return;
        }
 
        dodclconst(newname(s), n);
-       s->export = export;
 
        if(debug['e'])
                print("import const %S\n", s);
@@ -353,7 +357,7 @@ importvar(int export, Node *ss, Type *t)
        if(export == 2 && !mypackage(ss))
                return;
 
-       s = importsym(ss, LNAME);
+       s = importsym(export, ss, LNAME);
        if(s->oname != N) {
                if(eqtype(t, s->oname->type, 0))
                        return;
@@ -373,7 +377,7 @@ importtype(int export, Node *ss, Type *t)
 {
        Sym *s;
 
-       s = importsym(ss, LATYPE);
+       s = importsym(export, ss, LATYPE);
        if(s->otype != T) {
                if(eqtype(t, s->otype, 0))
                        return;
index cc842bc94f9c20658cb763b40cef721326a67152..e26d38946a7ba7343d22059f08e290205e52f284 100644 (file)
@@ -209,6 +209,7 @@ struct      Sym
        uchar   undef;          // a diagnostic has been generated
        uchar   export;         // marked as export
        uchar   exported;       // exported
+       uchar   imported;       // imported
        uchar   sym;            // huffman encoding in object file
        uchar   local;          // created in this file
        uchar   uniq;           // imbedded field name first found
index 2e81078857a0659fa03057edbde3b5fdaa4f5bd1..e1bdde5f588e42c09a000379a175755dec587178 100644 (file)
@@ -982,7 +982,7 @@ Tpretty(Fmt *fp, Type *t)
                        else
                                fmtprint(fp, "%lS", s);
                        if(strcmp(s->opackage, package) == 0)
-                       if(s->otype != t || !s->export) {
+                       if(s->otype != t || (!s->export && !s->imported)) {
                                fmtprint(fp, "·%s", filename);
                                if(t->vargen)
                                        fmtprint(fp, "·%d", t->vargen);