]> Cypherpunks repositories - gostls13.git/commitdiff
gc: complex(0)
authorRuss Cox <rsc@golang.org>
Mon, 13 Dec 2010 20:34:45 +0000 (15:34 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 13 Dec 2010 20:34:45 +0000 (15:34 -0500)
Fixes #1232.

R=ken2
CC=golang-dev
https://golang.org/cl/3621041

src/cmd/gc/const.c
src/cmd/gc/mparith1.c
test/cmplx.go

index 5a7c5489428b9af80524910735dbdc4621b79025..72e67a63405cd26a928845b92fd8a3022e998c14 100644 (file)
@@ -202,8 +202,6 @@ convlit1(Node **np, Type *t, int explicit)
                                goto bad;
                        case CTFLT:
                        case CTINT:
-                               if(explicit)
-                                       goto bad;
                                n->val = tocplx(n->val);
                                break;
                        case CTCPLX:
@@ -300,7 +298,7 @@ toflt(Val v)
                f = mal(sizeof(*f));
                mpmovefltflt(f, &v.u.cval->real);
                if(mpcmpfltc(&v.u.cval->imag, 0) != 0)
-                       yyerror("constant %#F truncated to real", v.u.fval);
+                       yyerror("constant %#F%+#Fi truncated to real", &v.u.cval->real, &v.u.cval->imag);
                v.ctype = CTFLT;
                v.u.fval = f;
                break;
@@ -324,9 +322,9 @@ toint(Val v)
        case CTCPLX:
                i = mal(sizeof(*i));
                if(mpmovefltfix(i, &v.u.cval->real) < 0)
-                       yyerror("constant %#F truncated to integer", v.u.fval);
+                       yyerror("constant %#F%+#Fi truncated to integer", &v.u.cval->real, &v.u.cval->imag);
                if(mpcmpfltc(&v.u.cval->imag, 0) != 0)
-                       yyerror("constant %#F truncated to real", v.u.fval);
+                       yyerror("constant %#F%+#Fi truncated to real", &v.u.cval->real, &v.u.cval->imag);
                v.ctype = CTINT;
                v.u.xval = i;
                break;
index fa0103ea0cb870e64f9e697c21d0edce23d09d0c..6cd4e25000a4e8d79856fa658f049f7911c4c2fc 100644 (file)
@@ -475,6 +475,8 @@ Fconv(Fmt *fp)
                // for well in range, convert to double and use print's %g
                if(-900 < fvp->exp && fvp->exp < 900) {
                        d = mpgetflt(fvp);
+                       if(d >= 0 && (fp->flags & FmtSign))
+                               fmtprint(fp, "+");
                        return fmtprint(fp, "%g", d);
                }
                // TODO(rsc): for well out of range, print
index 6262c682d0bb375ec8b448520d13290cd77eed7f..fad96c60589c56f38cafb41b663635f9ad5d318c 100644 (file)
@@ -22,6 +22,7 @@ func main() {
        c64 = cmplx(f32, f32)
        c128 = cmplx(f64, f64)
 
+       _ = complex(0) // ok
        _ = cmplx(f, f32)       // ERROR "cmplx"
        _ = cmplx(f, f64)       // ERROR "cmplx"
        _ = cmplx(f32, f)       // ERROR "cmplx"