github.com/bgentry/go@v0.0.0-20150121062915-6cf5a733d54d/src/cmd/gc/const.c (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include <u.h> 6 #include <libc.h> 7 #include "go.h" 8 #define TUP(x,y) (((x)<<16)|(y)) 9 /*c2go int TUP(int, int); */ 10 11 static Val tocplx(Val); 12 static Val toflt(Val); 13 static Val tostr(Val); 14 static Val copyval(Val); 15 static void cmplxmpy(Mpcplx*, Mpcplx*); 16 static void cmplxdiv(Mpcplx*, Mpcplx*); 17 18 /* 19 * truncate float literal fv to 32-bit or 64-bit precision 20 * according to type; return truncated value. 21 */ 22 Mpflt* 23 truncfltlit(Mpflt *oldv, Type *t) 24 { 25 double d; 26 Mpflt *fv; 27 Val v; 28 29 if(t == T) 30 return oldv; 31 32 memset(&v, 0, sizeof v); 33 v.ctype = CTFLT; 34 v.u.fval = oldv; 35 overflow(v, t); 36 37 fv = mal(sizeof *fv); 38 *fv = *oldv; 39 40 // convert large precision literal floating 41 // into limited precision (float64 or float32) 42 switch(t->etype) { 43 case TFLOAT64: 44 d = mpgetflt(fv); 45 mpmovecflt(fv, d); 46 break; 47 48 case TFLOAT32: 49 d = mpgetflt32(fv); 50 mpmovecflt(fv, d); 51 52 break; 53 } 54 return fv; 55 } 56 57 /* 58 * convert n, if literal, to type t. 59 * implicit conversion. 60 */ 61 void 62 convlit(Node **np, Type *t) 63 { 64 convlit1(np, t, 0); 65 } 66 67 /* 68 * convert n, if literal, to type t. 69 * return a new node if necessary 70 * (if n is a named constant, can't edit n->type directly). 71 */ 72 void 73 convlit1(Node **np, Type *t, int explicit) 74 { 75 int ct, et; 76 Node *n, *nn; 77 78 n = *np; 79 if(n == N || t == T || n->type == T || isideal(t) || n->type == t) 80 return; 81 if(!explicit && !isideal(n->type)) 82 return; 83 84 if(n->op == OLITERAL) { 85 nn = nod(OXXX, N, N); 86 *nn = *n; 87 n = nn; 88 *np = n; 89 } 90 91 switch(n->op) { 92 default: 93 if(n->type == idealbool) { 94 if(t->etype == TBOOL) 95 n->type = t; 96 else 97 n->type = types[TBOOL]; 98 } 99 if(n->type->etype == TIDEAL) { 100 convlit(&n->left, t); 101 convlit(&n->right, t); 102 n->type = t; 103 } 104 return; 105 case OLITERAL: 106 // target is invalid type for a constant? leave alone. 107 if(!okforconst[t->etype] && n->type->etype != TNIL) { 108 defaultlit(&n, T); 109 *np = n; 110 return; 111 } 112 break; 113 case OLSH: 114 case ORSH: 115 convlit1(&n->left, t, explicit && isideal(n->left->type)); 116 t = n->left->type; 117 if(t != T && t->etype == TIDEAL && n->val.ctype != CTINT) 118 n->val = toint(n->val); 119 if(t != T && !isint[t->etype]) { 120 yyerror("invalid operation: %N (shift of type %T)", n, t); 121 t = T; 122 } 123 n->type = t; 124 return; 125 case OCOMPLEX: 126 if(n->type->etype == TIDEAL) { 127 switch(t->etype) { 128 default: 129 // If trying to convert to non-complex type, 130 // leave as complex128 and let typechecker complain. 131 t = types[TCOMPLEX128]; 132 //fallthrough 133 case TCOMPLEX128: 134 n->type = t; 135 convlit(&n->left, types[TFLOAT64]); 136 convlit(&n->right, types[TFLOAT64]); 137 break; 138 case TCOMPLEX64: 139 n->type = t; 140 convlit(&n->left, types[TFLOAT32]); 141 convlit(&n->right, types[TFLOAT32]); 142 break; 143 } 144 } 145 return; 146 } 147 148 // avoided repeated calculations, errors 149 if(eqtype(n->type, t)) 150 return; 151 152 ct = consttype(n); 153 if(ct < 0) 154 goto bad; 155 156 et = t->etype; 157 if(et == TINTER) { 158 if(ct == CTNIL && n->type == types[TNIL]) { 159 n->type = t; 160 return; 161 } 162 defaultlit(np, T); 163 return; 164 } 165 166 switch(ct) { 167 default: 168 goto bad; 169 170 case CTNIL: 171 switch(et) { 172 default: 173 n->type = T; 174 goto bad; 175 176 case TSTRING: 177 // let normal conversion code handle it 178 return; 179 180 case TARRAY: 181 if(!isslice(t)) 182 goto bad; 183 break; 184 185 case TPTR32: 186 case TPTR64: 187 case TINTER: 188 case TMAP: 189 case TCHAN: 190 case TFUNC: 191 case TUNSAFEPTR: 192 break; 193 194 case TUINTPTR: 195 // A nil literal may be converted to uintptr 196 // if it is an unsafe.Pointer 197 if(n->type->etype == TUNSAFEPTR) { 198 n->val.u.xval = mal(sizeof(*n->val.u.xval)); 199 mpmovecfix(n->val.u.xval, 0); 200 n->val.ctype = CTINT; 201 } else 202 goto bad; 203 } 204 break; 205 206 case CTSTR: 207 case CTBOOL: 208 if(et != n->type->etype) 209 goto bad; 210 break; 211 212 case CTINT: 213 case CTRUNE: 214 case CTFLT: 215 case CTCPLX: 216 ct = n->val.ctype; 217 if(isint[et]) { 218 switch(ct) { 219 default: 220 goto bad; 221 case CTCPLX: 222 case CTFLT: 223 case CTRUNE: 224 n->val = toint(n->val); 225 // flowthrough 226 case CTINT: 227 overflow(n->val, t); 228 break; 229 } 230 } else 231 if(isfloat[et]) { 232 switch(ct) { 233 default: 234 goto bad; 235 case CTCPLX: 236 case CTINT: 237 case CTRUNE: 238 n->val = toflt(n->val); 239 // flowthrough 240 case CTFLT: 241 n->val.u.fval = truncfltlit(n->val.u.fval, t); 242 break; 243 } 244 } else 245 if(iscomplex[et]) { 246 switch(ct) { 247 default: 248 goto bad; 249 case CTFLT: 250 case CTINT: 251 case CTRUNE: 252 n->val = tocplx(n->val); 253 break; 254 case CTCPLX: 255 overflow(n->val, t); 256 break; 257 } 258 } else 259 if(et == TSTRING && (ct == CTINT || ct == CTRUNE) && explicit) 260 n->val = tostr(n->val); 261 else 262 goto bad; 263 break; 264 } 265 n->type = t; 266 return; 267 268 bad: 269 if(!n->diag) { 270 if(!t->broke) 271 yyerror("cannot convert %N to type %T", n, t); 272 n->diag = 1; 273 } 274 if(isideal(n->type)) { 275 defaultlit(&n, T); 276 *np = n; 277 } 278 return; 279 } 280 281 static Val 282 copyval(Val v) 283 { 284 Mpint *i; 285 Mpflt *f; 286 Mpcplx *c; 287 288 switch(v.ctype) { 289 case CTINT: 290 case CTRUNE: 291 i = mal(sizeof(*i)); 292 mpmovefixfix(i, v.u.xval); 293 v.u.xval = i; 294 break; 295 case CTFLT: 296 f = mal(sizeof(*f)); 297 mpmovefltflt(f, v.u.fval); 298 v.u.fval = f; 299 break; 300 case CTCPLX: 301 c = mal(sizeof(*c)); 302 mpmovefltflt(&c->real, &v.u.cval->real); 303 mpmovefltflt(&c->imag, &v.u.cval->imag); 304 v.u.cval = c; 305 break; 306 } 307 return v; 308 } 309 310 static Val 311 tocplx(Val v) 312 { 313 Mpcplx *c; 314 315 switch(v.ctype) { 316 case CTINT: 317 case CTRUNE: 318 c = mal(sizeof(*c)); 319 mpmovefixflt(&c->real, v.u.xval); 320 mpmovecflt(&c->imag, 0.0); 321 v.ctype = CTCPLX; 322 v.u.cval = c; 323 break; 324 case CTFLT: 325 c = mal(sizeof(*c)); 326 mpmovefltflt(&c->real, v.u.fval); 327 mpmovecflt(&c->imag, 0.0); 328 v.ctype = CTCPLX; 329 v.u.cval = c; 330 break; 331 } 332 return v; 333 } 334 335 static Val 336 toflt(Val v) 337 { 338 Mpflt *f; 339 340 switch(v.ctype) { 341 case CTINT: 342 case CTRUNE: 343 f = mal(sizeof(*f)); 344 mpmovefixflt(f, v.u.xval); 345 v.ctype = CTFLT; 346 v.u.fval = f; 347 break; 348 case CTCPLX: 349 f = mal(sizeof(*f)); 350 mpmovefltflt(f, &v.u.cval->real); 351 if(mpcmpfltc(&v.u.cval->imag, 0) != 0) 352 yyerror("constant %#F%+#Fi truncated to real", &v.u.cval->real, &v.u.cval->imag); 353 v.ctype = CTFLT; 354 v.u.fval = f; 355 break; 356 } 357 return v; 358 } 359 360 Val 361 toint(Val v) 362 { 363 Mpint *i; 364 365 switch(v.ctype) { 366 case CTRUNE: 367 v.ctype = CTINT; 368 break; 369 case CTFLT: 370 i = mal(sizeof(*i)); 371 if(mpmovefltfix(i, v.u.fval) < 0) 372 yyerror("constant %#F truncated to integer", v.u.fval); 373 v.ctype = CTINT; 374 v.u.xval = i; 375 break; 376 case CTCPLX: 377 i = mal(sizeof(*i)); 378 if(mpmovefltfix(i, &v.u.cval->real) < 0) 379 yyerror("constant %#F%+#Fi truncated to integer", &v.u.cval->real, &v.u.cval->imag); 380 if(mpcmpfltc(&v.u.cval->imag, 0) != 0) 381 yyerror("constant %#F%+#Fi truncated to real", &v.u.cval->real, &v.u.cval->imag); 382 v.ctype = CTINT; 383 v.u.xval = i; 384 break; 385 } 386 return v; 387 } 388 389 int 390 doesoverflow(Val v, Type *t) 391 { 392 switch(v.ctype) { 393 case CTINT: 394 case CTRUNE: 395 if(!isint[t->etype]) 396 fatal("overflow: %T integer constant", t); 397 if(mpcmpfixfix(v.u.xval, minintval[t->etype]) < 0 || 398 mpcmpfixfix(v.u.xval, maxintval[t->etype]) > 0) 399 return 1; 400 break; 401 case CTFLT: 402 if(!isfloat[t->etype]) 403 fatal("overflow: %T floating-point constant", t); 404 if(mpcmpfltflt(v.u.fval, minfltval[t->etype]) <= 0 || 405 mpcmpfltflt(v.u.fval, maxfltval[t->etype]) >= 0) 406 return 1; 407 break; 408 case CTCPLX: 409 if(!iscomplex[t->etype]) 410 fatal("overflow: %T complex constant", t); 411 if(mpcmpfltflt(&v.u.cval->real, minfltval[t->etype]) <= 0 || 412 mpcmpfltflt(&v.u.cval->real, maxfltval[t->etype]) >= 0 || 413 mpcmpfltflt(&v.u.cval->imag, minfltval[t->etype]) <= 0 || 414 mpcmpfltflt(&v.u.cval->imag, maxfltval[t->etype]) >= 0) 415 return 1; 416 break; 417 } 418 return 0; 419 } 420 421 void 422 overflow(Val v, Type *t) 423 { 424 // v has already been converted 425 // to appropriate form for t. 426 if(t == T || t->etype == TIDEAL) 427 return; 428 429 if(!doesoverflow(v, t)) 430 return; 431 432 switch(v.ctype) { 433 case CTINT: 434 case CTRUNE: 435 yyerror("constant %B overflows %T", v.u.xval, t); 436 break; 437 case CTFLT: 438 yyerror("constant %#F overflows %T", v.u.fval, t); 439 break; 440 case CTCPLX: 441 yyerror("constant %#F overflows %T", v.u.fval, t); 442 break; 443 } 444 } 445 446 static Val 447 tostr(Val v) 448 { 449 Rune rune; 450 int l; 451 Strlit *s; 452 453 switch(v.ctype) { 454 case CTINT: 455 case CTRUNE: 456 if(mpcmpfixfix(v.u.xval, minintval[TINT]) < 0 || 457 mpcmpfixfix(v.u.xval, maxintval[TINT]) > 0) 458 yyerror("overflow in int -> string"); 459 rune = mpgetfix(v.u.xval); 460 l = runelen(rune); 461 s = mal(sizeof(*s)+l); 462 s->len = l; 463 runetochar((char*)s->s, &rune); 464 memset(&v, 0, sizeof v); 465 v.ctype = CTSTR; 466 v.u.sval = s; 467 break; 468 469 case CTFLT: 470 yyerror("no float -> string"); 471 472 case CTNIL: 473 memset(&v, 0, sizeof v); 474 v.ctype = CTSTR; 475 v.u.sval = mal(sizeof *s); 476 break; 477 } 478 return v; 479 } 480 481 int 482 consttype(Node *n) 483 { 484 if(n == N || n->op != OLITERAL) 485 return -1; 486 return n->val.ctype; 487 } 488 489 int 490 isconst(Node *n, int ct) 491 { 492 int t; 493 494 t = consttype(n); 495 // If the caller is asking for CTINT, allow CTRUNE too. 496 // Makes life easier for back ends. 497 return t == ct || (ct == CTINT && t == CTRUNE); 498 } 499 500 static Node* 501 saveorig(Node *n) 502 { 503 Node *n1; 504 505 if(n == n->orig) { 506 // duplicate node for n->orig. 507 n1 = nod(OLITERAL, N, N); 508 n->orig = n1; 509 *n1 = *n; 510 } 511 return n->orig; 512 } 513 514 /* 515 * if n is constant, rewrite as OLITERAL node. 516 */ 517 void 518 evconst(Node *n) 519 { 520 Node *nl, *nr, *norig; 521 int32 len; 522 Strlit *str; 523 int wl, wr, lno, et; 524 Val v, rv; 525 Mpint b; 526 NodeList *l1, *l2; 527 528 // pick off just the opcodes that can be 529 // constant evaluated. 530 switch(n->op) { 531 default: 532 return; 533 case OADD: 534 case OAND: 535 case OANDAND: 536 case OANDNOT: 537 case OARRAYBYTESTR: 538 case OCOM: 539 case ODIV: 540 case OEQ: 541 case OGE: 542 case OGT: 543 case OLE: 544 case OLSH: 545 case OLT: 546 case OMINUS: 547 case OMOD: 548 case OMUL: 549 case ONE: 550 case ONOT: 551 case OOR: 552 case OOROR: 553 case OPLUS: 554 case ORSH: 555 case OSUB: 556 case OXOR: 557 break; 558 case OCONV: 559 if(n->type == T) 560 return; 561 if(!okforconst[n->type->etype] && n->type->etype != TNIL) 562 return; 563 break; 564 565 case OADDSTR: 566 // merge adjacent constants in the argument list. 567 for(l1=n->list; l1 != nil; l1= l1->next) { 568 if(isconst(l1->n, CTSTR) && l1->next != nil && isconst(l1->next->n, CTSTR)) { 569 l2 = l1; 570 len = 0; 571 while(l2 != nil && isconst(l2->n, CTSTR)) { 572 nr = l2->n; 573 len += nr->val.u.sval->len; 574 l2 = l2->next; 575 } 576 // merge from l1 up to but not including l2 577 str = mal(sizeof(*str) + len); 578 str->len = len; 579 len = 0; 580 l2 = l1; 581 while(l2 != nil && isconst(l2->n, CTSTR)) { 582 nr = l2->n; 583 memmove(str->s+len, nr->val.u.sval->s, nr->val.u.sval->len); 584 len += nr->val.u.sval->len; 585 l2 = l2->next; 586 } 587 nl = nod(OXXX, N, N); 588 *nl = *l1->n; 589 nl->orig = nl; 590 nl->val.ctype = CTSTR; 591 nl->val.u.sval = str; 592 l1->n = nl; 593 l1->next = l2; 594 } 595 } 596 // fix list end pointer. 597 for(l2=n->list; l2 != nil; l2=l2->next) 598 n->list->end = l2; 599 // collapse single-constant list to single constant. 600 if(count(n->list) == 1 && isconst(n->list->n, CTSTR)) { 601 n->op = OLITERAL; 602 n->val = n->list->n->val; 603 } 604 return; 605 } 606 607 nl = n->left; 608 if(nl == N || nl->type == T) 609 return; 610 if(consttype(nl) < 0) 611 return; 612 wl = nl->type->etype; 613 if(isint[wl] || isfloat[wl] || iscomplex[wl]) 614 wl = TIDEAL; 615 616 nr = n->right; 617 if(nr == N) 618 goto unary; 619 if(nr->type == T) 620 return; 621 if(consttype(nr) < 0) 622 return; 623 wr = nr->type->etype; 624 if(isint[wr] || isfloat[wr] || iscomplex[wr]) 625 wr = TIDEAL; 626 627 // check for compatible general types (numeric, string, etc) 628 if(wl != wr) 629 goto illegal; 630 631 // check for compatible types. 632 switch(n->op) { 633 default: 634 // ideal const mixes with anything but otherwise must match. 635 if(nl->type->etype != TIDEAL) { 636 defaultlit(&nr, nl->type); 637 n->right = nr; 638 } 639 if(nr->type->etype != TIDEAL) { 640 defaultlit(&nl, nr->type); 641 n->left = nl; 642 } 643 if(nl->type->etype != nr->type->etype) 644 goto illegal; 645 break; 646 647 case OLSH: 648 case ORSH: 649 // right must be unsigned. 650 // left can be ideal. 651 defaultlit(&nr, types[TUINT]); 652 n->right = nr; 653 if(nr->type && (issigned[nr->type->etype] || !isint[nr->type->etype])) 654 goto illegal; 655 if(nl->val.ctype != CTRUNE) 656 nl->val = toint(nl->val); 657 nr->val = toint(nr->val); 658 break; 659 } 660 661 // copy numeric value to avoid modifying 662 // n->left, in case someone still refers to it (e.g. iota). 663 v = nl->val; 664 if(wl == TIDEAL) 665 v = copyval(v); 666 667 rv = nr->val; 668 669 // convert to common ideal 670 if(v.ctype == CTCPLX || rv.ctype == CTCPLX) { 671 v = tocplx(v); 672 rv = tocplx(rv); 673 } 674 if(v.ctype == CTFLT || rv.ctype == CTFLT) { 675 v = toflt(v); 676 rv = toflt(rv); 677 } 678 679 // Rune and int turns into rune. 680 if(v.ctype == CTRUNE && rv.ctype == CTINT) 681 rv.ctype = CTRUNE; 682 if(v.ctype == CTINT && rv.ctype == CTRUNE) { 683 if(n->op == OLSH || n->op == ORSH) 684 rv.ctype = CTINT; 685 else 686 v.ctype = CTRUNE; 687 } 688 689 if(v.ctype != rv.ctype) { 690 // Use of undefined name as constant? 691 if((v.ctype == 0 || rv.ctype == 0) && nerrors > 0) 692 return; 693 fatal("constant type mismatch %T(%d) %T(%d)", nl->type, v.ctype, nr->type, rv.ctype); 694 } 695 696 // run op 697 switch(TUP(n->op, v.ctype)) { 698 default: 699 illegal: 700 if(!n->diag) { 701 yyerror("illegal constant expression: %T %O %T", 702 nl->type, n->op, nr->type); 703 n->diag = 1; 704 } 705 return; 706 707 case TUP(OADD, CTINT): 708 case TUP(OADD, CTRUNE): 709 mpaddfixfix(v.u.xval, rv.u.xval, 0); 710 break; 711 case TUP(OSUB, CTINT): 712 case TUP(OSUB, CTRUNE): 713 mpsubfixfix(v.u.xval, rv.u.xval); 714 break; 715 case TUP(OMUL, CTINT): 716 case TUP(OMUL, CTRUNE): 717 mpmulfixfix(v.u.xval, rv.u.xval); 718 break; 719 case TUP(ODIV, CTINT): 720 case TUP(ODIV, CTRUNE): 721 if(mpcmpfixc(rv.u.xval, 0) == 0) { 722 yyerror("division by zero"); 723 mpmovecfix(v.u.xval, 1); 724 break; 725 } 726 mpdivfixfix(v.u.xval, rv.u.xval); 727 break; 728 case TUP(OMOD, CTINT): 729 case TUP(OMOD, CTRUNE): 730 if(mpcmpfixc(rv.u.xval, 0) == 0) { 731 yyerror("division by zero"); 732 mpmovecfix(v.u.xval, 1); 733 break; 734 } 735 mpmodfixfix(v.u.xval, rv.u.xval); 736 break; 737 738 case TUP(OLSH, CTINT): 739 case TUP(OLSH, CTRUNE): 740 mplshfixfix(v.u.xval, rv.u.xval); 741 break; 742 case TUP(ORSH, CTINT): 743 case TUP(ORSH, CTRUNE): 744 mprshfixfix(v.u.xval, rv.u.xval); 745 break; 746 case TUP(OOR, CTINT): 747 case TUP(OOR, CTRUNE): 748 mporfixfix(v.u.xval, rv.u.xval); 749 break; 750 case TUP(OAND, CTINT): 751 case TUP(OAND, CTRUNE): 752 mpandfixfix(v.u.xval, rv.u.xval); 753 break; 754 case TUP(OANDNOT, CTINT): 755 case TUP(OANDNOT, CTRUNE): 756 mpandnotfixfix(v.u.xval, rv.u.xval); 757 break; 758 case TUP(OXOR, CTINT): 759 case TUP(OXOR, CTRUNE): 760 mpxorfixfix(v.u.xval, rv.u.xval); 761 break; 762 763 case TUP(OADD, CTFLT): 764 mpaddfltflt(v.u.fval, rv.u.fval); 765 break; 766 case TUP(OSUB, CTFLT): 767 mpsubfltflt(v.u.fval, rv.u.fval); 768 break; 769 case TUP(OMUL, CTFLT): 770 mpmulfltflt(v.u.fval, rv.u.fval); 771 break; 772 case TUP(ODIV, CTFLT): 773 if(mpcmpfltc(rv.u.fval, 0) == 0) { 774 yyerror("division by zero"); 775 mpmovecflt(v.u.fval, 1.0); 776 break; 777 } 778 mpdivfltflt(v.u.fval, rv.u.fval); 779 break; 780 case TUP(OMOD, CTFLT): 781 // The default case above would print 'ideal % ideal', 782 // which is not quite an ideal error. 783 if(!n->diag) { 784 yyerror("illegal constant expression: floating-point %% operation"); 785 n->diag = 1; 786 } 787 return; 788 789 case TUP(OADD, CTCPLX): 790 mpaddfltflt(&v.u.cval->real, &rv.u.cval->real); 791 mpaddfltflt(&v.u.cval->imag, &rv.u.cval->imag); 792 break; 793 case TUP(OSUB, CTCPLX): 794 mpsubfltflt(&v.u.cval->real, &rv.u.cval->real); 795 mpsubfltflt(&v.u.cval->imag, &rv.u.cval->imag); 796 break; 797 case TUP(OMUL, CTCPLX): 798 cmplxmpy(v.u.cval, rv.u.cval); 799 break; 800 case TUP(ODIV, CTCPLX): 801 if(mpcmpfltc(&rv.u.cval->real, 0) == 0 && 802 mpcmpfltc(&rv.u.cval->imag, 0) == 0) { 803 yyerror("complex division by zero"); 804 mpmovecflt(&rv.u.cval->real, 1.0); 805 mpmovecflt(&rv.u.cval->imag, 0.0); 806 break; 807 } 808 cmplxdiv(v.u.cval, rv.u.cval); 809 break; 810 811 case TUP(OEQ, CTNIL): 812 goto settrue; 813 case TUP(ONE, CTNIL): 814 goto setfalse; 815 816 case TUP(OEQ, CTINT): 817 case TUP(OEQ, CTRUNE): 818 if(mpcmpfixfix(v.u.xval, rv.u.xval) == 0) 819 goto settrue; 820 goto setfalse; 821 case TUP(ONE, CTINT): 822 case TUP(ONE, CTRUNE): 823 if(mpcmpfixfix(v.u.xval, rv.u.xval) != 0) 824 goto settrue; 825 goto setfalse; 826 case TUP(OLT, CTINT): 827 case TUP(OLT, CTRUNE): 828 if(mpcmpfixfix(v.u.xval, rv.u.xval) < 0) 829 goto settrue; 830 goto setfalse; 831 case TUP(OLE, CTINT): 832 case TUP(OLE, CTRUNE): 833 if(mpcmpfixfix(v.u.xval, rv.u.xval) <= 0) 834 goto settrue; 835 goto setfalse; 836 case TUP(OGE, CTINT): 837 case TUP(OGE, CTRUNE): 838 if(mpcmpfixfix(v.u.xval, rv.u.xval) >= 0) 839 goto settrue; 840 goto setfalse; 841 case TUP(OGT, CTINT): 842 case TUP(OGT, CTRUNE): 843 if(mpcmpfixfix(v.u.xval, rv.u.xval) > 0) 844 goto settrue; 845 goto setfalse; 846 847 case TUP(OEQ, CTFLT): 848 if(mpcmpfltflt(v.u.fval, rv.u.fval) == 0) 849 goto settrue; 850 goto setfalse; 851 case TUP(ONE, CTFLT): 852 if(mpcmpfltflt(v.u.fval, rv.u.fval) != 0) 853 goto settrue; 854 goto setfalse; 855 case TUP(OLT, CTFLT): 856 if(mpcmpfltflt(v.u.fval, rv.u.fval) < 0) 857 goto settrue; 858 goto setfalse; 859 case TUP(OLE, CTFLT): 860 if(mpcmpfltflt(v.u.fval, rv.u.fval) <= 0) 861 goto settrue; 862 goto setfalse; 863 case TUP(OGE, CTFLT): 864 if(mpcmpfltflt(v.u.fval, rv.u.fval) >= 0) 865 goto settrue; 866 goto setfalse; 867 case TUP(OGT, CTFLT): 868 if(mpcmpfltflt(v.u.fval, rv.u.fval) > 0) 869 goto settrue; 870 goto setfalse; 871 872 case TUP(OEQ, CTCPLX): 873 if(mpcmpfltflt(&v.u.cval->real, &rv.u.cval->real) == 0 && 874 mpcmpfltflt(&v.u.cval->imag, &rv.u.cval->imag) == 0) 875 goto settrue; 876 goto setfalse; 877 case TUP(ONE, CTCPLX): 878 if(mpcmpfltflt(&v.u.cval->real, &rv.u.cval->real) != 0 || 879 mpcmpfltflt(&v.u.cval->imag, &rv.u.cval->imag) != 0) 880 goto settrue; 881 goto setfalse; 882 883 case TUP(OEQ, CTSTR): 884 if(cmpslit(nl, nr) == 0) 885 goto settrue; 886 goto setfalse; 887 case TUP(ONE, CTSTR): 888 if(cmpslit(nl, nr) != 0) 889 goto settrue; 890 goto setfalse; 891 case TUP(OLT, CTSTR): 892 if(cmpslit(nl, nr) < 0) 893 goto settrue; 894 goto setfalse; 895 case TUP(OLE, CTSTR): 896 if(cmpslit(nl, nr) <= 0) 897 goto settrue; 898 goto setfalse; 899 case TUP(OGE, CTSTR): 900 if(cmpslit(nl, nr) >= 0l) 901 goto settrue; 902 goto setfalse; 903 case TUP(OGT, CTSTR): 904 if(cmpslit(nl, nr) > 0) 905 goto settrue; 906 goto setfalse; 907 908 case TUP(OOROR, CTBOOL): 909 if(v.u.bval || rv.u.bval) 910 goto settrue; 911 goto setfalse; 912 case TUP(OANDAND, CTBOOL): 913 if(v.u.bval && rv.u.bval) 914 goto settrue; 915 goto setfalse; 916 case TUP(OEQ, CTBOOL): 917 if(v.u.bval == rv.u.bval) 918 goto settrue; 919 goto setfalse; 920 case TUP(ONE, CTBOOL): 921 if(v.u.bval != rv.u.bval) 922 goto settrue; 923 goto setfalse; 924 } 925 goto ret; 926 927 unary: 928 // copy numeric value to avoid modifying 929 // nl, in case someone still refers to it (e.g. iota). 930 v = nl->val; 931 if(wl == TIDEAL) 932 v = copyval(v); 933 934 switch(TUP(n->op, v.ctype)) { 935 default: 936 if(!n->diag) { 937 yyerror("illegal constant expression %O %T", n->op, nl->type); 938 n->diag = 1; 939 } 940 return; 941 942 case TUP(OCONV, CTNIL): 943 case TUP(OARRAYBYTESTR, CTNIL): 944 if(n->type->etype == TSTRING) { 945 v = tostr(v); 946 nl->type = n->type; 947 break; 948 } 949 // fall through 950 case TUP(OCONV, CTINT): 951 case TUP(OCONV, CTRUNE): 952 case TUP(OCONV, CTFLT): 953 case TUP(OCONV, CTSTR): 954 convlit1(&nl, n->type, 1); 955 v = nl->val; 956 break; 957 958 case TUP(OPLUS, CTINT): 959 case TUP(OPLUS, CTRUNE): 960 break; 961 case TUP(OMINUS, CTINT): 962 case TUP(OMINUS, CTRUNE): 963 mpnegfix(v.u.xval); 964 break; 965 case TUP(OCOM, CTINT): 966 case TUP(OCOM, CTRUNE): 967 et = Txxx; 968 if(nl->type != T) 969 et = nl->type->etype; 970 971 // calculate the mask in b 972 // result will be (a ^ mask) 973 switch(et) { 974 default: 975 // signed guys change sign 976 mpmovecfix(&b, -1); 977 break; 978 979 case TUINT8: 980 case TUINT16: 981 case TUINT32: 982 case TUINT64: 983 case TUINT: 984 case TUINTPTR: 985 // unsigned guys invert their bits 986 mpmovefixfix(&b, maxintval[et]); 987 break; 988 } 989 mpxorfixfix(v.u.xval, &b); 990 break; 991 992 case TUP(OPLUS, CTFLT): 993 break; 994 case TUP(OMINUS, CTFLT): 995 mpnegflt(v.u.fval); 996 break; 997 998 case TUP(OPLUS, CTCPLX): 999 break; 1000 case TUP(OMINUS, CTCPLX): 1001 mpnegflt(&v.u.cval->real); 1002 mpnegflt(&v.u.cval->imag); 1003 break; 1004 1005 case TUP(ONOT, CTBOOL): 1006 if(!v.u.bval) 1007 goto settrue; 1008 goto setfalse; 1009 } 1010 1011 ret: 1012 norig = saveorig(n); 1013 *n = *nl; 1014 // restore value of n->orig. 1015 n->orig = norig; 1016 n->val = v; 1017 1018 // check range. 1019 lno = setlineno(n); 1020 overflow(v, n->type); 1021 lineno = lno; 1022 1023 // truncate precision for non-ideal float. 1024 if(v.ctype == CTFLT && n->type->etype != TIDEAL) 1025 n->val.u.fval = truncfltlit(v.u.fval, n->type); 1026 return; 1027 1028 settrue: 1029 norig = saveorig(n); 1030 *n = *nodbool(1); 1031 n->orig = norig; 1032 return; 1033 1034 setfalse: 1035 norig = saveorig(n); 1036 *n = *nodbool(0); 1037 n->orig = norig; 1038 return; 1039 } 1040 1041 Node* 1042 nodlit(Val v) 1043 { 1044 Node *n; 1045 1046 n = nod(OLITERAL, N, N); 1047 n->val = v; 1048 switch(v.ctype) { 1049 default: 1050 fatal("nodlit ctype %d", v.ctype); 1051 case CTSTR: 1052 n->type = idealstring; 1053 break; 1054 case CTBOOL: 1055 n->type = idealbool; 1056 break; 1057 case CTINT: 1058 case CTRUNE: 1059 case CTFLT: 1060 case CTCPLX: 1061 n->type = types[TIDEAL]; 1062 break; 1063 case CTNIL: 1064 n->type = types[TNIL]; 1065 break; 1066 } 1067 return n; 1068 } 1069 1070 Node* 1071 nodcplxlit(Val r, Val i) 1072 { 1073 Node *n; 1074 Mpcplx *c; 1075 1076 r = toflt(r); 1077 i = toflt(i); 1078 1079 c = mal(sizeof(*c)); 1080 n = nod(OLITERAL, N, N); 1081 n->type = types[TIDEAL]; 1082 n->val.u.cval = c; 1083 n->val.ctype = CTCPLX; 1084 1085 if(r.ctype != CTFLT || i.ctype != CTFLT) 1086 fatal("nodcplxlit ctype %d/%d", r.ctype, i.ctype); 1087 1088 mpmovefltflt(&c->real, r.u.fval); 1089 mpmovefltflt(&c->imag, i.u.fval); 1090 return n; 1091 } 1092 1093 // idealkind returns a constant kind like consttype 1094 // but for an arbitrary "ideal" (untyped constant) expression. 1095 static int 1096 idealkind(Node *n) 1097 { 1098 int k1, k2; 1099 1100 if(n == N || !isideal(n->type)) 1101 return CTxxx; 1102 1103 switch(n->op) { 1104 default: 1105 return CTxxx; 1106 case OLITERAL: 1107 return n->val.ctype; 1108 case OADD: 1109 case OAND: 1110 case OANDNOT: 1111 case OCOM: 1112 case ODIV: 1113 case OMINUS: 1114 case OMOD: 1115 case OMUL: 1116 case OSUB: 1117 case OXOR: 1118 case OOR: 1119 case OPLUS: 1120 // numeric kinds. 1121 k1 = idealkind(n->left); 1122 k2 = idealkind(n->right); 1123 if(k1 > k2) 1124 return k1; 1125 else 1126 return k2; 1127 case OREAL: 1128 case OIMAG: 1129 return CTFLT; 1130 case OCOMPLEX: 1131 return CTCPLX; 1132 case OADDSTR: 1133 return CTSTR; 1134 case OANDAND: 1135 case OEQ: 1136 case OGE: 1137 case OGT: 1138 case OLE: 1139 case OLT: 1140 case ONE: 1141 case ONOT: 1142 case OOROR: 1143 case OCMPSTR: 1144 case OCMPIFACE: 1145 return CTBOOL; 1146 case OLSH: 1147 case ORSH: 1148 // shifts (beware!). 1149 return idealkind(n->left); 1150 } 1151 } 1152 1153 void 1154 defaultlit(Node **np, Type *t) 1155 { 1156 int lno; 1157 int ctype; 1158 Node *n, *nn; 1159 Type *t1; 1160 1161 n = *np; 1162 if(n == N || !isideal(n->type)) 1163 return; 1164 1165 if(n->op == OLITERAL) { 1166 nn = nod(OXXX, N, N); 1167 *nn = *n; 1168 n = nn; 1169 *np = n; 1170 } 1171 1172 lno = setlineno(n); 1173 ctype = idealkind(n); 1174 switch(ctype) { 1175 default: 1176 if(t != T) { 1177 convlit(np, t); 1178 return; 1179 } 1180 if(n->val.ctype == CTNIL) { 1181 lineno = lno; 1182 if(!n->diag) { 1183 yyerror("use of untyped nil"); 1184 n->diag = 1; 1185 } 1186 n->type = T; 1187 break; 1188 } 1189 if(n->val.ctype == CTSTR) { 1190 t1 = types[TSTRING]; 1191 convlit(np, t1); 1192 break; 1193 } 1194 yyerror("defaultlit: unknown literal: %N", n); 1195 break; 1196 case CTxxx: 1197 fatal("defaultlit: idealkind is CTxxx: %+N", n); 1198 break; 1199 case CTBOOL: 1200 t1 = types[TBOOL]; 1201 if(t != T && t->etype == TBOOL) 1202 t1 = t; 1203 convlit(np, t1); 1204 break; 1205 case CTINT: 1206 t1 = types[TINT]; 1207 goto num; 1208 case CTRUNE: 1209 t1 = runetype; 1210 goto num; 1211 case CTFLT: 1212 t1 = types[TFLOAT64]; 1213 goto num; 1214 case CTCPLX: 1215 t1 = types[TCOMPLEX128]; 1216 goto num; 1217 num: 1218 if(t != T) { 1219 if(isint[t->etype]) { 1220 t1 = t; 1221 n->val = toint(n->val); 1222 } 1223 else 1224 if(isfloat[t->etype]) { 1225 t1 = t; 1226 n->val = toflt(n->val); 1227 } 1228 else 1229 if(iscomplex[t->etype]) { 1230 t1 = t; 1231 n->val = tocplx(n->val); 1232 } 1233 } 1234 overflow(n->val, t1); 1235 convlit(np, t1); 1236 break; 1237 } 1238 lineno = lno; 1239 } 1240 1241 /* 1242 * defaultlit on both nodes simultaneously; 1243 * if they're both ideal going in they better 1244 * get the same type going out. 1245 * force means must assign concrete (non-ideal) type. 1246 */ 1247 void 1248 defaultlit2(Node **lp, Node **rp, int force) 1249 { 1250 Node *l, *r; 1251 int lkind, rkind; 1252 1253 l = *lp; 1254 r = *rp; 1255 if(l->type == T || r->type == T) 1256 return; 1257 if(!isideal(l->type)) { 1258 convlit(rp, l->type); 1259 return; 1260 } 1261 if(!isideal(r->type)) { 1262 convlit(lp, r->type); 1263 return; 1264 } 1265 if(!force) 1266 return; 1267 if(l->type->etype == TBOOL) { 1268 convlit(lp, types[TBOOL]); 1269 convlit(rp, types[TBOOL]); 1270 } 1271 lkind = idealkind(l); 1272 rkind = idealkind(r); 1273 if(lkind == CTCPLX || rkind == CTCPLX) { 1274 convlit(lp, types[TCOMPLEX128]); 1275 convlit(rp, types[TCOMPLEX128]); 1276 return; 1277 } 1278 if(lkind == CTFLT || rkind == CTFLT) { 1279 convlit(lp, types[TFLOAT64]); 1280 convlit(rp, types[TFLOAT64]); 1281 return; 1282 } 1283 1284 if(lkind == CTRUNE || rkind == CTRUNE) { 1285 convlit(lp, runetype); 1286 convlit(rp, runetype); 1287 return; 1288 } 1289 1290 convlit(lp, types[TINT]); 1291 convlit(rp, types[TINT]); 1292 } 1293 1294 int 1295 cmpslit(Node *l, Node *r) 1296 { 1297 int32 l1, l2, i, m; 1298 uchar *s1, *s2; 1299 1300 l1 = l->val.u.sval->len; 1301 l2 = r->val.u.sval->len; 1302 s1 = (uchar*)l->val.u.sval->s; 1303 s2 = (uchar*)r->val.u.sval->s; 1304 1305 m = l1; 1306 if(l2 < m) 1307 m = l2; 1308 1309 for(i=0; i<m; i++) { 1310 if(s1[i] == s2[i]) 1311 continue; 1312 if(s1[i] > s2[i]) 1313 return +1; 1314 return -1; 1315 } 1316 if(l1 == l2) 1317 return 0; 1318 if(l1 > l2) 1319 return +1; 1320 return -1; 1321 } 1322 1323 int 1324 smallintconst(Node *n) 1325 { 1326 if(n->op == OLITERAL && isconst(n, CTINT) && n->type != T) 1327 switch(simtype[n->type->etype]) { 1328 case TINT8: 1329 case TUINT8: 1330 case TINT16: 1331 case TUINT16: 1332 case TINT32: 1333 case TUINT32: 1334 case TBOOL: 1335 case TPTR32: 1336 return 1; 1337 case TIDEAL: 1338 case TINT64: 1339 case TUINT64: 1340 case TPTR64: 1341 if(mpcmpfixfix(n->val.u.xval, minintval[TINT32]) < 0 1342 || mpcmpfixfix(n->val.u.xval, maxintval[TINT32]) > 0) 1343 break; 1344 return 1; 1345 } 1346 return 0; 1347 } 1348 1349 long 1350 nonnegconst(Node *n) 1351 { 1352 if(n->op == OLITERAL && n->type != T) 1353 switch(simtype[n->type->etype]) { 1354 case TINT8: 1355 case TUINT8: 1356 case TINT16: 1357 case TUINT16: 1358 case TINT32: 1359 case TUINT32: 1360 case TINT64: 1361 case TUINT64: 1362 case TIDEAL: 1363 // check negative and 2^31 1364 if(mpcmpfixfix(n->val.u.xval, minintval[TUINT32]) < 0 1365 || mpcmpfixfix(n->val.u.xval, maxintval[TINT32]) > 0) 1366 break; 1367 return mpgetfix(n->val.u.xval); 1368 } 1369 return -1; 1370 } 1371 1372 /* 1373 * convert x to type et and back to int64 1374 * for sign extension and truncation. 1375 */ 1376 static int64 1377 iconv(int64 x, int et) 1378 { 1379 switch(et) { 1380 case TINT8: 1381 x = (int8)x; 1382 break; 1383 case TUINT8: 1384 x = (uint8)x; 1385 break; 1386 case TINT16: 1387 x = (int16)x; 1388 break; 1389 case TUINT16: 1390 x = (uint64)x; 1391 break; 1392 case TINT32: 1393 x = (int32)x; 1394 break; 1395 case TUINT32: 1396 x = (uint32)x; 1397 break; 1398 case TINT64: 1399 case TUINT64: 1400 break; 1401 } 1402 return x; 1403 } 1404 1405 /* 1406 * convert constant val to type t; leave in con. 1407 * for back end. 1408 */ 1409 void 1410 convconst(Node *con, Type *t, Val *val) 1411 { 1412 int64 i; 1413 int tt; 1414 1415 tt = simsimtype(t); 1416 1417 // copy the constant for conversion 1418 nodconst(con, types[TINT8], 0); 1419 con->type = t; 1420 con->val = *val; 1421 1422 if(isint[tt]) { 1423 con->val.ctype = CTINT; 1424 con->val.u.xval = mal(sizeof *con->val.u.xval); 1425 switch(val->ctype) { 1426 default: 1427 fatal("convconst ctype=%d %lT", val->ctype, t); 1428 case CTINT: 1429 case CTRUNE: 1430 i = mpgetfix(val->u.xval); 1431 break; 1432 case CTBOOL: 1433 i = val->u.bval; 1434 break; 1435 case CTNIL: 1436 i = 0; 1437 break; 1438 } 1439 i = iconv(i, tt); 1440 mpmovecfix(con->val.u.xval, i); 1441 return; 1442 } 1443 1444 if(isfloat[tt]) { 1445 con->val = toflt(con->val); 1446 if(con->val.ctype != CTFLT) 1447 fatal("convconst ctype=%d %T", con->val.ctype, t); 1448 if(tt == TFLOAT32) 1449 con->val.u.fval = truncfltlit(con->val.u.fval, t); 1450 return; 1451 } 1452 1453 if(iscomplex[tt]) { 1454 con->val = tocplx(con->val); 1455 if(tt == TCOMPLEX64) { 1456 con->val.u.cval->real = *truncfltlit(&con->val.u.cval->real, types[TFLOAT32]); 1457 con->val.u.cval->imag = *truncfltlit(&con->val.u.cval->imag, types[TFLOAT32]); 1458 } 1459 return; 1460 } 1461 1462 fatal("convconst %lT constant", t); 1463 1464 } 1465 1466 // complex multiply v *= rv 1467 // (a, b) * (c, d) = (a*c - b*d, b*c + a*d) 1468 static void 1469 cmplxmpy(Mpcplx *v, Mpcplx *rv) 1470 { 1471 Mpflt ac, bd, bc, ad; 1472 1473 mpmovefltflt(&ac, &v->real); 1474 mpmulfltflt(&ac, &rv->real); // ac 1475 1476 mpmovefltflt(&bd, &v->imag); 1477 mpmulfltflt(&bd, &rv->imag); // bd 1478 1479 mpmovefltflt(&bc, &v->imag); 1480 mpmulfltflt(&bc, &rv->real); // bc 1481 1482 mpmovefltflt(&ad, &v->real); 1483 mpmulfltflt(&ad, &rv->imag); // ad 1484 1485 mpmovefltflt(&v->real, &ac); 1486 mpsubfltflt(&v->real, &bd); // ac-bd 1487 1488 mpmovefltflt(&v->imag, &bc); 1489 mpaddfltflt(&v->imag, &ad); // bc+ad 1490 } 1491 1492 // complex divide v /= rv 1493 // (a, b) / (c, d) = ((a*c + b*d), (b*c - a*d))/(c*c + d*d) 1494 static void 1495 cmplxdiv(Mpcplx *v, Mpcplx *rv) 1496 { 1497 Mpflt ac, bd, bc, ad, cc_plus_dd; 1498 1499 mpmovefltflt(&cc_plus_dd, &rv->real); 1500 mpmulfltflt(&cc_plus_dd, &rv->real); // cc 1501 1502 mpmovefltflt(&ac, &rv->imag); 1503 mpmulfltflt(&ac, &rv->imag); // dd 1504 1505 mpaddfltflt(&cc_plus_dd, &ac); // cc+dd 1506 1507 mpmovefltflt(&ac, &v->real); 1508 mpmulfltflt(&ac, &rv->real); // ac 1509 1510 mpmovefltflt(&bd, &v->imag); 1511 mpmulfltflt(&bd, &rv->imag); // bd 1512 1513 mpmovefltflt(&bc, &v->imag); 1514 mpmulfltflt(&bc, &rv->real); // bc 1515 1516 mpmovefltflt(&ad, &v->real); 1517 mpmulfltflt(&ad, &rv->imag); // ad 1518 1519 mpmovefltflt(&v->real, &ac); 1520 mpaddfltflt(&v->real, &bd); // ac+bd 1521 mpdivfltflt(&v->real, &cc_plus_dd); // (ac+bd)/(cc+dd) 1522 1523 mpmovefltflt(&v->imag, &bc); 1524 mpsubfltflt(&v->imag, &ad); // bc-ad 1525 mpdivfltflt(&v->imag, &cc_plus_dd); // (bc+ad)/(cc+dd) 1526 } 1527 1528 static int hascallchan(Node*); 1529 1530 // Is n a Go language constant (as opposed to a compile-time constant)? 1531 // Expressions derived from nil, like string([]byte(nil)), while they 1532 // may be known at compile time, are not Go language constants. 1533 // Only called for expressions known to evaluated to compile-time 1534 // constants. 1535 int 1536 isgoconst(Node *n) 1537 { 1538 Node *l; 1539 Type *t; 1540 1541 if(n->orig != N) 1542 n = n->orig; 1543 1544 switch(n->op) { 1545 case OADD: 1546 case OADDSTR: 1547 case OAND: 1548 case OANDAND: 1549 case OANDNOT: 1550 case OCOM: 1551 case ODIV: 1552 case OEQ: 1553 case OGE: 1554 case OGT: 1555 case OLE: 1556 case OLSH: 1557 case OLT: 1558 case OMINUS: 1559 case OMOD: 1560 case OMUL: 1561 case ONE: 1562 case ONOT: 1563 case OOR: 1564 case OOROR: 1565 case OPLUS: 1566 case ORSH: 1567 case OSUB: 1568 case OXOR: 1569 case OIOTA: 1570 case OCOMPLEX: 1571 case OREAL: 1572 case OIMAG: 1573 if(isgoconst(n->left) && (n->right == N || isgoconst(n->right))) 1574 return 1; 1575 break; 1576 1577 case OCONV: 1578 if(okforconst[n->type->etype] && isgoconst(n->left)) 1579 return 1; 1580 break; 1581 1582 case OLEN: 1583 case OCAP: 1584 l = n->left; 1585 if(isgoconst(l)) 1586 return 1; 1587 // Special case: len/cap is constant when applied to array or 1588 // pointer to array when the expression does not contain 1589 // function calls or channel receive operations. 1590 t = l->type; 1591 if(t != T && isptr[t->etype]) 1592 t = t->type; 1593 if(isfixedarray(t) && !hascallchan(l)) 1594 return 1; 1595 break; 1596 1597 case OLITERAL: 1598 if(n->val.ctype != CTNIL) 1599 return 1; 1600 break; 1601 1602 case ONAME: 1603 l = n->sym->def; 1604 if(l && l->op == OLITERAL && n->val.ctype != CTNIL) 1605 return 1; 1606 break; 1607 1608 case ONONAME: 1609 if(n->sym->def != N && n->sym->def->op == OIOTA) 1610 return 1; 1611 break; 1612 1613 case OCALL: 1614 // Only constant calls are unsafe.Alignof, Offsetof, and Sizeof. 1615 l = n->left; 1616 while(l->op == OPAREN) 1617 l = l->left; 1618 if(l->op != ONAME || l->sym->pkg != unsafepkg) 1619 break; 1620 if(strcmp(l->sym->name, "Alignof") == 0 || 1621 strcmp(l->sym->name, "Offsetof") == 0 || 1622 strcmp(l->sym->name, "Sizeof") == 0) 1623 return 1; 1624 break; 1625 } 1626 1627 //dump("nonconst", n); 1628 return 0; 1629 } 1630 1631 static int 1632 hascallchan(Node *n) 1633 { 1634 NodeList *l; 1635 1636 if(n == N) 1637 return 0; 1638 switch(n->op) { 1639 case OAPPEND: 1640 case OCALL: 1641 case OCALLFUNC: 1642 case OCALLINTER: 1643 case OCALLMETH: 1644 case OCAP: 1645 case OCLOSE: 1646 case OCOMPLEX: 1647 case OCOPY: 1648 case ODELETE: 1649 case OIMAG: 1650 case OLEN: 1651 case OMAKE: 1652 case ONEW: 1653 case OPANIC: 1654 case OPRINT: 1655 case OPRINTN: 1656 case OREAL: 1657 case ORECOVER: 1658 case ORECV: 1659 return 1; 1660 } 1661 1662 if(hascallchan(n->left) || 1663 hascallchan(n->right)) 1664 return 1; 1665 1666 for(l=n->list; l; l=l->next) 1667 if(hascallchan(l->n)) 1668 return 1; 1669 for(l=n->rlist; l; l=l->next) 1670 if(hascallchan(l->n)) 1671 return 1; 1672 1673 return 0; 1674 }