Commit 4ac011a0 authored by Russ Cox's avatar Russ Cox

gc: simplify complex typecheck

do not convert to float prematurely.

R=ken2
CC=golang-dev
https://golang.org/cl/311041
parent 4f89dcdf
......@@ -888,6 +888,9 @@ nodcplxlit(Val r, Val i)
Node *n;
Mpcplx *c;
r = toflt(r);
i = toflt(i);
c = mal(sizeof(*c));
n = nod(OLITERAL, N, N);
n->type = types[TIDEAL];
......
......@@ -309,6 +309,26 @@ exprfmt(Fmt *f, Node *n, int prec)
fmtprint(f, ")");
break;
case OCMPLX:
fmtprint(f, "cmplx(");
exprfmt(f, n->left, 0);
fmtprint(f, ", ");
exprfmt(f, n->right, 0);
fmtprint(f, ")");
break;
case OREAL:
fmtprint(f, "real(");
exprfmt(f, n->left, 0);
fmtprint(f, ")");
break;
case OIMAG:
fmtprint(f, "imag(");
exprfmt(f, n->left, 0);
fmtprint(f, ")");
break;
case OCONV:
case OCONVNOP:
case OCONVSLICE:
......
......@@ -788,51 +788,34 @@ reswitch:
if(l->type == T || r->type == T)
goto error;
defaultlit2(&l, &r, 0);
if(l->op == OLITERAL && r->op == OLITERAL) {
// make it a complex literal
switch(l->type->etype) {
default:
yyerror("real and imag parts must be the floating");
goto error;
case TIDEAL:
convlit(&l, types[TFLOAT]);
convlit(&r, types[TFLOAT]);
t = types[TIDEAL];
// fallthrough
case TFLOAT:
t = types[TCOMPLEX];
break;
case TFLOAT32:
t = types[TCOMPLEX64];
break;
case TFLOAT64:
t = types[TCOMPLEX128];
break;
}
n = nodcplxlit(l->val, r->val);
n->type = t;
goto ret;
}
n->left = l;
n->right = r;
if(l->type->etype != l->type->etype) {
yyerror("real and imag parts must be the same type");
badcmplx:
yyerror("invalid operation: %#N (cmplx of types %T, %T)", n, l->type, r->type);
goto error;
}
switch(l->type->etype) {
default:
yyerror("real and imag parts must be the floating");
goto error;
goto badcmplx;
case TIDEAL:
t = types[TIDEAL];
break;
case TFLOAT:
n->type = types[TCOMPLEX];
t = types[TCOMPLEX];
break;
case TFLOAT32:
n->type = types[TCOMPLEX64];
t = types[TCOMPLEX64];
break;
case TFLOAT64:
n->type = types[TCOMPLEX128];
t = types[TCOMPLEX128];
break;
}
if(l->op == OLITERAL && r->op == OLITERAL) {
// make it a complex literal
n = nodcplxlit(l->val, r->val);
}
n->type = t;
goto ret;
case OCLOSED:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment