aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2008-09-24 14:12:21 -0700
committerKen Thompson <ken@golang.org>2008-09-24 14:12:21 -0700
commit5f0a5e7a1335eb9e4e6b430a61a9bfb1d168df21 (patch)
tree19a4a5382b34de9c2bee21c84d10e7d75299e951 /src
parent3f106f976a369188350351345f9879f61cce48a6 (diff)
downloadgo-5f0a5e7a1335eb9e4e6b430a61a9bfb1d168df21.tar.xz
more export
R=r OCL=15771 CL=15771
Diffstat (limited to 'src')
-rw-r--r--src/cmd/gc/export.c91
-rw-r--r--src/cmd/gc/go.y4
2 files changed, 73 insertions, 22 deletions
diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c
index 627d005873..8bc326ebbc 100644
--- a/src/cmd/gc/export.c
+++ b/src/cmd/gc/export.c
@@ -28,15 +28,11 @@ exportsym(Sym *s)
}
void
-reexport(Type *t)
+makeexportsym(Type *t)
{
Sym *s;
- if(t == T)
- fatal("reexport: type nil");
-
- s = t->sym;
- if(s == S/* || s->name[0] == '_'*/) {
+ if(t->sym == S) {
exportgen++;
snprint(namebuf, sizeof(namebuf), "_e%s_%.3ld", filename, exportgen);
s = lookup(namebuf);
@@ -44,6 +40,18 @@ reexport(Type *t)
s->otype = t;
t->sym = s;
}
+}
+
+void
+reexport(Type *t)
+{
+ Sym *s;
+
+ if(t == T)
+ fatal("reexport: type nil");
+
+ makeexportsym(t);
+ s = t->sym;
dumpexporttype(s);
}
@@ -164,14 +172,17 @@ dumpexporttype(Sym *s)
case TPTR32:
case TPTR64:
- if(t->type != T && t->type->sym == S)
- reexport(t->type);
+ if(t->type == T)
+ fatal("dumpexporttype: ptr %S", s);
+ makeexportsym(t->type); /* forw declare */
/* type 6 */
Bprint(bout, "\ttype ");
if(s->export != 0)
Bprint(bout, "!");
Bprint(bout, "%lS *%lS\n", s, t->type->sym);
+
+ reexport(t->type);
break;
case TFUNC:
@@ -220,7 +231,7 @@ dumpexporttype(Sym *s)
reexport(t->type);
reexport(t->down);
- /* type 6 */
+ /* type 1 */
Bprint(bout, "\ttype ");
if(s->export != 0)
Bprint(bout, "!");
@@ -323,6 +334,50 @@ dumpexport(void)
/*
* ******* import *******
*/
+
+void
+checkimports(void)
+{
+ Sym *s;
+ Type *t, *t1;
+ uint32 h;
+ int et;
+
+ for(h=0; h<NHASH; h++)
+ for(s = hash[h]; s != S; s = s->link) {
+ t = s->otype;
+ if(t == T)
+ continue;
+
+ et = t->etype;
+ switch(t->etype) {
+ case TFORW:
+ print("ci-1: %S %lT\n", s, t);
+ break;
+
+ case TPTR32:
+ case TPTR64:
+ if(t->type == T) {
+ print("ci-2: %S %lT\n", s, t);
+ break;
+ }
+
+ t1 = t->type;
+ if(t1 == T) {
+ print("ci-3: %S %lT\n", s, t1);
+ break;
+ }
+
+ et = t1->etype;
+ if(et == TFORW) {
+ print("%L: ci-4: %S %lT\n", lineno, s, t);
+ break;
+ }
+ break;
+ }
+ }
+}
+
void
renamepkg(Node *n)
{
@@ -451,21 +506,13 @@ importaddtyp(Node *ss, Type *t)
Sym *s;
s = getimportsym(ss);
- if(ss->etype){ // exported
- if(s->otype == T || !eqtype(t, s->otype, 0)) {
- if(s->otype != T)
- print("redeclaring %S %lT => %lT\n", s, s->otype, t);
- addtyp(newtype(s), t, PEXTERN);
- /*
- * mark as export to avoid conflicting export bits
- * in multi-file package.
- */
- s->export = 1;
- }
- }else{
+ if(s->otype != T && !eqtype(t, s->otype, 0)) {
+ yyerror("import redeclaration of %S %lT => %lT\n", s, s->otype, t);
s->otype = t;
- t->sym = s;
}
+
+ if(s->otype == T)
+ addtyp(newtype(s), t, PEXTERN);
}
/*
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index d17f1fc6cb..049b977192 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -129,9 +129,13 @@ import_package:
import_there:
hidden_import_list_r ')' ')'
{
+ checkimports();
unimportfile();
}
| LIMPORT '(' '(' hidden_import_list_r ')' ')'
+ {
+ checkimports();
+ }
/*
* declarations