From a457fa500d35d352a76883706e82fd7e9f8e4bd7 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 21 Feb 2012 22:54:07 -0500 Subject: [PATCH] gc: return of ideal bool This is a manual undo of CL 5674098. It does not implement the even less strict spec that we just agreed on, but it gets us back where we were at the last weekly. R=ken2 CC=golang-dev https://golang.org/cl/5683069 --- src/cmd/gc/const.c | 7 ++++--- src/cmd/gc/export.c | 2 +- src/cmd/gc/fmt.c | 4 ++-- src/cmd/gc/go.h | 1 + src/cmd/gc/lex.c | 5 +++-- src/cmd/gc/subr.c | 4 ++-- test/fixedbugs/bug285.go | 1 + test/named.go | 4 +++- test/named1.go | 4 ++-- 9 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c index abdd424394c..15c760b3a6c 100644 --- a/src/cmd/gc/const.c +++ b/src/cmd/gc/const.c @@ -586,7 +586,7 @@ evconst(Node *n) n->diag = 1; } return; - + case TUP(OADD, CTINT): case TUP(OADD, CTRUNE): mpaddfixfix(v.u.xval, rv.u.xval, 0); @@ -668,6 +668,7 @@ evconst(Node *n) n->diag = 1; } return; + case TUP(OADD, CTCPLX): mpaddfltflt(&v.u.cval->real, &rv.u.cval->real); mpaddfltflt(&v.u.cval->imag, &rv.u.cval->imag); @@ -943,7 +944,7 @@ nodlit(Val v) n->type = idealstring; break; case CTBOOL: - n->type = types[TBOOL]; + n->type = idealbool; break; case CTINT: case CTRUNE: @@ -1032,7 +1033,7 @@ defaultlit(Node **np, Type *t) defaultlit(&n->left, t); defaultlit(&n->right, t); } - if(n->type == types[TBOOL] || n->type == idealstring) + if(n->type == idealbool || n->type == idealstring) n->type = types[n->type->etype]; else n->type = n->left->type; diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c index 1eb4c2280cf..bbed8ae36e1 100644 --- a/src/cmd/gc/export.c +++ b/src/cmd/gc/export.c @@ -122,7 +122,7 @@ reexportdep(Node *n) case OLITERAL: t = n->type; - if(t != types[n->type->etype] && t != idealstring) { + if(t != types[n->type->etype] && t != idealbool && t != idealstring) { if(isptr[t->etype]) t = t->type; if (t && t->sym && t->sym->def && t->sym->pkg != localpkg && t->sym->pkg != builtinpkg) { diff --git a/src/cmd/gc/fmt.c b/src/cmd/gc/fmt.c index b942ed6082f..093b276f070 100644 --- a/src/cmd/gc/fmt.c +++ b/src/cmd/gc/fmt.c @@ -602,7 +602,7 @@ typefmt(Fmt *fp, Type *t) } if(t->etype < nelem(basicnames) && basicnames[t->etype] != nil) { - if(fmtmode == FErr && t == idealstring) + if(fmtmode == FErr && (t == idealbool || t == idealstring)) fmtstrcpy(fp, "ideal "); return fmtstrcpy(fp, basicnames[t->etype]); } @@ -1086,7 +1086,7 @@ exprfmt(Fmt *f, Node *n, int prec) return fmtprint(f, "%S", n->sym); if(n->val.ctype == CTNIL) n = n->orig; // if this node was a nil decorated with at type, print the original naked nil - if(n->type != types[n->type->etype] && n->type != idealstring) { + if(n->type != types[n->type->etype] && n->type != idealbool && n->type != idealstring) { // Need parens when type begins with what might // be misinterpreted as a unary operator: * or <-. if(isptr[n->type->etype] || (n->type->etype == TCHAN && n->type->chan == Crecv)) diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index 8141b968693..fcbea2cd90c 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -775,6 +775,7 @@ EXTERN Idir* idirs; EXTERN Type* types[NTYPE]; EXTERN Type* idealstring; +EXTERN Type* idealbool; EXTERN Type* bytetype; EXTERN Type* runetype; EXTERN Type* errortype; diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c index 56f34fde7f7..e880b2f34ce 100644 --- a/src/cmd/gc/lex.c +++ b/src/cmd/gc/lex.c @@ -1824,16 +1824,17 @@ lexinit(void) // this is the ideal form // (the type of x in const x = "hello"). idealstring = typ(TSTRING); + idealbool = typ(TBOOL); s = pkglookup("true", builtinpkg); s->def = nodbool(1); s->def->sym = lookup("true"); - s->def->type = types[TBOOL]; + s->def->type = idealbool; s = pkglookup("false", builtinpkg); s->def = nodbool(0); s->def->sym = lookup("false"); - s->def->type = types[TBOOL]; + s->def->type = idealbool; s = lookup("_"); s->block = -100; diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 74041fdcedc..5621ed9d343 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -768,7 +768,7 @@ nodbool(int b) c = nodintconst(0); c->val.ctype = CTBOOL; c->val.u.bval = b; - c->type = types[TBOOL]; + c->type = idealbool; return c; } @@ -929,7 +929,7 @@ isideal(Type *t) { if(t == T) return 0; - if(t == idealstring) + if(t == idealstring || t == idealbool) return 1; switch(t->etype) { case TNIL: diff --git a/test/fixedbugs/bug285.go b/test/fixedbugs/bug285.go index 6b0099b8dbe..0a8a0f09e60 100644 --- a/test/fixedbugs/bug285.go +++ b/test/fixedbugs/bug285.go @@ -20,6 +20,7 @@ func main() { type B bool b := B(false) mb := make(map[B]int) + mb[false] = 42 // this should work: false is assignment compatible with B mb[b] = 42 type Z int diff --git a/test/named.go b/test/named.go index 9b8e10ba22d..d0330ab2389 100644 --- a/test/named.go +++ b/test/named.go @@ -31,6 +31,7 @@ func asString(String) {} func (Map) M() {} + // These functions check at run time that the default type // (in the absence of any implicit conversion hints) // is the given type. @@ -46,7 +47,7 @@ func isString(x interface{}) { _ = x.(String) } func main() { var ( a Array - b Bool = Bool(true) + b Bool = true c Chan = make(Chan) f Float = 1 i Int = 1 @@ -66,6 +67,7 @@ func main() { isBool(b) asBool(!b) isBool(!b) + asBool(true) asBool(*&b) isBool(*&b) asBool(Bool(true)) diff --git a/test/named1.go b/test/named1.go index 8be7292ca9a..ca9da0fa31a 100644 --- a/test/named1.go +++ b/test/named1.go @@ -26,7 +26,7 @@ type String string func main() { var ( - b Bool = Bool(true) + b Bool = true i, j int c = make(chan int) m = make(Map) @@ -34,7 +34,7 @@ func main() { asBool(b) asBool(!b) - asBool(true) // ERROR "cannot use.*type bool.*as type Bool" + asBool(true) asBool(*&b) asBool(Bool(true)) asBool(1 != 2) // ERROR "cannot use.*type bool.*as type Bool"