compiler changes:

export.c:
		- only expose explicitly exported types to importer
		- fix behind your back
	go.h:
		- add deep() prototype (fixes 64-bit linux crash on time.go)
	go.y:
		- add a new syntax error case
	walk.c:
		- allow a,b = f() where f is func ptr (fixes bug088)

R=ken
OCL=15617
CL=15630
This commit is contained in:
Russ Cox 2008-09-22 12:45:01 -07:00
parent 8231e94520
commit fb2c66710c
7 changed files with 27 additions and 16 deletions

View file

@ -143,7 +143,10 @@ dumpexporttype(Sym *s)
if(et < 0 || et >= nelem(types) || types[et] == T)
fatal("dumpexporttype: basic type: %S %E", s, et);
/* type 5 */
Bprint(bout, "\ttype %lS %d\n", s, et);
Bprint(bout, "\ttype ");
if(s->export != 0)
Bprint(bout, "!");
Bprint(bout, "%lS %d\n", s, et);
break;
case TARRAY:
@ -298,11 +301,6 @@ renamepkg(Node *n)
if(n->psym == pkgimportname)
if(pkgmyname != S)
n->psym = pkgmyname;
if(n->psym->lexical != LPACK) {
warn("%S is becoming a package behind your back", n->psym);
n->psym->lexical = LPACK;
}
}
Sym*
@ -425,16 +423,21 @@ importaddtyp(Node *ss, Type *t)
Sym *s;
s = getimportsym(ss);
if(s->otype == T) {
addtyp(newtype(s), t, PEXTERN);
return;
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{
s->otype = t;
t->sym = s;
}
if(!eqtype(t, s->otype, 0)) {
print("redeclaring %S %lT => %lT\n", s, s->otype, t);
addtyp(newtype(s), t, PEXTERN);
return;
}
// print("sametype %S %lT => %lT\n", s, s->otype, t);
}
/*

View file

@ -729,3 +729,4 @@ void dowidth(Type*);
void argspace(int32);
Node* nodarg(Type*, int);
void nodconst(Node*, Type*, vlong);
Type* deep(Type*);

View file

@ -1693,7 +1693,12 @@ latype:
}
| LNAME
{
yyerror("%s is var, not type", $1->name);
yyerror("no type %s", $1->name);
YYERROR;
}
| lpack '.' LNAME
{
yyerror("no type %s.%s", context, $3->name);
YYERROR;
}

View file

@ -2691,6 +2691,8 @@ multi:
case OCALL:
walktype(nr->left, Erv);
t = nr->left->type;
if(t != T && t->etype == tptr)
t = t->type;
if(t == T || t->etype != TFUNC)
goto badt;
if(t->outtuple != cl)