mirror of
https://github.com/golang/go
synced 2024-11-25 03:07:56 -07:00
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
This commit is contained in:
parent
5bcad92f07
commit
a457fa500d
@ -668,6 +668,7 @@ evconst(Node *n)
|
|||||||
n->diag = 1;
|
n->diag = 1;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case TUP(OADD, CTCPLX):
|
case TUP(OADD, CTCPLX):
|
||||||
mpaddfltflt(&v.u.cval->real, &rv.u.cval->real);
|
mpaddfltflt(&v.u.cval->real, &rv.u.cval->real);
|
||||||
mpaddfltflt(&v.u.cval->imag, &rv.u.cval->imag);
|
mpaddfltflt(&v.u.cval->imag, &rv.u.cval->imag);
|
||||||
@ -943,7 +944,7 @@ nodlit(Val v)
|
|||||||
n->type = idealstring;
|
n->type = idealstring;
|
||||||
break;
|
break;
|
||||||
case CTBOOL:
|
case CTBOOL:
|
||||||
n->type = types[TBOOL];
|
n->type = idealbool;
|
||||||
break;
|
break;
|
||||||
case CTINT:
|
case CTINT:
|
||||||
case CTRUNE:
|
case CTRUNE:
|
||||||
@ -1032,7 +1033,7 @@ defaultlit(Node **np, Type *t)
|
|||||||
defaultlit(&n->left, t);
|
defaultlit(&n->left, t);
|
||||||
defaultlit(&n->right, 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];
|
n->type = types[n->type->etype];
|
||||||
else
|
else
|
||||||
n->type = n->left->type;
|
n->type = n->left->type;
|
||||||
|
@ -122,7 +122,7 @@ reexportdep(Node *n)
|
|||||||
|
|
||||||
case OLITERAL:
|
case OLITERAL:
|
||||||
t = n->type;
|
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])
|
if(isptr[t->etype])
|
||||||
t = t->type;
|
t = t->type;
|
||||||
if (t && t->sym && t->sym->def && t->sym->pkg != localpkg && t->sym->pkg != builtinpkg) {
|
if (t && t->sym && t->sym->def && t->sym->pkg != localpkg && t->sym->pkg != builtinpkg) {
|
||||||
|
@ -602,7 +602,7 @@ typefmt(Fmt *fp, Type *t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(t->etype < nelem(basicnames) && basicnames[t->etype] != nil) {
|
if(t->etype < nelem(basicnames) && basicnames[t->etype] != nil) {
|
||||||
if(fmtmode == FErr && t == idealstring)
|
if(fmtmode == FErr && (t == idealbool || t == idealstring))
|
||||||
fmtstrcpy(fp, "ideal ");
|
fmtstrcpy(fp, "ideal ");
|
||||||
return fmtstrcpy(fp, basicnames[t->etype]);
|
return fmtstrcpy(fp, basicnames[t->etype]);
|
||||||
}
|
}
|
||||||
@ -1086,7 +1086,7 @@ exprfmt(Fmt *f, Node *n, int prec)
|
|||||||
return fmtprint(f, "%S", n->sym);
|
return fmtprint(f, "%S", n->sym);
|
||||||
if(n->val.ctype == CTNIL)
|
if(n->val.ctype == CTNIL)
|
||||||
n = n->orig; // if this node was a nil decorated with at type, print the original naked nil
|
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
|
// Need parens when type begins with what might
|
||||||
// be misinterpreted as a unary operator: * or <-.
|
// be misinterpreted as a unary operator: * or <-.
|
||||||
if(isptr[n->type->etype] || (n->type->etype == TCHAN && n->type->chan == Crecv))
|
if(isptr[n->type->etype] || (n->type->etype == TCHAN && n->type->chan == Crecv))
|
||||||
|
@ -775,6 +775,7 @@ EXTERN Idir* idirs;
|
|||||||
|
|
||||||
EXTERN Type* types[NTYPE];
|
EXTERN Type* types[NTYPE];
|
||||||
EXTERN Type* idealstring;
|
EXTERN Type* idealstring;
|
||||||
|
EXTERN Type* idealbool;
|
||||||
EXTERN Type* bytetype;
|
EXTERN Type* bytetype;
|
||||||
EXTERN Type* runetype;
|
EXTERN Type* runetype;
|
||||||
EXTERN Type* errortype;
|
EXTERN Type* errortype;
|
||||||
|
@ -1824,16 +1824,17 @@ lexinit(void)
|
|||||||
// this is the ideal form
|
// this is the ideal form
|
||||||
// (the type of x in const x = "hello").
|
// (the type of x in const x = "hello").
|
||||||
idealstring = typ(TSTRING);
|
idealstring = typ(TSTRING);
|
||||||
|
idealbool = typ(TBOOL);
|
||||||
|
|
||||||
s = pkglookup("true", builtinpkg);
|
s = pkglookup("true", builtinpkg);
|
||||||
s->def = nodbool(1);
|
s->def = nodbool(1);
|
||||||
s->def->sym = lookup("true");
|
s->def->sym = lookup("true");
|
||||||
s->def->type = types[TBOOL];
|
s->def->type = idealbool;
|
||||||
|
|
||||||
s = pkglookup("false", builtinpkg);
|
s = pkglookup("false", builtinpkg);
|
||||||
s->def = nodbool(0);
|
s->def = nodbool(0);
|
||||||
s->def->sym = lookup("false");
|
s->def->sym = lookup("false");
|
||||||
s->def->type = types[TBOOL];
|
s->def->type = idealbool;
|
||||||
|
|
||||||
s = lookup("_");
|
s = lookup("_");
|
||||||
s->block = -100;
|
s->block = -100;
|
||||||
|
@ -768,7 +768,7 @@ nodbool(int b)
|
|||||||
c = nodintconst(0);
|
c = nodintconst(0);
|
||||||
c->val.ctype = CTBOOL;
|
c->val.ctype = CTBOOL;
|
||||||
c->val.u.bval = b;
|
c->val.u.bval = b;
|
||||||
c->type = types[TBOOL];
|
c->type = idealbool;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -929,7 +929,7 @@ isideal(Type *t)
|
|||||||
{
|
{
|
||||||
if(t == T)
|
if(t == T)
|
||||||
return 0;
|
return 0;
|
||||||
if(t == idealstring)
|
if(t == idealstring || t == idealbool)
|
||||||
return 1;
|
return 1;
|
||||||
switch(t->etype) {
|
switch(t->etype) {
|
||||||
case TNIL:
|
case TNIL:
|
||||||
|
@ -20,6 +20,7 @@ func main() {
|
|||||||
type B bool
|
type B bool
|
||||||
b := B(false)
|
b := B(false)
|
||||||
mb := make(map[B]int)
|
mb := make(map[B]int)
|
||||||
|
mb[false] = 42 // this should work: false is assignment compatible with B
|
||||||
mb[b] = 42
|
mb[b] = 42
|
||||||
|
|
||||||
type Z int
|
type Z int
|
||||||
|
@ -31,6 +31,7 @@ func asString(String) {}
|
|||||||
|
|
||||||
func (Map) M() {}
|
func (Map) M() {}
|
||||||
|
|
||||||
|
|
||||||
// These functions check at run time that the default type
|
// These functions check at run time that the default type
|
||||||
// (in the absence of any implicit conversion hints)
|
// (in the absence of any implicit conversion hints)
|
||||||
// is the given type.
|
// is the given type.
|
||||||
@ -46,7 +47,7 @@ func isString(x interface{}) { _ = x.(String) }
|
|||||||
func main() {
|
func main() {
|
||||||
var (
|
var (
|
||||||
a Array
|
a Array
|
||||||
b Bool = Bool(true)
|
b Bool = true
|
||||||
c Chan = make(Chan)
|
c Chan = make(Chan)
|
||||||
f Float = 1
|
f Float = 1
|
||||||
i Int = 1
|
i Int = 1
|
||||||
@ -66,6 +67,7 @@ func main() {
|
|||||||
isBool(b)
|
isBool(b)
|
||||||
asBool(!b)
|
asBool(!b)
|
||||||
isBool(!b)
|
isBool(!b)
|
||||||
|
asBool(true)
|
||||||
asBool(*&b)
|
asBool(*&b)
|
||||||
isBool(*&b)
|
isBool(*&b)
|
||||||
asBool(Bool(true))
|
asBool(Bool(true))
|
||||||
|
@ -26,7 +26,7 @@ type String string
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var (
|
var (
|
||||||
b Bool = Bool(true)
|
b Bool = true
|
||||||
i, j int
|
i, j int
|
||||||
c = make(chan int)
|
c = make(chan int)
|
||||||
m = make(Map)
|
m = make(Map)
|
||||||
@ -34,7 +34,7 @@ func main() {
|
|||||||
|
|
||||||
asBool(b)
|
asBool(b)
|
||||||
asBool(!b)
|
asBool(!b)
|
||||||
asBool(true) // ERROR "cannot use.*type bool.*as type Bool"
|
asBool(true)
|
||||||
asBool(*&b)
|
asBool(*&b)
|
||||||
asBool(Bool(true))
|
asBool(Bool(true))
|
||||||
asBool(1 != 2) // ERROR "cannot use.*type bool.*as type Bool"
|
asBool(1 != 2) // ERROR "cannot use.*type bool.*as type Bool"
|
||||||
|
Loading…
Reference in New Issue
Block a user