]> Cypherpunks repositories - gostls13.git/commitdiff
clean up ideal handling; reject attempts
authorRuss Cox <rsc@golang.org>
Thu, 27 Aug 2009 18:16:34 +0000 (11:16 -0700)
committerRuss Cox <rsc@golang.org>
Thu, 27 Aug 2009 18:16:34 +0000 (11:16 -0700)
to write type descriptors for ideal types

R=ken
OCL=33958
CL=33958

src/cmd/gc/const.c
src/cmd/gc/go.h
src/cmd/gc/reflect.c
src/cmd/gc/subr.c

index 1433eb9ba5a9c061a732c00f40031b1feba44882..59bd9a3887b7982bf214e96fb36a7822e71f895f 100644 (file)
@@ -66,18 +66,13 @@ convlit(Node **np, Type *t)
 void
 convlit1(Node **np, Type *t, int explicit)
 {
-       int et, ct;
+       int ct, et;
        Node *n, *nn;
 
        n = *np;
-       if(n == N || t == T || n->type == T)
+       if(n == N || t == T || n->type == T || isideal(t) || eqtype(t, n->type))
                return;
-       et = t->etype;
-       if(et == TIDEAL || et == TNIL)
-               return;
-       if(eqtype(t, n->type))
-               return;
-       if(!explicit && n->type->etype != TIDEAL && n->type != idealstring && n->type->etype != TNIL)
+       if(!explicit && !isideal(n->type))
                return;
 
 //dump("convlit1", n);
@@ -120,6 +115,7 @@ convlit1(Node **np, Type *t, int explicit)
        if(ct < 0)
                goto bad;
 
+       et = t->etype;
        if(et == TINTER) {
                if(ct == CTNIL && n->type == types[TNIL]) {
                        n->type = t;
@@ -129,21 +125,6 @@ convlit1(Node **np, Type *t, int explicit)
                return;
        }
 
-       // if already has non-ideal type, cannot change implicitly
-       if(!explicit) {
-               switch(n->type->etype) {
-               case TIDEAL:
-               case TNIL:
-                       break;
-               case TSTRING:
-                       if(n->type == idealstring)
-                               break;
-                       // fall through
-               default:
-                       goto bad;
-               }
-       }
-
        switch(ct) {
        default:
                goto bad;
@@ -203,7 +184,7 @@ convlit1(Node **np, Type *t, int explicit)
        return;
 
 bad:
-       if(n->type->etype == TIDEAL) {
+       if(isideal(n->type)) {
                defaultlit(&n, T);
                *np = n;
        }
@@ -720,9 +701,7 @@ defaultlit(Node **np, Type *t)
        Node *n, *nn;
 
        n = *np;
-       if(n == N)
-               return;
-       if(n->type == T || (n->type->etype != TIDEAL && n->type->etype != TNIL))
+       if(n == N || !isideal(n->type))
                return;
 
        switch(n->op) {
@@ -749,8 +728,7 @@ defaultlit(Node **np, Type *t)
                return;
        }
 
-       lno = lineno;
-       lineno = n->lineno;
+       lno = setlineno(n);
        switch(n->val.ctype) {
        default:
                if(t != T) {
@@ -763,6 +741,10 @@ defaultlit(Node **np, Type *t)
                        n->type = T;
                        break;
                }
+               if(n->val.ctype == CTSTR) {
+                       n->type = types[TSTRING];
+                       break;
+               }
                yyerror("defaultlit: unknown literal: %#N", n);
                break;
        case CTINT:
index f7d6f83c97b1e7644725e6d19a27cfafbb7d4e36..bcbc5f84c83b332d3bc42e6010e98b0178f49952 100644 (file)
@@ -805,6 +805,7 @@ int isslice(Type*);
 int    isinter(Type*);
 int    isnilinter(Type*);
 int    isddd(Type*);
+int    isideal(Type*);
 Type*  maptype(Type*, Type*);
 Type*  methtype(Type*);
 Node*  typename(Type*);
index 597b6a6a34883e9291e40ca4f9313a26c53cce65..c82875ca894b0a34ec872cd49f4676ab3075cc2a 100644 (file)
@@ -320,7 +320,7 @@ dextratype(Type *t)
                else
                        ot = duintptr(s, ot, 0);
        }
-       ggloblsym(s, ot, 1);
+       ggloblsym(s, ot, 0);
 
        return s;
 }
@@ -480,6 +480,10 @@ dtypesym(Type *t)
        Sym *s, *s1, *s2;
        Sig *a, *m;
        Type *t1;
+       Sym *tsym;
+
+       if(t->etype == TNIL || t->etype == TIDEAL || t == idealstring)
+               fatal("dtypesym ideal %T", t);
 
        s = typesym(t);
        if(s->flags & SymSiggen)
@@ -492,6 +496,11 @@ dtypesym(Type *t)
        t1 = T;
        if(isptr[t->etype])
                t1 = t->type;
+       tsym = S;
+       if(t1)
+               tsym = t1->sym;
+       else
+               tsym = t->sym;
 
        if(strcmp(package, "runtime") == 0) {
                if(t == types[t->etype])
@@ -639,7 +648,7 @@ ok:
                break;
        }
 
-       ggloblsym(s, ot, 1);
+       ggloblsym(s, ot, tsym == nil);
        return s;
 }
 
index 3c4aaf2fee26c9845f7211de7bf1b8a8c13c0489..052be2a8446b4f836901ccdfa2717d7ef1d54954 100644 (file)
@@ -1468,6 +1468,16 @@ isddd(Type *t)
        return 0;
 }
 
+int
+isideal(Type *t)
+{
+       if(t == T)
+               return 0;
+       if(t == idealstring)
+               return 1;
+       return t->etype == TNIL || t->etype == TIDEAL;
+}
+
 /*
  * given receiver of type t (t == r or t == *r)
  * return type to hang methods off (r).