fix bugs in package locals
R=ken
OCL=19299
CL=19299
diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c
index 41d3fc4..66a568c 100644
--- a/src/cmd/gc/export.c
+++ b/src/cmd/gc/export.c
@@ -270,7 +270,7 @@
* 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 @@
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 @@
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 @@
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 @@
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 @@
{
Sym *s;
- s = importsym(ss, LATYPE);
+ s = importsym(export, ss, LATYPE);
if(s->otype != T) {
if(eqtype(t, s->otype, 0))
return;
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index cc842bc..e26d389 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -209,6 +209,7 @@
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
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 2e81078..e1bdde5 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -982,7 +982,7 @@
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);