1 /* $NetBSD: tree.c,v 1.281 2021/05/04 05:40:10 rillig Exp $ */ 2 3 /* 4 * Copyright (c) 1994, 1995 Jochen Pohl 5 * All Rights Reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Jochen Pohl for 18 * The NetBSD Project. 19 * 4. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #if HAVE_NBTOOL_CONFIG_H 35 #include "nbtool_config.h" 36 #endif 37 38 #include <sys/cdefs.h> 39 #if defined(__RCSID) && !defined(lint) 40 __RCSID("$NetBSD: tree.c,v 1.281 2021/05/04 05:40:10 rillig Exp $"); 41 #endif 42 43 #include <float.h> 44 #include <limits.h> 45 #include <math.h> 46 #include <signal.h> 47 #include <stdlib.h> 48 #include <string.h> 49 50 #include "lint1.h" 51 #include "cgram.h" 52 53 static tnode_t *expr_new_integer_constant(tspec_t, int64_t); 54 static void check_pointer_comparison(op_t, 55 const tnode_t *, const tnode_t *); 56 static bool check_assign_types_compatible(op_t, int, 57 const tnode_t *, const tnode_t *); 58 static void check_bad_enum_operation(op_t, 59 const tnode_t *, const tnode_t *); 60 static void check_enum_type_mismatch(op_t, int, 61 const tnode_t *, const tnode_t *); 62 static void check_enum_int_mismatch(op_t, int, 63 const tnode_t *, const tnode_t *); 64 static tnode_t *new_tnode(op_t, type_t *, tnode_t *, tnode_t *); 65 static void balance(op_t, tnode_t **, tnode_t **); 66 static void warn_incompatible_types(op_t, const type_t *, tspec_t, 67 const type_t *, tspec_t); 68 static void warn_incompatible_pointers(const mod_t *, 69 const type_t *, const type_t *); 70 static bool has_constant_member(const type_t *); 71 static void check_prototype_conversion(int, tspec_t, tspec_t, type_t *, 72 tnode_t *); 73 static void check_integer_conversion(op_t, int, tspec_t, tspec_t, type_t *, 74 tnode_t *); 75 static void check_pointer_integer_conversion(op_t, tspec_t, type_t *, 76 tnode_t *); 77 static void check_pointer_conversion(tnode_t *, type_t *); 78 static tnode_t *build_struct_access(op_t, tnode_t *, tnode_t *); 79 static tnode_t *build_prepost_incdec(op_t, tnode_t *); 80 static tnode_t *build_real_imag(op_t, tnode_t *); 81 static tnode_t *build_address(tnode_t *, bool); 82 static tnode_t *build_plus_minus(op_t, tnode_t *, tnode_t *); 83 static tnode_t *build_bit_shift(op_t, tnode_t *, tnode_t *); 84 static tnode_t *build_colon(tnode_t *, tnode_t *); 85 static tnode_t *build_assignment(op_t, tnode_t *, tnode_t *); 86 static tnode_t *plength(type_t *); 87 static tnode_t *fold(tnode_t *); 88 static tnode_t *fold_test(tnode_t *); 89 static tnode_t *fold_float(tnode_t *); 90 static tnode_t *check_function_arguments(type_t *, tnode_t *); 91 static tnode_t *check_prototype_argument(int, type_t *, tnode_t *); 92 static void check_null_effect(const tnode_t *); 93 static void display_expression(const tnode_t *, int); 94 static void check_array_index(tnode_t *, bool); 95 static void check_integer_comparison(op_t, tnode_t *, tnode_t *); 96 static void check_precedence_confusion(tnode_t *); 97 98 extern sig_atomic_t fpe; 99 100 static const char * 101 op_name(op_t op) 102 { 103 return modtab[op].m_name; 104 } 105 106 #ifdef DEBUG 107 void 108 debug_node(const tnode_t *tn, int indent) 109 { 110 op_t op; 111 112 if (tn == NULL) { 113 printf("%*s" "null\n", indent, ""); 114 return; 115 } 116 117 op = tn->tn_op; 118 printf("%*s%s with type '%s'%s%s", 119 2 * indent, "", 120 op == CVT && !tn->tn_cast ? "convert" : op_name(op), 121 type_name(tn->tn_type), tn->tn_lvalue ? ", lvalue" : "", 122 tn->tn_parenthesized ? ", parenthesized" : ""); 123 124 if (op == NAME) 125 printf(" %s\n", tn->tn_sym->s_name); 126 else if (op == CON && is_floating(tn->tn_type->t_tspec)) 127 printf(", value %Lg", tn->tn_val->v_ldbl); 128 else if (op == CON && is_uinteger(tn->tn_type->t_tspec)) 129 printf(", value %llu\n", (unsigned long long)tn->tn_val->v_quad); 130 else if (op == CON && is_integer(tn->tn_type->t_tspec)) 131 printf(", value %lld\n", (long long)tn->tn_val->v_quad); 132 else if (op == CON) 133 printf(", unknown value\n"); 134 else if (op == STRING) 135 printf(", length %zu\n", tn->tn_string->st_len); 136 else { 137 printf("\n"); 138 139 debug_node(tn->tn_left, indent + 1); 140 if (modtab[op].m_binary || tn->tn_right != NULL) 141 debug_node(tn->tn_right, indent + 1); 142 } 143 } 144 #endif 145 146 /* Build 'pointer to tp', 'array of tp' or 'function returning tp'. */ 147 type_t * 148 derive_type(type_t *tp, tspec_t t) 149 { 150 type_t *tp2; 151 152 tp2 = getblk(sizeof(*tp2)); 153 tp2->t_tspec = t; 154 tp2->t_subt = tp; 155 return tp2; 156 } 157 158 /* 159 * Build 'pointer to tp', 'array of tp' or 'function returning tp'. The 160 * memory is freed at the end of the current expression. 161 */ 162 type_t * 163 expr_derive_type(type_t *tp, tspec_t t) 164 { 165 type_t *tp2; 166 167 tp2 = expr_zalloc(sizeof(*tp2)); 168 tp2->t_tspec = t; 169 tp2->t_subt = tp; 170 return tp2; 171 } 172 173 /* 174 * Create a node for a constant. 175 */ 176 tnode_t * 177 expr_new_constant(type_t *tp, val_t *v) 178 { 179 tnode_t *n; 180 181 n = expr_zalloc_tnode(); 182 n->tn_op = CON; 183 n->tn_type = tp; 184 n->tn_val = expr_zalloc(sizeof(*n->tn_val)); 185 n->tn_val->v_tspec = tp->t_tspec; 186 n->tn_val->v_ansiu = v->v_ansiu; 187 n->tn_val->v_u = v->v_u; 188 free(v); 189 return n; 190 } 191 192 static tnode_t * 193 expr_new_integer_constant(tspec_t t, int64_t q) 194 { 195 tnode_t *n; 196 197 n = expr_zalloc_tnode(); 198 n->tn_op = CON; 199 n->tn_type = gettyp(t); 200 n->tn_val = expr_zalloc(sizeof(*n->tn_val)); 201 n->tn_val->v_tspec = t; 202 n->tn_val->v_quad = q; 203 return n; 204 } 205 206 static void 207 fallback_symbol(sym_t *sym) 208 { 209 210 if (fallback_symbol_strict_bool(sym)) 211 return; 212 213 if (block_level > 0 && (strcmp(sym->s_name, "__FUNCTION__") == 0 || 214 strcmp(sym->s_name, "__PRETTY_FUNCTION__") == 0)) { 215 /* __FUNCTION__/__PRETTY_FUNCTION__ is a GCC extension */ 216 gnuism(316); 217 sym->s_type = derive_type(gettyp(CHAR), PTR); 218 sym->s_type->t_const = true; 219 return; 220 } 221 222 if (block_level > 0 && strcmp(sym->s_name, "__func__") == 0) { 223 if (!Sflag) 224 /* __func__ is a C9X feature */ 225 warning(317); 226 sym->s_type = derive_type(gettyp(CHAR), PTR); 227 sym->s_type->t_const = true; 228 return; 229 } 230 231 /* '%s' undefined */ 232 error(99, sym->s_name); 233 } 234 235 /* 236 * Create a node for a name (symbol table entry). 237 * follow_token is the token which follows the name. 238 */ 239 tnode_t * 240 new_name_node(sym_t *sym, int follow_token) 241 { 242 tnode_t *n; 243 244 if (sym->s_scl == NOSCL) { 245 sym->s_scl = EXTERN; 246 sym->s_def = DECL; 247 if (follow_token == T_LPAREN) { 248 if (sflag) { 249 /* function implicitly declared to ... */ 250 warning(215); 251 } 252 /* 253 * XXX if tflag is set the symbol should be 254 * exported to level 0 255 */ 256 sym->s_type = derive_type(sym->s_type, FUNC); 257 } else { 258 fallback_symbol(sym); 259 } 260 } 261 262 lint_assert(sym->s_kind == FVFT || sym->s_kind == FMEMBER); 263 264 n = expr_zalloc_tnode(); 265 n->tn_type = sym->s_type; 266 if (sym->s_scl != CTCONST) { 267 n->tn_op = NAME; 268 n->tn_sym = sym; 269 if (sym->s_kind == FVFT && sym->s_type->t_tspec != FUNC) 270 n->tn_lvalue = true; 271 } else { 272 n->tn_op = CON; 273 n->tn_val = expr_zalloc(sizeof(*n->tn_val)); 274 *n->tn_val = sym->s_value; 275 } 276 277 return n; 278 } 279 280 tnode_t * 281 new_string_node(strg_t *strg) 282 { 283 size_t len; 284 tnode_t *n; 285 286 len = strg->st_len; 287 288 n = expr_zalloc_tnode(); 289 290 n->tn_op = STRING; 291 n->tn_type = expr_derive_type(gettyp(strg->st_tspec), ARRAY); 292 n->tn_type->t_dim = len + 1; 293 n->tn_lvalue = true; 294 295 n->tn_string = expr_zalloc(sizeof(*n->tn_string)); 296 n->tn_string->st_tspec = strg->st_tspec; 297 n->tn_string->st_len = len; 298 299 if (strg->st_tspec == CHAR) { 300 n->tn_string->st_cp = expr_zalloc(len + 1); 301 (void)memcpy(n->tn_string->st_cp, strg->st_cp, len + 1); 302 free(strg->st_cp); 303 } else { 304 size_t size = (len + 1) * sizeof(*n->tn_string->st_wcp); 305 n->tn_string->st_wcp = expr_zalloc(size); 306 (void)memcpy(n->tn_string->st_wcp, strg->st_wcp, size); 307 free(strg->st_wcp); 308 } 309 free(strg); 310 311 return n; 312 } 313 314 /* 315 * Returns a symbol which has the same name as the msym argument and is a 316 * member of the struct or union specified by the tn argument. 317 */ 318 sym_t * 319 struct_or_union_member(tnode_t *tn, op_t op, sym_t *msym) 320 { 321 struct_or_union *str; 322 type_t *tp; 323 sym_t *sym, *csym; 324 bool eq; 325 tspec_t t; 326 327 /* 328 * Remove the member if it was unknown until now, which means 329 * that no defined struct or union has a member with the same name. 330 */ 331 if (msym->s_scl == NOSCL) { 332 /* type '%s' does not have member '%s' */ 333 error(101, type_name(msym->s_type), msym->s_name); 334 rmsym(msym); 335 msym->s_kind = FMEMBER; 336 msym->s_scl = MOS; 337 msym->s_styp = expr_zalloc(sizeof(*msym->s_styp)); 338 msym->s_styp->sou_tag = expr_zalloc( 339 sizeof(*msym->s_styp->sou_tag)); 340 msym->s_styp->sou_tag->s_name = unnamed; 341 msym->s_value.v_tspec = INT; 342 return msym; 343 } 344 345 /* Set str to the tag of which msym is expected to be a member. */ 346 str = NULL; 347 t = (tp = tn->tn_type)->t_tspec; 348 if (op == POINT) { 349 if (t == STRUCT || t == UNION) 350 str = tp->t_str; 351 } else if (op == ARROW && t == PTR) { 352 t = (tp = tp->t_subt)->t_tspec; 353 if (t == STRUCT || t == UNION) 354 str = tp->t_str; 355 } 356 357 /* 358 * If this struct/union has a member with the name of msym, return it. 359 */ 360 if (str != NULL) { 361 for (sym = msym; sym != NULL; sym = sym->s_link) { 362 if (sym->s_scl != MOS && sym->s_scl != MOU) 363 continue; 364 if (sym->s_styp != str) 365 continue; 366 if (strcmp(sym->s_name, msym->s_name) != 0) 367 continue; 368 return sym; 369 } 370 } 371 372 /* 373 * Set eq to false if there are struct/union members with the same 374 * name and different types and/or offsets. 375 */ 376 eq = true; 377 for (csym = msym; csym != NULL; csym = csym->s_link) { 378 if (csym->s_scl != MOS && csym->s_scl != MOU) 379 continue; 380 if (strcmp(msym->s_name, csym->s_name) != 0) 381 continue; 382 for (sym = csym->s_link ; sym != NULL; sym = sym->s_link) { 383 bool w; 384 385 if (sym->s_scl != MOS && sym->s_scl != MOU) 386 continue; 387 if (strcmp(csym->s_name, sym->s_name) != 0) 388 continue; 389 if (csym->s_value.v_quad != sym->s_value.v_quad) { 390 eq = false; 391 break; 392 } 393 w = false; 394 eq = eqtype(csym->s_type, sym->s_type, 395 false, false, &w) && !w; 396 if (!eq) 397 break; 398 if (csym->s_bitfield != sym->s_bitfield) { 399 eq = false; 400 break; 401 } 402 if (csym->s_bitfield) { 403 type_t *tp1, *tp2; 404 405 tp1 = csym->s_type; 406 tp2 = sym->s_type; 407 if (tp1->t_flen != tp2->t_flen) { 408 eq = false; 409 break; 410 } 411 if (tp1->t_foffs != tp2->t_foffs) { 412 eq = false; 413 break; 414 } 415 } 416 } 417 if (!eq) 418 break; 419 } 420 421 /* 422 * Now handle the case in which the left operand refers really 423 * to a struct/union, but the right operand is not member of it. 424 */ 425 if (str != NULL) { 426 if (eq && tflag) { 427 /* illegal member use: %s */ 428 warning(102, msym->s_name); 429 } else { 430 /* illegal member use: %s */ 431 error(102, msym->s_name); 432 } 433 return msym; 434 } 435 436 /* 437 * Now the left operand of ARROW does not point to a struct/union 438 * or the left operand of POINT is no struct/union. 439 */ 440 if (eq) { 441 if (op == POINT) { 442 if (tflag) { 443 /* left operand of '.' must be struct/... */ 444 warning(103); 445 } else { 446 /* left operand of '.' must be struct/... */ 447 error(103); 448 } 449 } else { 450 if (tflag && tn->tn_type->t_tspec == PTR) { 451 /* left operand of '->' must be pointer ... */ 452 warning(104, type_name(tn->tn_type)); 453 } else { 454 /* left operand of '->' must be pointer ... */ 455 error(104, type_name(tn->tn_type)); 456 } 457 } 458 } else { 459 if (tflag) { 460 /* non-unique member requires struct/union %s */ 461 error(105, op == POINT ? "object" : "pointer"); 462 } else { 463 /* unacceptable operand of '%s' */ 464 error(111, op_name(op)); 465 } 466 } 467 468 return msym; 469 } 470 471 /* 472 * Create a tree node. Called for most operands except function calls, 473 * sizeof and casts. 474 * 475 * op operator 476 * ln left operand 477 * rn if not NULL, right operand 478 */ 479 tnode_t * 480 build(op_t op, tnode_t *ln, tnode_t *rn) 481 { 482 const mod_t *mp; 483 tnode_t *ntn; 484 type_t *rettp; 485 486 mp = &modtab[op]; 487 488 /* If there was an error in one of the operands, return. */ 489 if (ln == NULL || (mp->m_binary && rn == NULL)) 490 return NULL; 491 492 /* 493 * Apply class conversions to the left operand, but only if its 494 * value is needed or it is compared with null. 495 */ 496 if (mp->m_left_value_context || mp->m_left_test_context) 497 ln = cconv(ln); 498 /* 499 * The right operand is almost always in a test or value context, 500 * except if it is a struct or union member. 501 */ 502 if (mp->m_binary && op != ARROW && op != POINT) 503 rn = cconv(rn); 504 505 /* 506 * Print some warnings for comparisons of unsigned values with 507 * constants lower than or equal to null. This must be done 508 * before promote() because otherwise unsigned char and unsigned 509 * short would be promoted to int. Also types are tested to be 510 * CHAR, which would also become int. 511 */ 512 if (mp->m_comparison) 513 check_integer_comparison(op, ln, rn); 514 515 /* 516 * Promote the left operand if it is in a test or value context 517 */ 518 if (mp->m_left_value_context || mp->m_left_test_context) 519 ln = promote(op, false, ln); 520 /* 521 * Promote the right operand, but only if it is no struct or 522 * union member, or if it is not to be assigned to the left operand 523 */ 524 if (mp->m_binary && op != ARROW && op != POINT && 525 op != ASSIGN && op != RETURN) { 526 rn = promote(op, false, rn); 527 } 528 529 /* 530 * If the result of the operation is different for signed or 531 * unsigned operands and one of the operands is signed only in 532 * ANSI C, print a warning. 533 */ 534 if (mp->m_warn_if_left_unsigned_in_c90 && 535 ln->tn_op == CON && ln->tn_val->v_ansiu) { 536 /* ANSI C treats constant as unsigned, op %s */ 537 warning(218, mp->m_name); 538 ln->tn_val->v_ansiu = false; 539 } 540 if (mp->m_warn_if_right_unsigned_in_c90 && 541 rn->tn_op == CON && rn->tn_val->v_ansiu) { 542 /* ANSI C treats constant as unsigned, op %s */ 543 warning(218, mp->m_name); 544 rn->tn_val->v_ansiu = false; 545 } 546 547 /* Make sure both operands are of the same type */ 548 if (mp->m_balance_operands || (tflag && (op == SHL || op == SHR))) 549 balance(op, &ln, &rn); 550 551 /* 552 * Check types for compatibility with the operation and mutual 553 * compatibility. Return if there are serious problems. 554 */ 555 if (!typeok(op, 0, ln, rn)) 556 return NULL; 557 558 /* And now create the node. */ 559 switch (op) { 560 case POINT: 561 case ARROW: 562 ntn = build_struct_access(op, ln, rn); 563 break; 564 case INCAFT: 565 case DECAFT: 566 case INCBEF: 567 case DECBEF: 568 ntn = build_prepost_incdec(op, ln); 569 break; 570 case ADDR: 571 ntn = build_address(ln, false); 572 break; 573 case INDIR: 574 ntn = new_tnode(INDIR, ln->tn_type->t_subt, ln, NULL); 575 break; 576 case PLUS: 577 case MINUS: 578 ntn = build_plus_minus(op, ln, rn); 579 break; 580 case SHL: 581 case SHR: 582 ntn = build_bit_shift(op, ln, rn); 583 break; 584 case COLON: 585 ntn = build_colon(ln, rn); 586 break; 587 case ASSIGN: 588 case MULASS: 589 case DIVASS: 590 case MODASS: 591 case ADDASS: 592 case SUBASS: 593 case SHLASS: 594 case SHRASS: 595 case ANDASS: 596 case XORASS: 597 case ORASS: 598 case RETURN: 599 ntn = build_assignment(op, ln, rn); 600 break; 601 case COMMA: 602 case QUEST: 603 ntn = new_tnode(op, rn->tn_type, ln, rn); 604 break; 605 case REAL: 606 case IMAG: 607 ntn = build_real_imag(op, ln); 608 break; 609 default: 610 rettp = mp->m_returns_bool 611 ? gettyp(Tflag ? BOOL : INT) : ln->tn_type; 612 lint_assert(mp->m_binary || rn == NULL); 613 ntn = new_tnode(op, rettp, ln, rn); 614 break; 615 } 616 617 /* Return if an error occurred. */ 618 if (ntn == NULL) 619 return NULL; 620 621 /* Print a warning if precedence confusion is possible */ 622 if (mp->m_possible_precedence_confusion) 623 check_precedence_confusion(ntn); 624 625 /* 626 * Print a warning if one of the operands is in a context where 627 * it is compared with null and if this operand is a constant. 628 */ 629 if (mp->m_left_test_context) { 630 if (ln->tn_op == CON || 631 ((mp->m_binary && op != QUEST) && rn->tn_op == CON)) { 632 if (hflag && !constcond_flag && 633 !ln->tn_system_dependent) 634 /* constant in conditional context */ 635 warning(161); 636 } 637 } 638 639 /* Fold if the operator requires it */ 640 if (mp->m_fold_constant_operands) { 641 if (ln->tn_op == CON && (!mp->m_binary || rn->tn_op == CON)) { 642 if (mp->m_left_test_context) { 643 ntn = fold_test(ntn); 644 } else if (is_floating(ntn->tn_type->t_tspec)) { 645 ntn = fold_float(ntn); 646 } else { 647 ntn = fold(ntn); 648 } 649 } else if (op == QUEST && ln->tn_op == CON) { 650 ntn = ln->tn_val->v_quad != 0 651 ? rn->tn_left : rn->tn_right; 652 } 653 } 654 655 return ntn; 656 } 657 658 /* 659 * Perform class conversions. 660 * 661 * Arrays of type T are converted into pointers to type T. 662 * Functions are converted to pointers to functions. 663 * Lvalues are converted to rvalues. 664 * 665 * C99 6.3 "Conversions" 666 * C99 6.3.2 "Other operands" 667 * C99 6.3.2.1 "Lvalues, arrays, and function designators" 668 */ 669 tnode_t * 670 cconv(tnode_t *tn) 671 { 672 type_t *tp; 673 674 /* 675 * Array-lvalue (array of type T) is converted into rvalue 676 * (pointer to type T) 677 */ 678 if (tn->tn_type->t_tspec == ARRAY) { 679 if (!tn->tn_lvalue) { 680 /* XXX print correct operator */ 681 /* %soperand of '%s' must be lvalue */ 682 gnuism(114, "", op_name(ADDR)); 683 } 684 tn = new_tnode(ADDR, 685 expr_derive_type(tn->tn_type->t_subt, PTR), tn, NULL); 686 } 687 688 /* 689 * Expression of type function (function with return value of type T) 690 * in rvalue-expression (pointer to function with return value 691 * of type T) 692 */ 693 if (tn->tn_type->t_tspec == FUNC) 694 tn = build_address(tn, true); 695 696 /* lvalue to rvalue */ 697 if (tn->tn_lvalue) { 698 tp = expr_dup_type(tn->tn_type); 699 tp->t_const = tp->t_volatile = false; 700 tn = new_tnode(LOAD, tp, tn, NULL); 701 } 702 703 return tn; 704 } 705 706 const tnode_t * 707 before_conversion(const tnode_t *tn) 708 { 709 while (tn->tn_op == CVT && !tn->tn_cast) 710 tn = tn->tn_left; 711 return tn; 712 } 713 714 static bool 715 is_null_pointer(const tnode_t *tn) 716 { 717 tspec_t t = tn->tn_type->t_tspec; 718 719 return ((t == PTR && tn->tn_type->t_subt->t_tspec == VOID) || 720 is_integer(t)) 721 && (tn->tn_op == CON && tn->tn_val->v_quad == 0); 722 } 723 724 static bool 725 typeok_incdec(op_t op, const tnode_t *tn, const type_t *tp) 726 { 727 /* operand has scalar type (checked in typeok) */ 728 if (!tn->tn_lvalue) { 729 if (tn->tn_op == CVT && tn->tn_cast && 730 tn->tn_left->tn_op == LOAD) { 731 if (tn->tn_type->t_tspec == PTR) 732 return true; 733 /* a cast does not yield an lvalue */ 734 error(163); 735 } 736 /* %soperand of '%s' must be lvalue */ 737 error(114, "", op_name(op)); 738 return false; 739 } else if (tp->t_const) { 740 if (!tflag) 741 /* %soperand of '%s' must be modifiable lvalue */ 742 warning(115, "", op_name(op)); 743 } 744 return true; 745 } 746 747 static bool 748 typeok_address(const mod_t *mp, 749 const tnode_t *tn, const type_t *tp, tspec_t t) 750 { 751 if (t == ARRAY || t == FUNC) { 752 /* ok, a warning comes later (in build_address()) */ 753 } else if (!tn->tn_lvalue) { 754 if (tn->tn_op == CVT && tn->tn_cast && 755 tn->tn_left->tn_op == LOAD) { 756 if (tn->tn_type->t_tspec == PTR) 757 return true; 758 /* a cast does not yield an lvalue */ 759 error(163); 760 } 761 /* %soperand of '%s' must be lvalue */ 762 error(114, "", mp->m_name); 763 return false; 764 } else if (is_scalar(t)) { 765 if (tp->t_bitfield) { 766 /* cannot take address of bit-field */ 767 error(112); 768 return false; 769 } 770 } else if (t != STRUCT && t != UNION) { 771 /* unacceptable operand of '%s' */ 772 error(111, mp->m_name); 773 return false; 774 } 775 if (tn->tn_op == NAME && tn->tn_sym->s_reg) { 776 /* cannot take address of register %s */ 777 error(113, tn->tn_sym->s_name); 778 return false; 779 } 780 return true; 781 } 782 783 static bool 784 typeok_star(tspec_t t) 785 { 786 /* until now there were no type checks for this operator */ 787 if (t != PTR) { 788 /* cannot dereference non-pointer type */ 789 error(96); 790 return false; 791 } 792 return true; 793 } 794 795 static bool 796 typeok_plus(op_t op, 797 const type_t *ltp, tspec_t lt, 798 const type_t *rtp, tspec_t rt) 799 { 800 /* operands have scalar types (checked above) */ 801 if ((lt == PTR && !is_integer(rt)) || (rt == PTR && !is_integer(lt))) { 802 warn_incompatible_types(op, ltp, lt, rtp, rt); 803 return false; 804 } 805 return true; 806 } 807 808 static bool 809 typeok_minus(op_t op, 810 const type_t *ltp, tspec_t lt, 811 const type_t *rtp, tspec_t rt) 812 { 813 /* operands have scalar types (checked above) */ 814 if (lt == PTR && (!is_integer(rt) && rt != PTR)) { 815 warn_incompatible_types(op, ltp, lt, rtp, rt); 816 return false; 817 } else if (rt == PTR && lt != PTR) { 818 warn_incompatible_types(op, ltp, lt, rtp, rt); 819 return false; 820 } 821 if (lt == PTR && rt == PTR) { 822 if (!eqtype(ltp->t_subt, rtp->t_subt, true, false, NULL)) { 823 /* illegal pointer subtraction */ 824 error(116); 825 } 826 } 827 return true; 828 } 829 830 static void 831 typeok_shr(const mod_t *mp, 832 const tnode_t *ln, tspec_t lt, 833 const tnode_t *rn, tspec_t rt) 834 { 835 tspec_t olt, ort; 836 837 olt = before_conversion(ln)->tn_type->t_tspec; 838 ort = before_conversion(rn)->tn_type->t_tspec; 839 840 /* operands have integer types (checked above) */ 841 if (pflag && !is_uinteger(lt)) { 842 /* 843 * The left operand is signed. This means that 844 * the operation is (possibly) nonportable. 845 */ 846 if (ln->tn_op != CON) { 847 /* bitwise '%s' on signed value possibly nonportable */ 848 warning(117, mp->m_name); 849 } else if (ln->tn_val->v_quad < 0) { 850 /* bitwise '%s' on signed value nonportable */ 851 warning(120, mp->m_name); 852 } 853 } else if (!tflag && !sflag && !is_uinteger(olt) && is_uinteger(ort)) { 854 /* 855 * The left operand would become unsigned in 856 * traditional C. 857 */ 858 if (hflag && !Sflag && 859 (ln->tn_op != CON || ln->tn_val->v_quad < 0)) { 860 /* semantics of '%s' change in ANSI C; use ... */ 861 warning(118, mp->m_name); 862 } 863 } else if (!tflag && !sflag && !is_uinteger(olt) && !is_uinteger(ort) && 864 portable_size_in_bits(lt) < portable_size_in_bits(rt)) { 865 /* 866 * In traditional C the left operand would be extended, 867 * possibly with 1, and then shifted. 868 */ 869 if (hflag && !Sflag && 870 (ln->tn_op != CON || ln->tn_val->v_quad < 0)) { 871 /* semantics of '%s' change in ANSI C; use ... */ 872 warning(118, mp->m_name); 873 } 874 } 875 } 876 877 static void 878 typeok_shl(const mod_t *mp, tspec_t lt, tspec_t rt) 879 { 880 /* 881 * C90 does not perform balancing for shift operations, 882 * but traditional C does. If the width of the right operand 883 * is greater than the width of the left operand, then in 884 * traditional C the left operand would be extended to the 885 * width of the right operand. For SHL this may result in 886 * different results. 887 */ 888 if (portable_size_in_bits(lt) < portable_size_in_bits(rt)) { 889 /* 890 * XXX If both operands are constant, make sure 891 * that there is really a difference between 892 * ANSI C and traditional C. 893 */ 894 if (hflag && !Sflag) 895 /* semantics of '%s' change in ANSI C; use ... */ 896 warning(118, mp->m_name); 897 } 898 } 899 900 static void 901 typeok_shift(tspec_t lt, const tnode_t *rn, tspec_t rt) 902 { 903 if (rn->tn_op != CON) 904 return; 905 906 if (!is_uinteger(rt) && rn->tn_val->v_quad < 0) { 907 /* negative shift */ 908 warning(121); 909 } else if ((uint64_t)rn->tn_val->v_quad == 910 (uint64_t)size_in_bits(lt)) { 911 /* shift equal to size of object */ 912 warning(267); 913 } else if ((uint64_t)rn->tn_val->v_quad > (uint64_t)size_in_bits(lt)) { 914 /* shift amount %llu is greater than bit-size %llu of '%s' */ 915 warning(122, (unsigned long long)rn->tn_val->v_quad, 916 (unsigned long long)size_in_bits(lt), 917 tspec_name(lt)); 918 } 919 } 920 921 static bool 922 is_typeok_eq(const tnode_t *ln, tspec_t lt, const tnode_t *rn, tspec_t rt) 923 { 924 if (lt == PTR && is_null_pointer(rn)) 925 return true; 926 if (rt == PTR && is_null_pointer(ln)) 927 return true; 928 return false; 929 } 930 931 static bool 932 typeok_ordered_comparison(op_t op, 933 const tnode_t *ln, const type_t *ltp, tspec_t lt, 934 const tnode_t *rn, const type_t *rtp, tspec_t rt) 935 { 936 if (lt == PTR && rt == PTR) { 937 check_pointer_comparison(op, ln, rn); 938 return true; 939 } 940 941 if (lt != PTR && rt != PTR) 942 return true; 943 944 if (!is_integer(lt) && !is_integer(rt)) { 945 warn_incompatible_types(op, ltp, lt, rtp, rt); 946 return false; 947 } 948 949 const char *lx = lt == PTR ? "pointer" : "integer"; 950 const char *rx = rt == PTR ? "pointer" : "integer"; 951 /* illegal combination of %s (%s) and %s (%s), op %s */ 952 warning(123, lx, type_name(ltp), rx, type_name(rtp), op_name(op)); 953 return true; 954 } 955 956 static bool 957 typeok_quest(tspec_t lt, const tnode_t **rn) 958 { 959 if (!is_scalar(lt)) { 960 /* first operand must have scalar type, op ? : */ 961 error(170); 962 return false; 963 } 964 while ((*rn)->tn_op == CVT) 965 *rn = (*rn)->tn_left; 966 lint_assert((*rn)->tn_op == COLON); 967 return true; 968 } 969 970 static void 971 typeok_colon_pointer(const mod_t *mp, const type_t *ltp, const type_t *rtp) 972 { 973 type_t *lstp = ltp->t_subt; 974 type_t *rstp = rtp->t_subt; 975 tspec_t lst = lstp->t_tspec; 976 tspec_t rst = rstp->t_tspec; 977 978 if ((lst == VOID && rst == FUNC) || (lst == FUNC && rst == VOID)) { 979 /* (void *)0 handled above */ 980 if (sflag) 981 /* ANSI C forbids conv. of %s to %s, op %s */ 982 warning(305, "function pointer", "'void *'", 983 mp->m_name); 984 return; 985 } 986 987 if (eqptrtype(lstp, rstp, true)) 988 return; 989 if (!eqtype(lstp, rstp, true, false, NULL)) 990 warn_incompatible_pointers(mp, ltp, rtp); 991 } 992 993 static bool 994 typeok_colon(const mod_t *mp, 995 const tnode_t *ln, const type_t *ltp, tspec_t lt, 996 const tnode_t *rn, const type_t *rtp, tspec_t rt) 997 { 998 999 if (is_arithmetic(lt) && is_arithmetic(rt)) 1000 return true; 1001 if (lt == BOOL && rt == BOOL) 1002 return true; 1003 1004 if (lt == STRUCT && rt == STRUCT && ltp->t_str == rtp->t_str) 1005 return true; 1006 if (lt == UNION && rt == UNION && ltp->t_str == rtp->t_str) 1007 return true; 1008 1009 if (lt == PTR && is_null_pointer(rn)) 1010 return true; 1011 if (rt == PTR && is_null_pointer(ln)) 1012 return true; 1013 1014 if ((lt == PTR && is_integer(rt)) || (is_integer(lt) && rt == PTR)) { 1015 const char *lx = lt == PTR ? "pointer" : "integer"; 1016 const char *rx = rt == PTR ? "pointer" : "integer"; 1017 /* illegal combination of %s (%s) and %s (%s), op %s */ 1018 warning(123, lx, type_name(ltp), 1019 rx, type_name(rtp), mp->m_name); 1020 return true; 1021 } 1022 1023 if (lt == VOID || rt == VOID) { 1024 if (lt != VOID || rt != VOID) 1025 /* incompatible types '%s' and '%s' in conditional */ 1026 warning(126, type_name(ltp), type_name(rtp)); 1027 return true; 1028 } 1029 1030 if (lt == PTR && rt == PTR) { 1031 typeok_colon_pointer(mp, ltp, rtp); 1032 return true; 1033 } 1034 1035 /* incompatible types '%s' and '%s' in conditional */ 1036 error(126, type_name(ltp), type_name(rtp)); 1037 return false; 1038 } 1039 1040 static bool 1041 typeok_assign(const mod_t *mp, const tnode_t *ln, const type_t *ltp, tspec_t lt) 1042 { 1043 if (!ln->tn_lvalue) { 1044 if (ln->tn_op == CVT && ln->tn_cast && 1045 ln->tn_left->tn_op == LOAD) { 1046 if (ln->tn_type->t_tspec == PTR) 1047 return true; 1048 /* a cast does not yield an lvalue */ 1049 error(163); 1050 } 1051 /* %soperand of '%s' must be lvalue */ 1052 error(114, "left ", mp->m_name); 1053 return false; 1054 } else if (ltp->t_const || ((lt == STRUCT || lt == UNION) && 1055 has_constant_member(ltp))) { 1056 if (!tflag) 1057 /* %soperand of '%s' must be modifiable lvalue */ 1058 warning(115, "left ", mp->m_name); 1059 } 1060 return true; 1061 } 1062 1063 1064 1065 /* Check the types using the information from modtab[]. */ 1066 static bool 1067 typeok_scalar(op_t op, const mod_t *mp, 1068 const type_t *ltp, tspec_t lt, 1069 const type_t *rtp, tspec_t rt) 1070 { 1071 if (mp->m_takes_bool && lt == BOOL && rt == BOOL) 1072 return true; 1073 if (mp->m_requires_integer) { 1074 if (!is_integer(lt) || (mp->m_binary && !is_integer(rt))) { 1075 warn_incompatible_types(op, ltp, lt, rtp, rt); 1076 return false; 1077 } 1078 } else if (mp->m_requires_integer_or_complex) { 1079 if ((!is_integer(lt) && !is_complex(lt)) || 1080 (mp->m_binary && (!is_integer(rt) && !is_complex(rt)))) { 1081 warn_incompatible_types(op, ltp, lt, rtp, rt); 1082 return false; 1083 } 1084 } else if (mp->m_requires_scalar) { 1085 if (!is_scalar(lt) || (mp->m_binary && !is_scalar(rt))) { 1086 warn_incompatible_types(op, ltp, lt, rtp, rt); 1087 return false; 1088 } 1089 } else if (mp->m_requires_arith) { 1090 if (!is_arithmetic(lt) || 1091 (mp->m_binary && !is_arithmetic(rt))) { 1092 warn_incompatible_types(op, ltp, lt, rtp, rt); 1093 return false; 1094 } 1095 } 1096 return true; 1097 } 1098 1099 /* Check the types for specific operators and type combinations. */ 1100 static bool 1101 typeok_op(op_t op, const mod_t *mp, int arg, 1102 const tnode_t *ln, const type_t *ltp, tspec_t lt, 1103 const tnode_t *rn, const type_t *rtp, tspec_t rt) 1104 { 1105 switch (op) { 1106 case POINT: 1107 /* 1108 * Most errors required by ANSI C are reported in 1109 * struct_or_union_member(). 1110 * Here we only must check for totally wrong things. 1111 */ 1112 if (lt == FUNC || lt == VOID || ltp->t_bitfield || 1113 ((lt != STRUCT && lt != UNION) && !ln->tn_lvalue)) { 1114 /* Without tflag we got already an error */ 1115 if (tflag) 1116 /* unacceptable operand of '%s' */ 1117 error(111, mp->m_name); 1118 return false; 1119 } 1120 /* Now we have an object we can create a pointer to */ 1121 break; 1122 case ARROW: 1123 if (lt != PTR && !(tflag && is_integer(lt))) { 1124 /* Without tflag we got already an error */ 1125 if (tflag) 1126 /* unacceptable operand of '%s' */ 1127 error(111, mp->m_name); 1128 return false; 1129 } 1130 break; 1131 case INCAFT: 1132 case DECAFT: 1133 case INCBEF: 1134 case DECBEF: 1135 if (!typeok_incdec(op, ln, ltp)) 1136 return false; 1137 break; 1138 case ADDR: 1139 if (!typeok_address(mp, ln, ltp, lt)) 1140 return false; 1141 break; 1142 case INDIR: 1143 if (!typeok_star(lt)) 1144 return false; 1145 break; 1146 case PLUS: 1147 if (!typeok_plus(op, ltp, lt, rtp, rt)) 1148 return false; 1149 break; 1150 case MINUS: 1151 if (!typeok_minus(op, ltp, lt, rtp, rt)) 1152 return false; 1153 break; 1154 case SHR: 1155 typeok_shr(mp, ln, lt, rn, rt); 1156 goto shift; 1157 case SHL: 1158 typeok_shl(mp, lt, rt); 1159 shift: 1160 typeok_shift(lt, rn, rt); 1161 break; 1162 case EQ: 1163 case NE: 1164 /* 1165 * Accept some things which are allowed with EQ and NE, 1166 * but not with ordered comparisons. 1167 */ 1168 if (is_typeok_eq(ln, lt, rn, rt)) 1169 break; 1170 /* FALLTHROUGH */ 1171 case LT: 1172 case GT: 1173 case LE: 1174 case GE: 1175 if (!typeok_ordered_comparison(op, ln, ltp, lt, rn, rtp, rt)) 1176 return false; 1177 break; 1178 case QUEST: 1179 if (!typeok_quest(lt, &rn)) 1180 return false; 1181 break; 1182 case COLON: 1183 if (!typeok_colon(mp, ln, ltp, lt, rn, rtp, rt)) 1184 return false; 1185 break; 1186 case ASSIGN: 1187 case INIT: 1188 case FARG: 1189 case RETURN: 1190 if (!check_assign_types_compatible(op, arg, ln, rn)) 1191 return false; 1192 goto assign; 1193 case MULASS: 1194 case DIVASS: 1195 case MODASS: 1196 goto assign; 1197 case ADDASS: 1198 case SUBASS: 1199 /* operands have scalar types (checked above) */ 1200 if ((lt == PTR && !is_integer(rt)) || rt == PTR) { 1201 warn_incompatible_types(op, ltp, lt, rtp, rt); 1202 return false; 1203 } 1204 goto assign; 1205 case SHLASS: 1206 goto assign; 1207 case SHRASS: 1208 if (pflag && !is_uinteger(lt) && !(tflag && is_uinteger(rt))) { 1209 /* bitwise '%s' on signed value possibly nonportable */ 1210 warning(117, mp->m_name); 1211 } 1212 goto assign; 1213 case ANDASS: 1214 case XORASS: 1215 case ORASS: 1216 goto assign; 1217 assign: 1218 if (!typeok_assign(mp, ln, ltp, lt)) 1219 return false; 1220 break; 1221 case COMMA: 1222 if (!modtab[ln->tn_op].m_has_side_effect) 1223 check_null_effect(ln); 1224 break; 1225 /* LINTED206: (enumeration values not handled in switch) */ 1226 case CON: 1227 case CASE: 1228 case PUSH: 1229 case LOAD: 1230 case ICALL: 1231 case CVT: 1232 case CALL: 1233 case FSEL: 1234 case STRING: 1235 case NAME: 1236 case LOGOR: 1237 case LOGAND: 1238 case BITOR: 1239 case BITXOR: 1240 case BITAND: 1241 case MOD: 1242 case DIV: 1243 case MULT: 1244 case UMINUS: 1245 case UPLUS: 1246 case DEC: 1247 case INC: 1248 case COMPL: 1249 case NOT: 1250 case NOOP: 1251 case REAL: 1252 case IMAG: 1253 break; 1254 } 1255 return true; 1256 } 1257 1258 static void 1259 typeok_enum(op_t op, const mod_t *mp, int arg, 1260 const tnode_t *ln, const type_t *ltp, 1261 const tnode_t *rn, const type_t *rtp) 1262 { 1263 if (mp->m_bad_on_enum && 1264 (ltp->t_is_enum || (mp->m_binary && rtp->t_is_enum))) { 1265 check_bad_enum_operation(op, ln, rn); 1266 } else if (mp->m_valid_on_enum && 1267 (ltp->t_is_enum && rtp != NULL && rtp->t_is_enum)) { 1268 check_enum_type_mismatch(op, arg, ln, rn); 1269 } else if (mp->m_valid_on_enum && 1270 (ltp->t_is_enum || (rtp != NULL && rtp->t_is_enum))) { 1271 check_enum_int_mismatch(op, arg, ln, rn); 1272 } 1273 } 1274 1275 /* Perform most type checks. Return whether the types are ok. */ 1276 bool 1277 typeok(op_t op, int arg, const tnode_t *ln, const tnode_t *rn) 1278 { 1279 const mod_t *mp; 1280 tspec_t lt, rt; 1281 type_t *ltp, *rtp; 1282 1283 mp = &modtab[op]; 1284 1285 lint_assert((ltp = ln->tn_type) != NULL); 1286 lt = ltp->t_tspec; 1287 1288 if (mp->m_binary) { 1289 lint_assert((rtp = rn->tn_type) != NULL); 1290 rt = rtp->t_tspec; 1291 } else { 1292 rtp = NULL; 1293 rt = NOTSPEC; 1294 } 1295 1296 if (Tflag && !typeok_scalar_strict_bool(op, mp, arg, ln, rn)) 1297 return false; 1298 if (!typeok_scalar(op, mp, ltp, lt, rtp, rt)) 1299 return false; 1300 1301 if (!typeok_op(op, mp, arg, ln, ltp, lt, rn, rtp, rt)) 1302 return false; 1303 1304 typeok_enum(op, mp, arg, ln, ltp, rn, rtp); 1305 return true; 1306 } 1307 1308 static void 1309 check_pointer_comparison(op_t op, const tnode_t *ln, const tnode_t *rn) 1310 { 1311 type_t *ltp, *rtp; 1312 tspec_t lst, rst; 1313 const char *lsts, *rsts; 1314 1315 lst = (ltp = ln->tn_type)->t_subt->t_tspec; 1316 rst = (rtp = rn->tn_type)->t_subt->t_tspec; 1317 1318 if (lst == VOID || rst == VOID) { 1319 if (sflag && (lst == FUNC || rst == FUNC)) { 1320 /* (void *)0 already handled in typeok() */ 1321 *(lst == FUNC ? &lsts : &rsts) = "function pointer"; 1322 *(lst == VOID ? &lsts : &rsts) = "'void *'"; 1323 /* ANSI C forbids comparison of %s with %s */ 1324 warning(274, lsts, rsts); 1325 } 1326 return; 1327 } 1328 1329 if (!eqtype(ltp->t_subt, rtp->t_subt, true, false, NULL)) { 1330 warn_incompatible_pointers(&modtab[op], ltp, rtp); 1331 return; 1332 } 1333 1334 if (lst == FUNC && rst == FUNC) { 1335 if (sflag && op != EQ && op != NE) 1336 /* ANSI C forbids ordered comparisons of ... */ 1337 warning(125); 1338 } 1339 } 1340 1341 /* 1342 * Checks type compatibility for ASSIGN, INIT, FARG and RETURN 1343 * and prints warnings/errors if necessary. 1344 * If the types are (almost) compatible, 1 is returned, otherwise 0. 1345 */ 1346 static bool 1347 check_assign_types_compatible(op_t op, int arg, 1348 const tnode_t *ln, const tnode_t *rn) 1349 { 1350 tspec_t lt, rt, lst = NOTSPEC, rst = NOTSPEC; 1351 type_t *ltp, *rtp, *lstp = NULL, *rstp = NULL; 1352 const mod_t *mp; 1353 const char *lts, *rts; 1354 1355 if ((lt = (ltp = ln->tn_type)->t_tspec) == PTR) 1356 lst = (lstp = ltp->t_subt)->t_tspec; 1357 if ((rt = (rtp = rn->tn_type)->t_tspec) == PTR) 1358 rst = (rstp = rtp->t_subt)->t_tspec; 1359 mp = &modtab[op]; 1360 1361 if (lt == BOOL && is_scalar(rt)) /* C99 6.3.1.2 */ 1362 return true; 1363 1364 if (is_arithmetic(lt) && (is_arithmetic(rt) || rt == BOOL)) 1365 return true; 1366 1367 if ((lt == STRUCT || lt == UNION) && (rt == STRUCT || rt == UNION)) 1368 /* both are struct or union */ 1369 return ltp->t_str == rtp->t_str; 1370 1371 /* a null pointer may be assigned to any pointer */ 1372 if (lt == PTR && is_null_pointer(rn)) 1373 return true; 1374 1375 if (lt == PTR && rt == PTR && (lst == VOID || rst == VOID)) { 1376 /* two pointers, at least one pointer to void */ 1377 if (sflag && (lst == FUNC || rst == FUNC)) { 1378 /* comb. of ptr to func and ptr to void */ 1379 *(lst == FUNC ? <s : &rts) = "function pointer"; 1380 *(lst == VOID ? <s : &rts) = "'void *'"; 1381 switch (op) { 1382 case INIT: 1383 case RETURN: 1384 /* ANSI C forbids conversion of %s to %s */ 1385 warning(303, rts, lts); 1386 break; 1387 case FARG: 1388 /* ANSI C forbids conv. of %s to %s, arg #%d */ 1389 warning(304, rts, lts, arg); 1390 break; 1391 default: 1392 /* ANSI C forbids conv. of %s to %s, op %s */ 1393 warning(305, rts, lts, mp->m_name); 1394 break; 1395 } 1396 } 1397 } 1398 1399 if (lt == PTR && rt == PTR && (lst == VOID || rst == VOID || 1400 eqtype(lstp, rstp, true, false, NULL))) { 1401 /* compatible pointer types (qualifiers ignored) */ 1402 if (!tflag && 1403 ((!lstp->t_const && rstp->t_const) || 1404 (!lstp->t_volatile && rstp->t_volatile))) { 1405 /* left side has not all qualifiers of right */ 1406 switch (op) { 1407 case INIT: 1408 case RETURN: 1409 /* incompatible pointer types (%s != %s) */ 1410 warning(182, type_name(lstp), type_name(rstp)); 1411 break; 1412 case FARG: 1413 /* converting '%s' to incompatible '%s' ... */ 1414 warning(153, 1415 type_name(rtp), type_name(ltp), arg); 1416 break; 1417 default: 1418 /* operands have incompatible pointer type... */ 1419 warning(128, mp->m_name, 1420 type_name(lstp), type_name(rstp)); 1421 break; 1422 } 1423 } 1424 return true; 1425 } 1426 1427 if ((lt == PTR && is_integer(rt)) || (is_integer(lt) && rt == PTR)) { 1428 const char *lx = lt == PTR ? "pointer" : "integer"; 1429 const char *rx = rt == PTR ? "pointer" : "integer"; 1430 1431 switch (op) { 1432 case INIT: 1433 case RETURN: 1434 /* illegal combination of %s (%s) and %s (%s) */ 1435 warning(183, lx, type_name(ltp), rx, type_name(rtp)); 1436 break; 1437 case FARG: 1438 /* illegal comb. of %s (%s) and %s (%s), arg #%d */ 1439 warning(154, 1440 lx, type_name(ltp), rx, type_name(rtp), arg); 1441 break; 1442 default: 1443 /* illegal combination of %s (%s) and %s (%s), op %s */ 1444 warning(123, 1445 lx, type_name(ltp), rx, type_name(rtp), mp->m_name); 1446 break; 1447 } 1448 return true; 1449 } 1450 1451 if (lt == PTR && rt == PTR) { 1452 switch (op) { 1453 case INIT: 1454 case RETURN: 1455 warn_incompatible_pointers(NULL, ltp, rtp); 1456 break; 1457 case FARG: 1458 /* converting '%s' to incompatible '%s' for ... */ 1459 warning(153, type_name(rtp), type_name(ltp), arg); 1460 break; 1461 default: 1462 warn_incompatible_pointers(mp, ltp, rtp); 1463 break; 1464 } 1465 return true; 1466 } 1467 1468 switch (op) { 1469 case INIT: 1470 /* cannot initialize '%s' from '%s' */ 1471 error(185, type_name(ltp), type_name(rtp)); 1472 break; 1473 case RETURN: 1474 /* return value type mismatch (%s) and (%s) */ 1475 error(211, type_name(ltp), type_name(rtp)); 1476 break; 1477 case FARG: 1478 /* argument is incompatible with prototype, arg #%d */ 1479 warning(155, arg); 1480 break; 1481 default: 1482 warn_incompatible_types(op, ltp, lt, rtp, rt); 1483 break; 1484 } 1485 1486 return false; 1487 } 1488 1489 /* Prints a warning if a strange operator is used on an enum type. */ 1490 static void 1491 check_bad_enum_operation(op_t op, const tnode_t *ln, const tnode_t *rn) 1492 { 1493 1494 if (!eflag) 1495 return; 1496 1497 if (!(ln->tn_type->t_is_enum || 1498 (modtab[op].m_binary && rn->tn_type->t_is_enum))) { 1499 return; 1500 } 1501 1502 /* 1503 * Enum as offset to a pointer is an exception (otherwise enums 1504 * could not be used as array indices). 1505 */ 1506 if (op == PLUS && 1507 ((ln->tn_type->t_is_enum && rn->tn_type->t_tspec == PTR) || 1508 (rn->tn_type->t_is_enum && ln->tn_type->t_tspec == PTR))) { 1509 return; 1510 } 1511 1512 /* dubious operation on enum, op %s */ 1513 warning(241, op_name(op)); 1514 1515 } 1516 1517 /* 1518 * Prints a warning if an operator is applied to two different enum types. 1519 */ 1520 static void 1521 check_enum_type_mismatch(op_t op, int arg, const tnode_t *ln, const tnode_t *rn) 1522 { 1523 const mod_t *mp; 1524 1525 mp = &modtab[op]; 1526 1527 if (ln->tn_type->t_enum != rn->tn_type->t_enum) { 1528 switch (op) { 1529 case INIT: 1530 /* enum type mismatch between '%s' and '%s' in ... */ 1531 warning(210, 1532 type_name(ln->tn_type), type_name(rn->tn_type)); 1533 break; 1534 case FARG: 1535 /* enum type mismatch, arg #%d (%s != %s) */ 1536 warning(156, arg, 1537 type_name(ln->tn_type), type_name(rn->tn_type)); 1538 break; 1539 case RETURN: 1540 /* return value type mismatch (%s) and (%s) */ 1541 warning(211, 1542 type_name(ln->tn_type), type_name(rn->tn_type)); 1543 break; 1544 default: 1545 /* enum type mismatch: '%s' '%s' '%s' */ 1546 warning(130, type_name(ln->tn_type), mp->m_name, 1547 type_name(rn->tn_type)); 1548 break; 1549 } 1550 } else if (Pflag && mp->m_comparison && op != EQ && op != NE) { 1551 if (eflag) 1552 /* dubious comparison of enums, op %s */ 1553 warning(243, mp->m_name); 1554 } 1555 } 1556 1557 /* Prints a warning if the operands mix between enum and integer. */ 1558 static void 1559 check_enum_int_mismatch(op_t op, int arg, const tnode_t *ln, const tnode_t *rn) 1560 { 1561 1562 if (!eflag) 1563 return; 1564 1565 switch (op) { 1566 case INIT: 1567 /* 1568 * Initialization with 0 is allowed. Otherwise, all implicit 1569 * initializations would need to be warned upon as well. 1570 */ 1571 if (!rn->tn_type->t_is_enum && rn->tn_op == CON && 1572 is_integer(rn->tn_type->t_tspec) && 1573 rn->tn_val->v_quad == 0) { 1574 return; 1575 } 1576 /* initialization of '%s' with '%s' */ 1577 warning(277, type_name(ln->tn_type), type_name(rn->tn_type)); 1578 break; 1579 case FARG: 1580 /* combination of '%s' and '%s', arg #%d */ 1581 warning(278, 1582 type_name(ln->tn_type), type_name(rn->tn_type), arg); 1583 break; 1584 case RETURN: 1585 /* combination of '%s' and '%s' in return */ 1586 warning(279, type_name(ln->tn_type), type_name(rn->tn_type)); 1587 break; 1588 default: 1589 /* combination of '%s' and '%s', op %s */ 1590 warning(242, type_name(ln->tn_type), type_name(rn->tn_type), 1591 op_name(op)); 1592 break; 1593 } 1594 } 1595 1596 /* 1597 * Build and initialize a new node. 1598 */ 1599 static tnode_t * 1600 new_tnode(op_t op, type_t *type, tnode_t *ln, tnode_t *rn) 1601 { 1602 tnode_t *ntn; 1603 tspec_t t; 1604 #ifdef notyet 1605 size_t l; 1606 uint64_t rnum; 1607 #endif 1608 1609 ntn = expr_zalloc_tnode(); 1610 1611 ntn->tn_op = op; 1612 ntn->tn_type = type; 1613 if (ln->tn_from_system_header) 1614 ntn->tn_from_system_header = true; 1615 if (rn != NULL && rn->tn_from_system_header) 1616 ntn->tn_from_system_header = true; 1617 ntn->tn_left = ln; 1618 ntn->tn_right = rn; 1619 1620 switch (op) { 1621 #ifdef notyet 1622 case SHR: 1623 if (rn->tn_op != CON) 1624 break; 1625 rnum = rn->tn_val->v_quad; 1626 l = type_size_in_bits(ln->tn_type) / CHAR_SIZE; 1627 t = ln->tn_type->t_tspec; 1628 switch (l) { 1629 case 8: 1630 if (rnum >= 56) 1631 t = UCHAR; 1632 else if (rnum >= 48) 1633 t = USHORT; 1634 else if (rnum >= 32) 1635 t = UINT; 1636 break; 1637 case 4: 1638 if (rnum >= 24) 1639 t = UCHAR; 1640 else if (rnum >= 16) 1641 t = USHORT; 1642 break; 1643 case 2: 1644 if (rnum >= 8) 1645 t = UCHAR; 1646 break; 1647 default: 1648 break; 1649 } 1650 if (t != ln->tn_type->t_tspec) 1651 ntn->tn_type->t_tspec = t; 1652 break; 1653 #endif 1654 case INDIR: 1655 case FSEL: 1656 lint_assert(ln->tn_type->t_tspec == PTR); 1657 t = ln->tn_type->t_subt->t_tspec; 1658 if (t != FUNC && t != VOID) 1659 ntn->tn_lvalue = true; 1660 break; 1661 default: 1662 break; 1663 } 1664 1665 return ntn; 1666 } 1667 1668 /* 1669 * Performs the "integer promotions" (C99 6.3.1.1p2), which convert small 1670 * integer types to either int or unsigned int. 1671 * 1672 * If tflag is set or the operand is a function argument with no type 1673 * information (no prototype or variable # of args), converts float to double. 1674 */ 1675 tnode_t * 1676 promote(op_t op, bool farg, tnode_t *tn) 1677 { 1678 tspec_t t; 1679 type_t *ntp; 1680 u_int len; 1681 1682 t = tn->tn_type->t_tspec; 1683 1684 if (!is_arithmetic(t)) 1685 return tn; 1686 1687 if (!tflag) { 1688 /* 1689 * C99 6.3.1.1p2 requires for types with lower rank than int 1690 * that "If an int can represent all the values of the 1691 * original type, the value is converted to an int; otherwise 1692 * it is converted to an unsigned int", and that "All other 1693 * types are unchanged by the integer promotions". 1694 */ 1695 if (tn->tn_type->t_bitfield) { 1696 len = tn->tn_type->t_flen; 1697 if (len < size_in_bits(INT)) { 1698 t = INT; 1699 } else if (len == size_in_bits(INT)) { 1700 t = is_uinteger(t) ? UINT : INT; 1701 } 1702 } else if (t == CHAR || t == UCHAR || t == SCHAR) { 1703 t = (size_in_bits(CHAR) < size_in_bits(INT) 1704 || t != UCHAR) ? INT : UINT; 1705 } else if (t == SHORT || t == USHORT) { 1706 t = (size_in_bits(SHORT) < size_in_bits(INT) 1707 || t == SHORT) ? INT : UINT; 1708 } else if (t == ENUM) { 1709 t = INT; 1710 } else if (farg && t == FLOAT) { 1711 t = DOUBLE; 1712 } 1713 } else { 1714 /* 1715 * In traditional C, keep unsigned and promote FLOAT 1716 * to DOUBLE. 1717 */ 1718 if (t == UCHAR || t == USHORT) { 1719 t = UINT; 1720 } else if (t == CHAR || t == SCHAR || t == SHORT) { 1721 t = INT; 1722 } else if (t == FLOAT) { 1723 t = DOUBLE; 1724 } else if (t == ENUM) { 1725 t = INT; 1726 } 1727 } 1728 1729 if (t != tn->tn_type->t_tspec) { 1730 ntp = expr_dup_type(tn->tn_type); 1731 ntp->t_tspec = t; 1732 /* 1733 * Keep t_is_enum so we are later able to check compatibility 1734 * of enum types. 1735 */ 1736 tn = convert(op, 0, ntp, tn); 1737 } 1738 1739 return tn; 1740 } 1741 1742 /* 1743 * Apply the "usual arithmetic conversions" (C99 6.3.1.8). 1744 * 1745 * This gives both operands the same type. 1746 * This is done in different ways for traditional C and C90. 1747 */ 1748 static void 1749 balance(op_t op, tnode_t **lnp, tnode_t **rnp) 1750 { 1751 tspec_t lt, rt, t; 1752 int i; 1753 bool u; 1754 type_t *ntp; 1755 static const tspec_t tl[] = { 1756 LDOUBLE, DOUBLE, FLOAT, UQUAD, QUAD, ULONG, LONG, UINT, INT, 1757 }; 1758 1759 lt = (*lnp)->tn_type->t_tspec; 1760 rt = (*rnp)->tn_type->t_tspec; 1761 1762 if (!is_arithmetic(lt) || !is_arithmetic(rt)) 1763 return; 1764 1765 if (!tflag) { 1766 if (lt == rt) { 1767 t = lt; 1768 } else if (lt == LCOMPLEX || rt == LCOMPLEX) { 1769 t = LCOMPLEX; 1770 } else if (lt == DCOMPLEX || rt == DCOMPLEX) { 1771 t = DCOMPLEX; 1772 } else if (lt == COMPLEX || rt == COMPLEX) { 1773 t = COMPLEX; 1774 } else if (lt == FCOMPLEX || rt == FCOMPLEX) { 1775 t = FCOMPLEX; 1776 } else if (lt == LDOUBLE || rt == LDOUBLE) { 1777 t = LDOUBLE; 1778 } else if (lt == DOUBLE || rt == DOUBLE) { 1779 t = DOUBLE; 1780 } else if (lt == FLOAT || rt == FLOAT) { 1781 t = FLOAT; 1782 } else { 1783 /* 1784 * If type A has more bits than type B it should 1785 * be able to hold all possible values of type B. 1786 */ 1787 if (size_in_bits(lt) > size_in_bits(rt)) { 1788 t = lt; 1789 } else if (size_in_bits(lt) < size_in_bits(rt)) { 1790 t = rt; 1791 } else { 1792 for (i = 3; tl[i] != INT; i++) { 1793 if (tl[i] == lt || tl[i] == rt) 1794 break; 1795 } 1796 if ((is_uinteger(lt) || is_uinteger(rt)) && 1797 !is_uinteger(tl[i])) { 1798 i--; 1799 } 1800 t = tl[i]; 1801 } 1802 } 1803 } else { 1804 /* Keep unsigned in traditional C */ 1805 u = is_uinteger(lt) || is_uinteger(rt); 1806 for (i = 0; tl[i] != INT; i++) { 1807 if (lt == tl[i] || rt == tl[i]) 1808 break; 1809 } 1810 t = tl[i]; 1811 if (u && is_integer(t) && !is_uinteger(t)) 1812 t = unsigned_type(t); 1813 } 1814 1815 if (t != lt) { 1816 ntp = expr_dup_type((*lnp)->tn_type); 1817 ntp->t_tspec = t; 1818 *lnp = convert(op, 0, ntp, *lnp); 1819 } 1820 if (t != rt) { 1821 ntp = expr_dup_type((*rnp)->tn_type); 1822 ntp->t_tspec = t; 1823 *rnp = convert(op, 0, ntp, *rnp); 1824 } 1825 } 1826 1827 /* 1828 * Insert a conversion operator, which converts the type of the node 1829 * to another given type. 1830 * If op is FARG, arg is the number of the argument (used for warnings). 1831 */ 1832 tnode_t * 1833 convert(op_t op, int arg, type_t *tp, tnode_t *tn) 1834 { 1835 tnode_t *ntn; 1836 tspec_t nt, ot; 1837 1838 nt = tp->t_tspec; 1839 ot = tn->tn_type->t_tspec; 1840 1841 if (!tflag && !sflag && op == FARG) 1842 check_prototype_conversion(arg, nt, ot, tp, tn); 1843 if (is_integer(nt) && is_integer(ot)) { 1844 check_integer_conversion(op, arg, nt, ot, tp, tn); 1845 } else if (nt == PTR && is_null_pointer(tn)) { 1846 /* a null pointer may be assigned to any pointer. */ 1847 } else if (is_integer(nt) && nt != BOOL && ot == PTR) { 1848 check_pointer_integer_conversion(op, nt, tp, tn); 1849 } else if (nt == PTR && ot == PTR && op == CVT) { 1850 check_pointer_conversion(tn, tp); 1851 } 1852 1853 ntn = expr_zalloc_tnode(); 1854 ntn->tn_op = CVT; 1855 ntn->tn_type = tp; 1856 ntn->tn_cast = op == CVT; 1857 ntn->tn_from_system_header |= tn->tn_from_system_header; 1858 ntn->tn_right = NULL; 1859 if (tn->tn_op != CON || nt == VOID) { 1860 ntn->tn_left = tn; 1861 } else { 1862 ntn->tn_op = CON; 1863 ntn->tn_val = expr_zalloc(sizeof(*ntn->tn_val)); 1864 convert_constant(op, arg, ntn->tn_type, ntn->tn_val, 1865 tn->tn_val); 1866 } 1867 1868 return ntn; 1869 } 1870 1871 /* 1872 * Print a warning if a prototype causes a type conversion that is 1873 * different from what would happen to the same argument in the 1874 * absence of a prototype. 1875 * 1876 * Errors/warnings about illegal type combinations are already printed 1877 * in check_assign_types_compatible(). 1878 */ 1879 static void 1880 check_prototype_conversion(int arg, tspec_t nt, tspec_t ot, type_t *tp, 1881 tnode_t *tn) 1882 { 1883 tnode_t *ptn; 1884 1885 if (!is_arithmetic(nt) || !is_arithmetic(ot)) 1886 return; 1887 1888 /* 1889 * If the type of the formal parameter is char/short, a warning 1890 * would be useless, because functions declared the old style 1891 * can't expect char/short arguments. 1892 */ 1893 /* XXX: what about SCHAR? */ 1894 if (nt == CHAR || nt == UCHAR || nt == SHORT || nt == USHORT) 1895 return; 1896 1897 /* get default promotion */ 1898 ptn = promote(NOOP, true, tn); 1899 ot = ptn->tn_type->t_tspec; 1900 1901 /* return if types are the same with and without prototype */ 1902 if (nt == ot || (nt == ENUM && ot == INT)) 1903 return; 1904 1905 if (is_floating(nt) != is_floating(ot) || 1906 portable_size_in_bits(nt) != portable_size_in_bits(ot)) { 1907 /* representation and/or width change */ 1908 if (!is_integer(ot) || 1909 portable_size_in_bits(ot) > portable_size_in_bits(INT)) { 1910 /* argument #%d is converted from '%s' to '%s' ... */ 1911 warning(259, 1912 arg, type_name(tn->tn_type), type_name(tp)); 1913 } 1914 } else if (hflag) { 1915 /* 1916 * they differ in sign or base type (char, short, int, 1917 * long, long long, float, double, long double) 1918 * 1919 * if they differ only in sign and the argument is a constant 1920 * and the msb of the argument is not set, print no warning 1921 */ 1922 if (ptn->tn_op == CON && is_integer(nt) && 1923 signed_type(nt) == signed_type(ot) && 1924 msb(ptn->tn_val->v_quad, ot, -1) == 0) { 1925 /* ok */ 1926 } else { 1927 /* argument #%d is converted from '%s' to '%s' ... */ 1928 warning(259, 1929 arg, type_name(tn->tn_type), type_name(tp)); 1930 } 1931 } 1932 } 1933 1934 /* 1935 * Print warnings for conversions of integer types which may cause problems. 1936 */ 1937 /* ARGSUSED */ 1938 static void 1939 check_integer_conversion(op_t op, int arg, tspec_t nt, tspec_t ot, type_t *tp, 1940 tnode_t *tn) 1941 { 1942 char opbuf[16]; 1943 1944 if (tn->tn_op == CON) 1945 return; 1946 1947 if (op == CVT) 1948 return; 1949 1950 if (Sflag && nt == BOOL) 1951 return; /* See C99 6.3.1.2 */ 1952 1953 if (Pflag && portable_size_in_bits(nt) > portable_size_in_bits(ot) && 1954 is_uinteger(nt) != is_uinteger(ot)) { 1955 if (aflag > 0 && pflag) { 1956 if (op == FARG) { 1957 /* conversion to '%s' may sign-extend ... */ 1958 warning(297, type_name(tp), arg); 1959 } else { 1960 /* conversion to '%s' may sign-extend ... */ 1961 warning(131, type_name(tp)); 1962 } 1963 } 1964 } 1965 1966 if (Pflag && portable_size_in_bits(nt) > portable_size_in_bits(ot)) { 1967 switch (tn->tn_op) { 1968 case PLUS: 1969 case MINUS: 1970 case MULT: 1971 case SHL: 1972 /* suggest cast from '%s' to '%s' on op %s to ... */ 1973 warning(324, type_name(gettyp(ot)), type_name(tp), 1974 print_tnode(opbuf, sizeof(opbuf), tn)); 1975 break; 1976 default: 1977 break; 1978 } 1979 } 1980 1981 if (portable_size_in_bits(nt) < portable_size_in_bits(ot) && 1982 (ot == LONG || ot == ULONG || ot == QUAD || ot == UQUAD || 1983 aflag > 1)) { 1984 /* conversion from '%s' may lose accuracy */ 1985 if (aflag > 0) { 1986 if (op == FARG) { 1987 /* conv. from '%s' to '%s' may lose ... */ 1988 warning(298, 1989 type_name(tn->tn_type), type_name(tp), arg); 1990 } else { 1991 /* conv. from '%s' to '%s' may lose accuracy */ 1992 warning(132, 1993 type_name(tn->tn_type), type_name(tp)); 1994 } 1995 } 1996 } 1997 } 1998 1999 /* 2000 * Print warnings for dubious conversions of pointer to integer. 2001 */ 2002 static void 2003 check_pointer_integer_conversion(op_t op, tspec_t nt, type_t *tp, tnode_t *tn) 2004 { 2005 2006 if (tn->tn_op == CON) 2007 return; 2008 if (op != CVT) 2009 return; /* We got already an error. */ 2010 if (portable_size_in_bits(nt) >= portable_size_in_bits(PTR)) 2011 return; 2012 2013 if (pflag && size_in_bits(nt) >= size_in_bits(PTR)) { 2014 /* conversion of pointer to '%s' may lose bits */ 2015 warning(134, type_name(tp)); 2016 } else { 2017 /* conversion of pointer to '%s' loses bits */ 2018 warning(133, type_name(tp)); 2019 } 2020 } 2021 2022 static bool 2023 should_warn_about_pointer_cast(const type_t *nstp, tspec_t nst, 2024 const type_t *ostp, tspec_t ost) 2025 { 2026 /* 2027 * Casting a pointer to 'struct S' to a pointer to another struct that 2028 * has 'struct S' as its first member is ok, see msg_247.c, 'struct 2029 * counter'. 2030 */ 2031 if (nst == STRUCT && ost == STRUCT && 2032 nstp->t_str->sou_first_member != NULL && 2033 nstp->t_str->sou_first_member->s_type == ostp) 2034 return false; 2035 2036 if (is_incomplete(nstp) || is_incomplete(ostp)) 2037 return false; 2038 2039 if ((nst == STRUCT || nst == UNION) && nstp->t_str != ostp->t_str) 2040 return true; 2041 2042 if (nst == CHAR || nst == UCHAR) 2043 return false; /* for the sake of traditional C code */ 2044 2045 return portable_size_in_bits(nst) != portable_size_in_bits(ost); 2046 } 2047 2048 /* 2049 * Warn about questionable pointer conversions. 2050 */ 2051 static void 2052 check_pointer_conversion(tnode_t *tn, type_t *ntp) 2053 { 2054 const type_t *nstp, *otp, *ostp; 2055 tspec_t nst, ost; 2056 const char *nts, *ots; 2057 2058 nstp = ntp->t_subt; 2059 otp = tn->tn_type; 2060 ostp = otp->t_subt; 2061 nst = nstp->t_tspec; 2062 ost = ostp->t_tspec; 2063 2064 if (nst == VOID || ost == VOID) { 2065 if (sflag && (nst == FUNC || ost == FUNC)) { 2066 /* null pointers are already handled in convert() */ 2067 *(nst == FUNC ? &nts : &ots) = "function pointer"; 2068 *(nst == VOID ? &nts : &ots) = "'void *'"; 2069 /* ANSI C forbids conversion of %s to %s */ 2070 warning(303, ots, nts); 2071 } 2072 return; 2073 } else if (nst == FUNC && ost == FUNC) { 2074 return; 2075 } else if (nst == FUNC || ost == FUNC) { 2076 /* converting '%s' to '%s' is questionable */ 2077 warning(229, type_name(otp), type_name(ntp)); 2078 return; 2079 } 2080 2081 if (hflag && alignment_in_bits(nstp) > alignment_in_bits(ostp) && 2082 !is_incomplete(ostp)) { 2083 /* converting '%s' to '%s' may cause alignment problem */ 2084 warning(135, type_name(otp), type_name(ntp)); 2085 } 2086 2087 if (cflag && should_warn_about_pointer_cast(nstp, nst, ostp, ost)) { 2088 /* pointer cast from '%s' to '%s' may be troublesome */ 2089 warning(247, type_name(otp), type_name(ntp)); 2090 } 2091 } 2092 2093 /* 2094 * Converts a typed constant to a constant of another type. 2095 * 2096 * op operator which requires conversion 2097 * arg if op is FARG, # of argument 2098 * tp type in which to convert the constant 2099 * nv new constant 2100 * v old constant 2101 */ 2102 void 2103 convert_constant(op_t op, int arg, const type_t *tp, val_t *nv, val_t *v) 2104 { 2105 tspec_t ot, nt; 2106 ldbl_t max = 0.0, min = 0.0; 2107 int sz; 2108 bool rchk; 2109 int64_t xmask, xmsk1; 2110 int osz, nsz; 2111 2112 /* 2113 * TODO: make 'v' const; the name of this function does not suggest 2114 * that it modifies 'v'. 2115 */ 2116 ot = v->v_tspec; 2117 nt = nv->v_tspec = tp->t_tspec; 2118 rchk = false; 2119 2120 if (nt == BOOL) { /* C99 6.3.1.2 */ 2121 nv->v_ansiu = false; 2122 nv->v_quad = is_nonzero_val(v) ? 1 : 0; 2123 return; 2124 } 2125 2126 if (ot == FLOAT || ot == DOUBLE || ot == LDOUBLE) { 2127 switch (nt) { 2128 case CHAR: 2129 max = TARG_CHAR_MAX; min = TARG_CHAR_MIN; break; 2130 case UCHAR: 2131 max = TARG_UCHAR_MAX; min = 0; break; 2132 case SCHAR: 2133 max = TARG_SCHAR_MAX; min = TARG_SCHAR_MIN; break; 2134 case SHORT: 2135 max = TARG_SHRT_MAX; min = TARG_SHRT_MIN; break; 2136 case USHORT: 2137 max = TARG_USHRT_MAX; min = 0; break; 2138 case ENUM: 2139 case INT: 2140 max = TARG_INT_MAX; min = TARG_INT_MIN; break; 2141 case UINT: 2142 max = (u_int)TARG_UINT_MAX;min = 0; break; 2143 case LONG: 2144 max = TARG_LONG_MAX; min = TARG_LONG_MIN; break; 2145 case ULONG: 2146 max = (u_long)TARG_ULONG_MAX; min = 0; break; 2147 case QUAD: 2148 max = QUAD_MAX; min = QUAD_MIN; break; 2149 case UQUAD: 2150 max = (uint64_t)UQUAD_MAX; min = 0; break; 2151 case FLOAT: 2152 case FCOMPLEX: 2153 max = FLT_MAX; min = -FLT_MAX; break; 2154 case DOUBLE: 2155 case DCOMPLEX: 2156 max = DBL_MAX; min = -DBL_MAX; break; 2157 case PTR: 2158 /* Got already an error because of float --> ptr */ 2159 case LDOUBLE: 2160 case LCOMPLEX: 2161 max = LDBL_MAX; min = -LDBL_MAX; break; 2162 default: 2163 lint_assert(/*CONSTCOND*/false); 2164 } 2165 if (v->v_ldbl > max || v->v_ldbl < min) { 2166 lint_assert(nt != LDOUBLE); 2167 if (op == FARG) { 2168 /* conv. of '%s' to '%s' is out of range, ... */ 2169 warning(295, 2170 type_name(gettyp(ot)), type_name(tp), arg); 2171 } else { 2172 /* conversion of '%s' to '%s' is out of range */ 2173 warning(119, 2174 type_name(gettyp(ot)), type_name(tp)); 2175 } 2176 v->v_ldbl = v->v_ldbl > 0 ? max : min; 2177 } 2178 if (nt == FLOAT) { 2179 nv->v_ldbl = (float)v->v_ldbl; 2180 } else if (nt == DOUBLE) { 2181 nv->v_ldbl = (double)v->v_ldbl; 2182 } else if (nt == LDOUBLE) { 2183 nv->v_ldbl = v->v_ldbl; 2184 } else { 2185 nv->v_quad = (nt == PTR || is_uinteger(nt)) ? 2186 (int64_t)v->v_ldbl : (int64_t)v->v_ldbl; 2187 } 2188 } else { 2189 if (nt == FLOAT) { 2190 nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ? 2191 (float)(uint64_t)v->v_quad : (float)v->v_quad; 2192 } else if (nt == DOUBLE) { 2193 nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ? 2194 (double)(uint64_t)v->v_quad : (double)v->v_quad; 2195 } else if (nt == LDOUBLE) { 2196 nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ? 2197 (ldbl_t)(uint64_t)v->v_quad : (ldbl_t)v->v_quad; 2198 } else { 2199 rchk = true; /* Check for lost precision. */ 2200 nv->v_quad = v->v_quad; 2201 } 2202 } 2203 2204 if (v->v_ansiu && is_floating(nt)) { 2205 /* ANSI C treats constant as unsigned */ 2206 warning(157); 2207 v->v_ansiu = false; 2208 } else if (v->v_ansiu && (is_integer(nt) && !is_uinteger(nt) && 2209 portable_size_in_bits(nt) > 2210 portable_size_in_bits(ot))) { 2211 /* ANSI C treats constant as unsigned */ 2212 warning(157); 2213 v->v_ansiu = false; 2214 } 2215 2216 switch (nt) { 2217 case FLOAT: 2218 case FCOMPLEX: 2219 case DOUBLE: 2220 case DCOMPLEX: 2221 case LDOUBLE: 2222 case LCOMPLEX: 2223 break; 2224 default: 2225 sz = tp->t_bitfield ? tp->t_flen : size_in_bits(nt); 2226 nv->v_quad = xsign(nv->v_quad, nt, sz); 2227 break; 2228 } 2229 2230 if (rchk && op != CVT) { 2231 osz = size_in_bits(ot); 2232 nsz = tp->t_bitfield ? tp->t_flen : size_in_bits(nt); 2233 xmask = qlmasks[nsz] ^ qlmasks[osz]; 2234 xmsk1 = qlmasks[nsz] ^ qlmasks[osz - 1]; 2235 /* 2236 * For bitwise operations we are not interested in the 2237 * value, but in the bits itself. 2238 */ 2239 if (op == ORASS || op == BITOR || op == BITXOR) { 2240 /* 2241 * Print a warning if bits which were set are 2242 * lost due to the conversion. 2243 * This can happen with operator ORASS only. 2244 */ 2245 if (nsz < osz && (v->v_quad & xmask) != 0) { 2246 /* constant truncated by conv., op %s */ 2247 warning(306, op_name(op)); 2248 } 2249 } else if (op == ANDASS || op == BITAND) { 2250 /* 2251 * Print a warning if additional bits are not all 1 2252 * and the most significant bit of the old value is 1, 2253 * or if at least one (but not all) removed bit was 0. 2254 */ 2255 if (nsz > osz && 2256 (nv->v_quad & qbmasks[osz - 1]) != 0 && 2257 (nv->v_quad & xmask) != xmask) { 2258 /* extra bits set to 0 in conv. of '%s' ... */ 2259 warning(309, type_name(gettyp(ot)), 2260 type_name(tp), op_name(op)); 2261 } else if (nsz < osz && 2262 (v->v_quad & xmask) != xmask && 2263 (v->v_quad & xmask) != 0) { 2264 /* constant truncated by conv., op %s */ 2265 warning(306, op_name(op)); 2266 } 2267 } else if ((nt != PTR && is_uinteger(nt)) && 2268 (ot != PTR && !is_uinteger(ot)) && 2269 v->v_quad < 0) { 2270 if (op == ASSIGN) { 2271 /* assignment of negative constant to ... */ 2272 warning(164); 2273 } else if (op == INIT) { 2274 /* initialization of unsigned with neg... */ 2275 warning(221); 2276 } else if (op == FARG) { 2277 /* conversion of negative constant to ... */ 2278 warning(296, arg); 2279 } else if (modtab[op].m_comparison) { 2280 /* handled by check_integer_comparison() */ 2281 } else { 2282 /* conversion of negative constant to ... */ 2283 warning(222); 2284 } 2285 } else if (nv->v_quad != v->v_quad && nsz <= osz && 2286 (v->v_quad & xmask) != 0 && 2287 (is_uinteger(ot) || (v->v_quad & xmsk1) != xmsk1)) { 2288 /* 2289 * Loss of significant bit(s). All truncated bits 2290 * of unsigned types or all truncated bits plus the 2291 * msb of the target for signed types are considered 2292 * to be significant bits. Loss of significant bits 2293 * means that at least on of the bits was set in an 2294 * unsigned type or that at least one, but not all of 2295 * the bits was set in an signed type. 2296 * Loss of significant bits means that it is not 2297 * possible, also not with necessary casts, to convert 2298 * back to the original type. A example for a 2299 * necessary cast is: 2300 * char c; int i; c = 128; 2301 * i = c; ** yields -128 ** 2302 * i = (unsigned char)c; ** yields 128 ** 2303 */ 2304 if (op == ASSIGN && tp->t_bitfield) { 2305 /* precision lost in bit-field assignment */ 2306 warning(166); 2307 } else if (op == ASSIGN) { 2308 /* constant truncated by assignment */ 2309 warning(165); 2310 } else if (op == INIT && tp->t_bitfield) { 2311 /* bit-field initializer does not fit */ 2312 warning(180); 2313 } else if (op == INIT) { 2314 /* initializer does not fit */ 2315 warning(178); 2316 } else if (op == CASE) { 2317 /* case label affected by conversion */ 2318 warning(196); 2319 } else if (op == FARG) { 2320 /* conv. of '%s' to '%s' is out of range, ... */ 2321 warning(295, 2322 type_name(gettyp(ot)), type_name(tp), arg); 2323 } else { 2324 /* conversion of '%s' to '%s' is out of range */ 2325 warning(119, 2326 type_name(gettyp(ot)), type_name(tp)); 2327 } 2328 } else if (nv->v_quad != v->v_quad) { 2329 if (op == ASSIGN && tp->t_bitfield) { 2330 /* precision lost in bit-field assignment */ 2331 warning(166); 2332 } else if (op == INIT && tp->t_bitfield) { 2333 /* bit-field initializer out of range */ 2334 warning(11); 2335 } else if (op == CASE) { 2336 /* case label affected by conversion */ 2337 warning(196); 2338 } else if (op == FARG) { 2339 /* conv. of '%s' to '%s' is out of range, ... */ 2340 warning(295, 2341 type_name(gettyp(ot)), type_name(tp), arg); 2342 } else { 2343 /* conversion of '%s' to '%s' is out of range */ 2344 warning(119, 2345 type_name(gettyp(ot)), type_name(tp)); 2346 } 2347 } 2348 } 2349 } 2350 2351 /* 2352 * Called if incompatible types were detected. 2353 * Prints a appropriate warning. 2354 */ 2355 static void 2356 warn_incompatible_types(op_t op, 2357 const type_t *ltp, tspec_t lt, 2358 const type_t *rtp, tspec_t rt) 2359 { 2360 const mod_t *mp; 2361 2362 mp = &modtab[op]; 2363 2364 if (lt == VOID || (mp->m_binary && rt == VOID)) { 2365 /* void type illegal in expression */ 2366 error(109); 2367 } else if (op == ASSIGN) { 2368 if ((lt == STRUCT || lt == UNION) && 2369 (rt == STRUCT || rt == UNION)) { 2370 /* assignment of different structures (%s != %s) */ 2371 error(240, tspec_name(lt), tspec_name(rt)); 2372 } else { 2373 /* cannot assign to '%s' from '%s' */ 2374 error(171, type_name(ltp), type_name(rtp)); 2375 } 2376 } else if (mp->m_binary) { 2377 /* operands of '%s' have incompatible types (%s != %s) */ 2378 error(107, mp->m_name, tspec_name(lt), tspec_name(rt)); 2379 } else { 2380 lint_assert(rt == NOTSPEC); 2381 /* operand of '%s' has invalid type (%s) */ 2382 error(108, mp->m_name, tspec_name(lt)); 2383 } 2384 } 2385 2386 /* 2387 * Called if incompatible pointer types are detected. 2388 * Print an appropriate warning. 2389 */ 2390 static void 2391 warn_incompatible_pointers(const mod_t *mp, 2392 const type_t *ltp, const type_t *rtp) 2393 { 2394 tspec_t lt, rt; 2395 2396 lint_assert(ltp->t_tspec == PTR); 2397 lint_assert(rtp->t_tspec == PTR); 2398 2399 lt = ltp->t_subt->t_tspec; 2400 rt = rtp->t_subt->t_tspec; 2401 2402 if ((lt == STRUCT || lt == UNION) && (rt == STRUCT || rt == UNION)) { 2403 if (mp == NULL) { 2404 /* illegal structure pointer combination */ 2405 warning(244); 2406 } else { 2407 /* incompatible structure pointers: '%s' '%s' '%s' */ 2408 warning(245, type_name(ltp), mp->m_name, type_name(rtp)); 2409 } 2410 } else { 2411 if (mp == NULL) { 2412 /* illegal pointer combination */ 2413 warning(184); 2414 } else { 2415 /* illegal pointer combination (%s) and (%s), op %s */ 2416 warning(124, 2417 type_name(ltp), type_name(rtp), mp->m_name); 2418 } 2419 } 2420 } 2421 2422 /* Return a type based on tp1, with added qualifiers from tp2. */ 2423 static type_t * 2424 merge_qualifiers(type_t *tp1, const type_t *tp2) 2425 { 2426 type_t *ntp, *nstp; 2427 2428 lint_assert(tp1->t_tspec == PTR); 2429 lint_assert(tp2->t_tspec == PTR); 2430 2431 bool c1 = tp1->t_subt->t_const; 2432 bool c2 = tp2->t_subt->t_const; 2433 bool v1 = tp1->t_subt->t_volatile; 2434 bool v2 = tp2->t_subt->t_volatile; 2435 2436 if (c1 == (c1 | c2) && v1 == (v1 | v2)) 2437 return tp1; 2438 2439 nstp = expr_dup_type(tp1->t_subt); 2440 nstp->t_const |= c2; 2441 nstp->t_volatile |= v2; 2442 2443 ntp = expr_dup_type(tp1); 2444 ntp->t_subt = nstp; 2445 return ntp; 2446 } 2447 2448 /* 2449 * Returns true if the given structure or union has a constant member 2450 * (maybe recursively). 2451 */ 2452 static bool 2453 has_constant_member(const type_t *tp) 2454 { 2455 sym_t *m; 2456 tspec_t t; 2457 2458 lint_assert((t = tp->t_tspec) == STRUCT || t == UNION); 2459 2460 for (m = tp->t_str->sou_first_member; m != NULL; m = m->s_next) { 2461 tp = m->s_type; 2462 if (tp->t_const) 2463 return true; 2464 if ((t = tp->t_tspec) == STRUCT || t == UNION) { 2465 if (has_constant_member(m->s_type)) 2466 return true; 2467 } 2468 } 2469 return false; 2470 } 2471 2472 /* 2473 * Create a new node for one of the operators POINT and ARROW. 2474 */ 2475 static tnode_t * 2476 build_struct_access(op_t op, tnode_t *ln, tnode_t *rn) 2477 { 2478 tnode_t *ntn, *ctn; 2479 bool nolval; 2480 2481 lint_assert(rn->tn_op == NAME); 2482 lint_assert(rn->tn_sym->s_value.v_tspec == INT); 2483 lint_assert(rn->tn_sym->s_scl == MOS || rn->tn_sym->s_scl == MOU); 2484 2485 /* 2486 * Remember if the left operand is an lvalue (structure members 2487 * are lvalues if and only if the structure itself is an lvalue). 2488 */ 2489 nolval = op == POINT && !ln->tn_lvalue; 2490 2491 if (op == POINT) { 2492 ln = build_address(ln, true); 2493 } else if (ln->tn_type->t_tspec != PTR) { 2494 lint_assert(tflag); 2495 lint_assert(is_integer(ln->tn_type->t_tspec)); 2496 ln = convert(NOOP, 0, expr_derive_type(gettyp(VOID), PTR), ln); 2497 } 2498 2499 ctn = expr_new_integer_constant(PTRDIFF_TSPEC, 2500 rn->tn_sym->s_value.v_quad / CHAR_SIZE); 2501 2502 ntn = new_tnode(PLUS, expr_derive_type(rn->tn_type, PTR), ln, ctn); 2503 if (ln->tn_op == CON) 2504 ntn = fold(ntn); 2505 2506 if (rn->tn_type->t_bitfield) { 2507 ntn = new_tnode(FSEL, ntn->tn_type->t_subt, ntn, NULL); 2508 } else { 2509 ntn = new_tnode(INDIR, ntn->tn_type->t_subt, ntn, NULL); 2510 } 2511 2512 if (nolval) 2513 ntn->tn_lvalue = false; 2514 2515 return ntn; 2516 } 2517 2518 /* 2519 * Create a node for INCAFT, INCBEF, DECAFT and DECBEF. 2520 */ 2521 static tnode_t * 2522 build_prepost_incdec(op_t op, tnode_t *ln) 2523 { 2524 tnode_t *cn, *ntn; 2525 2526 lint_assert(ln != NULL); 2527 2528 if (ln->tn_type->t_tspec == PTR) { 2529 cn = plength(ln->tn_type); 2530 } else { 2531 cn = expr_new_integer_constant(INT, (int64_t)1); 2532 } 2533 ntn = new_tnode(op, ln->tn_type, ln, cn); 2534 2535 return ntn; 2536 } 2537 2538 /* 2539 * Create a node for REAL, IMAG 2540 */ 2541 static tnode_t * 2542 build_real_imag(op_t op, tnode_t *ln) 2543 { 2544 tnode_t *cn, *ntn; 2545 2546 lint_assert(ln != NULL); 2547 2548 if (ln->tn_op == NAME) { 2549 /* 2550 * This may be too much, but it avoids wrong warnings. 2551 * See d_c99_complex_split.c. 2552 */ 2553 mark_as_used(ln->tn_sym, false, false); 2554 mark_as_set(ln->tn_sym); 2555 } 2556 2557 switch (ln->tn_type->t_tspec) { 2558 case LCOMPLEX: 2559 /* XXX: integer and LDOUBLE don't match. */ 2560 cn = expr_new_integer_constant(LDOUBLE, (int64_t)1); 2561 break; 2562 case DCOMPLEX: 2563 /* XXX: integer and DOUBLE don't match. */ 2564 cn = expr_new_integer_constant(DOUBLE, (int64_t)1); 2565 break; 2566 case FCOMPLEX: 2567 /* XXX: integer and FLOAT don't match. */ 2568 cn = expr_new_integer_constant(FLOAT, (int64_t)1); 2569 break; 2570 default: 2571 /* __%s__ is illegal for type %s */ 2572 error(276, op == REAL ? "real" : "imag", 2573 type_name(ln->tn_type)); 2574 return NULL; 2575 } 2576 ntn = new_tnode(op, cn->tn_type, ln, cn); 2577 ntn->tn_lvalue = true; 2578 2579 return ntn; 2580 } 2581 /* 2582 * Create a tree node for the unary & operator 2583 */ 2584 static tnode_t * 2585 build_address(tnode_t *tn, bool noign) 2586 { 2587 tspec_t t; 2588 2589 if (!noign && ((t = tn->tn_type->t_tspec) == ARRAY || t == FUNC)) { 2590 if (tflag) 2591 /* '&' before array or function: ignored */ 2592 warning(127); 2593 return tn; 2594 } 2595 2596 /* eliminate &* */ 2597 if (tn->tn_op == INDIR && 2598 tn->tn_left->tn_type->t_tspec == PTR && 2599 tn->tn_left->tn_type->t_subt == tn->tn_type) { 2600 return tn->tn_left; 2601 } 2602 2603 return new_tnode(ADDR, expr_derive_type(tn->tn_type, PTR), tn, NULL); 2604 } 2605 2606 /* 2607 * Create a node for operators PLUS and MINUS. 2608 */ 2609 static tnode_t * 2610 build_plus_minus(op_t op, tnode_t *ln, tnode_t *rn) 2611 { 2612 tnode_t *ntn, *ctn; 2613 type_t *tp; 2614 2615 /* If pointer and integer, then pointer to the lhs. */ 2616 if (rn->tn_type->t_tspec == PTR && is_integer(ln->tn_type->t_tspec)) { 2617 ntn = ln; 2618 ln = rn; 2619 rn = ntn; 2620 } 2621 2622 if (ln->tn_type->t_tspec == PTR && rn->tn_type->t_tspec != PTR) { 2623 2624 /* XXX: this assertion should be easy to trigger */ 2625 lint_assert(is_integer(rn->tn_type->t_tspec)); 2626 2627 check_ctype_macro_invocation(ln, rn); 2628 2629 ctn = plength(ln->tn_type); 2630 if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec) 2631 rn = convert(NOOP, 0, ctn->tn_type, rn); 2632 rn = new_tnode(MULT, rn->tn_type, rn, ctn); 2633 if (rn->tn_left->tn_op == CON) 2634 rn = fold(rn); 2635 ntn = new_tnode(op, ln->tn_type, ln, rn); 2636 2637 } else if (rn->tn_type->t_tspec == PTR) { 2638 2639 lint_assert(ln->tn_type->t_tspec == PTR); 2640 lint_assert(op == MINUS); 2641 tp = gettyp(PTRDIFF_TSPEC); 2642 ntn = new_tnode(op, tp, ln, rn); 2643 if (ln->tn_op == CON && rn->tn_op == CON) 2644 ntn = fold(ntn); 2645 ctn = plength(ln->tn_type); 2646 balance(NOOP, &ntn, &ctn); 2647 ntn = new_tnode(DIV, tp, ntn, ctn); 2648 2649 } else { 2650 2651 ntn = new_tnode(op, ln->tn_type, ln, rn); 2652 2653 } 2654 return ntn; 2655 } 2656 2657 /* 2658 * Create a node for operators SHL and SHR. 2659 */ 2660 static tnode_t * 2661 build_bit_shift(op_t op, tnode_t *ln, tnode_t *rn) 2662 { 2663 tspec_t t; 2664 tnode_t *ntn; 2665 2666 if ((t = rn->tn_type->t_tspec) != INT && t != UINT) 2667 rn = convert(CVT, 0, gettyp(INT), rn); 2668 ntn = new_tnode(op, ln->tn_type, ln, rn); 2669 return ntn; 2670 } 2671 2672 /* 2673 * Create a node for COLON. 2674 */ 2675 static tnode_t * 2676 build_colon(tnode_t *ln, tnode_t *rn) 2677 { 2678 tspec_t lt, rt, pdt; 2679 type_t *tp; 2680 tnode_t *ntn; 2681 2682 lt = ln->tn_type->t_tspec; 2683 rt = rn->tn_type->t_tspec; 2684 pdt = PTRDIFF_TSPEC; 2685 2686 /* 2687 * Arithmetic types are balanced, all other type combinations 2688 * still need to be handled. 2689 */ 2690 if (is_arithmetic(lt) && is_arithmetic(rt)) { 2691 tp = ln->tn_type; 2692 } else if (lt == BOOL && rt == BOOL) { 2693 tp = ln->tn_type; 2694 } else if (lt == VOID || rt == VOID) { 2695 tp = gettyp(VOID); 2696 } else if (lt == STRUCT || lt == UNION) { 2697 /* Both types must be identical. */ 2698 lint_assert(rt == STRUCT || rt == UNION); 2699 lint_assert(ln->tn_type->t_str == rn->tn_type->t_str); 2700 if (is_incomplete(ln->tn_type)) { 2701 /* unknown operand size, op %s */ 2702 error(138, op_name(COLON)); 2703 return NULL; 2704 } 2705 tp = ln->tn_type; 2706 } else if (lt == PTR && is_integer(rt)) { 2707 if (rt != pdt) { 2708 rn = convert(NOOP, 0, gettyp(pdt), rn); 2709 rt = pdt; 2710 } 2711 tp = ln->tn_type; 2712 } else if (rt == PTR && is_integer(lt)) { 2713 if (lt != pdt) { 2714 ln = convert(NOOP, 0, gettyp(pdt), ln); 2715 lt = pdt; 2716 } 2717 tp = rn->tn_type; 2718 } else if (lt == PTR && ln->tn_type->t_subt->t_tspec == VOID) { 2719 tp = merge_qualifiers(rn->tn_type, ln->tn_type); 2720 } else if (rt == PTR && rn->tn_type->t_subt->t_tspec == VOID) { 2721 tp = merge_qualifiers(ln->tn_type, rn->tn_type); 2722 } else { 2723 /* 2724 * XXX For now we simply take the left type. This is 2725 * probably wrong, if one type contains a function prototype 2726 * and the other one, at the same place, only an old style 2727 * declaration. 2728 */ 2729 tp = merge_qualifiers(ln->tn_type, rn->tn_type); 2730 } 2731 2732 ntn = new_tnode(COLON, tp, ln, rn); 2733 2734 return ntn; 2735 } 2736 2737 /* 2738 * Create a node for an assignment operator (both = and op= ). 2739 */ 2740 static tnode_t * 2741 build_assignment(op_t op, tnode_t *ln, tnode_t *rn) 2742 { 2743 tspec_t lt, rt; 2744 tnode_t *ntn, *ctn; 2745 2746 lint_assert(ln != NULL); 2747 lint_assert(rn != NULL); 2748 2749 lt = ln->tn_type->t_tspec; 2750 rt = rn->tn_type->t_tspec; 2751 2752 if ((op == ADDASS || op == SUBASS) && lt == PTR) { 2753 lint_assert(is_integer(rt)); 2754 ctn = plength(ln->tn_type); 2755 if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec) 2756 rn = convert(NOOP, 0, ctn->tn_type, rn); 2757 rn = new_tnode(MULT, rn->tn_type, rn, ctn); 2758 if (rn->tn_left->tn_op == CON) 2759 rn = fold(rn); 2760 } 2761 2762 if ((op == ASSIGN || op == RETURN) && (lt == STRUCT || rt == STRUCT)) { 2763 lint_assert(lt == rt); 2764 lint_assert(ln->tn_type->t_str == rn->tn_type->t_str); 2765 if (is_incomplete(ln->tn_type)) { 2766 if (op == RETURN) { 2767 /* cannot return incomplete type */ 2768 error(212); 2769 } else { 2770 /* unknown operand size, op %s */ 2771 error(138, op_name(op)); 2772 } 2773 return NULL; 2774 } 2775 } 2776 2777 if (op == SHLASS) { 2778 if (portable_size_in_bits(lt) < portable_size_in_bits(rt)) { 2779 if (hflag) 2780 /* semantics of '%s' change in ANSI C; ... */ 2781 warning(118, "<<="); 2782 } 2783 } else if (op != SHRASS) { 2784 if (op == ASSIGN || lt != PTR) { 2785 if (lt != rt || 2786 (ln->tn_type->t_bitfield && rn->tn_op == CON)) { 2787 rn = convert(op, 0, ln->tn_type, rn); 2788 rt = lt; 2789 } 2790 } 2791 } 2792 2793 ntn = new_tnode(op, ln->tn_type, ln, rn); 2794 2795 return ntn; 2796 } 2797 2798 /* 2799 * Get length of type tp->t_subt. 2800 */ 2801 static tnode_t * 2802 plength(type_t *tp) 2803 { 2804 int elem, elsz; 2805 2806 lint_assert(tp->t_tspec == PTR); 2807 tp = tp->t_subt; 2808 2809 elem = 1; 2810 elsz = 0; 2811 2812 while (tp->t_tspec == ARRAY) { 2813 elem *= tp->t_dim; 2814 tp = tp->t_subt; 2815 } 2816 2817 switch (tp->t_tspec) { 2818 case FUNC: 2819 /* pointer to function is not allowed here */ 2820 error(110); 2821 break; 2822 case VOID: 2823 /* cannot do pointer arithmetic on operand of unknown size */ 2824 gnuism(136); 2825 break; 2826 case STRUCT: 2827 case UNION: 2828 if ((elsz = tp->t_str->sou_size_in_bits) == 0) 2829 /* cannot do pointer arithmetic on operand of ... */ 2830 error(136); 2831 break; 2832 case ENUM: 2833 if (is_incomplete(tp)) { 2834 /* cannot do pointer arithmetic on operand of ... */ 2835 warning(136); 2836 } 2837 /* FALLTHROUGH */ 2838 default: 2839 if ((elsz = size_in_bits(tp->t_tspec)) == 0) { 2840 /* cannot do pointer arithmetic on operand of ... */ 2841 error(136); 2842 } else { 2843 lint_assert(elsz != -1); 2844 } 2845 break; 2846 } 2847 2848 if (elem == 0 && elsz != 0) { 2849 /* cannot do pointer arithmetic on operand of unknown size */ 2850 error(136); 2851 } 2852 2853 if (elsz == 0) 2854 elsz = CHAR_SIZE; 2855 2856 return expr_new_integer_constant(PTRDIFF_TSPEC, 2857 (int64_t)(elem * elsz / CHAR_SIZE)); 2858 } 2859 2860 /* 2861 * XXX 2862 * Note: There appear to be a number of bugs in detecting overflow in 2863 * this function. An audit and a set of proper regression tests are needed. 2864 * --Perry Metzger, Nov. 16, 2001 2865 */ 2866 /* 2867 * Do only as much as necessary to compute constant expressions. 2868 * Called only if the operator allows folding and all operands are constants. 2869 */ 2870 static tnode_t * 2871 fold(tnode_t *tn) 2872 { 2873 val_t *v; 2874 tspec_t t; 2875 bool utyp, ovfl; 2876 int64_t sl, sr = 0, q = 0, mask; 2877 uint64_t ul, ur = 0; 2878 tnode_t *cn; 2879 2880 v = xcalloc(1, sizeof(*v)); 2881 v->v_tspec = t = tn->tn_type->t_tspec; 2882 2883 utyp = t == PTR || is_uinteger(t); 2884 ul = sl = tn->tn_left->tn_val->v_quad; 2885 if (modtab[tn->tn_op].m_binary) 2886 ur = sr = tn->tn_right->tn_val->v_quad; 2887 2888 mask = qlmasks[size_in_bits(t)]; 2889 ovfl = false; 2890 2891 switch (tn->tn_op) { 2892 case UPLUS: 2893 q = sl; 2894 break; 2895 case UMINUS: 2896 q = -sl; 2897 if (sl != 0 && msb(q, t, -1) == msb(sl, t, -1)) 2898 ovfl = true; 2899 break; 2900 case COMPL: 2901 q = ~sl; 2902 break; 2903 case MULT: 2904 if (utyp) { 2905 q = ul * ur; 2906 if (q != (q & mask)) 2907 ovfl = true; 2908 else if ((ul != 0) && ((q / ul) != ur)) 2909 ovfl = true; 2910 } else { 2911 q = sl * sr; 2912 if (msb(q, t, -1) != (msb(sl, t, -1) ^ msb(sr, t, -1))) 2913 ovfl = true; 2914 } 2915 break; 2916 case DIV: 2917 if (sr == 0) { 2918 /* division by 0 */ 2919 error(139); 2920 q = utyp ? UQUAD_MAX : QUAD_MAX; 2921 } else { 2922 q = utyp ? (int64_t)(ul / ur) : sl / sr; 2923 } 2924 break; 2925 case MOD: 2926 if (sr == 0) { 2927 /* modulus by 0 */ 2928 error(140); 2929 q = 0; 2930 } else { 2931 q = utyp ? (int64_t)(ul % ur) : sl % sr; 2932 } 2933 break; 2934 case PLUS: 2935 q = utyp ? (int64_t)(ul + ur) : sl + sr; 2936 if (msb(sl, t, -1) != 0 && msb(sr, t, -1) != 0) { 2937 if (msb(q, t, -1) == 0) 2938 ovfl = true; 2939 } else if (msb(sl, t, -1) == 0 && msb(sr, t, -1) == 0) { 2940 if (msb(q, t, -1) != 0) 2941 ovfl = true; 2942 } 2943 break; 2944 case MINUS: 2945 q = utyp ? (int64_t)(ul - ur) : sl - sr; 2946 if (msb(sl, t, -1) != 0 && msb(sr, t, -1) == 0) { 2947 if (msb(q, t, -1) == 0) 2948 ovfl = true; 2949 } else if (msb(sl, t, -1) == 0 && msb(sr, t, -1) != 0) { 2950 if (msb(q, t, -1) != 0) 2951 ovfl = true; 2952 } 2953 break; 2954 case SHL: 2955 q = utyp ? (int64_t)(ul << sr) : sl << sr; 2956 break; 2957 case SHR: 2958 /* 2959 * The sign must be explicitly extended because 2960 * shifts of signed values are implementation dependent. 2961 */ 2962 q = ul >> sr; 2963 q = xsign(q, t, size_in_bits(t) - (int)sr); 2964 break; 2965 case LT: 2966 q = (utyp ? ul < ur : sl < sr) ? 1 : 0; 2967 break; 2968 case LE: 2969 q = (utyp ? ul <= ur : sl <= sr) ? 1 : 0; 2970 break; 2971 case GE: 2972 q = (utyp ? ul >= ur : sl >= sr) ? 1 : 0; 2973 break; 2974 case GT: 2975 q = (utyp ? ul > ur : sl > sr) ? 1 : 0; 2976 break; 2977 case EQ: 2978 q = (utyp ? ul == ur : sl == sr) ? 1 : 0; 2979 break; 2980 case NE: 2981 q = (utyp ? ul != ur : sl != sr) ? 1 : 0; 2982 break; 2983 case BITAND: 2984 q = utyp ? (int64_t)(ul & ur) : sl & sr; 2985 break; 2986 case BITXOR: 2987 q = utyp ? (int64_t)(ul ^ ur) : sl ^ sr; 2988 break; 2989 case BITOR: 2990 q = utyp ? (int64_t)(ul | ur) : sl | sr; 2991 break; 2992 default: 2993 lint_assert(/*CONSTCOND*/false); 2994 } 2995 2996 /* XXX does not work for quads. */ 2997 if (ovfl || ((uint64_t)(q | mask) != ~(uint64_t)0 && 2998 (q & ~mask) != 0)) { 2999 if (hflag) 3000 /* integer overflow detected, op %s */ 3001 warning(141, op_name(tn->tn_op)); 3002 } 3003 3004 v->v_quad = xsign(q, t, -1); 3005 3006 cn = expr_new_constant(tn->tn_type, v); 3007 if (tn->tn_left->tn_system_dependent) 3008 cn->tn_system_dependent = true; 3009 if (modtab[tn->tn_op].m_binary && tn->tn_right->tn_system_dependent) 3010 cn->tn_system_dependent = true; 3011 3012 return cn; 3013 } 3014 3015 /* 3016 * Fold constant nodes, as much as is needed for comparing the value with 0 3017 * (test context, for controlling expressions). 3018 */ 3019 static tnode_t * 3020 fold_test(tnode_t *tn) 3021 { 3022 bool l, r; 3023 val_t *v; 3024 3025 v = xcalloc(1, sizeof(*v)); 3026 v->v_tspec = tn->tn_type->t_tspec; 3027 lint_assert(v->v_tspec == INT || (Tflag && v->v_tspec == BOOL)); 3028 3029 l = constant_is_nonzero(tn->tn_left); 3030 r = modtab[tn->tn_op].m_binary && constant_is_nonzero(tn->tn_right); 3031 3032 switch (tn->tn_op) { 3033 case NOT: 3034 if (hflag && !constcond_flag) 3035 /* constant argument to '!' */ 3036 warning(239); 3037 v->v_quad = !l ? 1 : 0; 3038 break; 3039 case LOGAND: 3040 v->v_quad = l && r ? 1 : 0; 3041 break; 3042 case LOGOR: 3043 v->v_quad = l || r ? 1 : 0; 3044 break; 3045 default: 3046 lint_assert(/*CONSTCOND*/false); 3047 } 3048 3049 return expr_new_constant(tn->tn_type, v); 3050 } 3051 3052 /* 3053 * Fold constant nodes having operands with floating point type. 3054 */ 3055 static tnode_t * 3056 fold_float(tnode_t *tn) 3057 { 3058 val_t *v; 3059 tspec_t t; 3060 ldbl_t l, r = 0; 3061 3062 fpe = 0; 3063 v = xcalloc(1, sizeof(*v)); 3064 v->v_tspec = t = tn->tn_type->t_tspec; 3065 3066 lint_assert(is_floating(t)); 3067 lint_assert(t == tn->tn_left->tn_type->t_tspec); 3068 lint_assert(!modtab[tn->tn_op].m_binary || 3069 t == tn->tn_right->tn_type->t_tspec); 3070 3071 l = tn->tn_left->tn_val->v_ldbl; 3072 if (modtab[tn->tn_op].m_binary) 3073 r = tn->tn_right->tn_val->v_ldbl; 3074 3075 switch (tn->tn_op) { 3076 case UPLUS: 3077 v->v_ldbl = l; 3078 break; 3079 case UMINUS: 3080 v->v_ldbl = -l; 3081 break; 3082 case MULT: 3083 v->v_ldbl = l * r; 3084 break; 3085 case DIV: 3086 if (r == 0.0) { 3087 /* division by 0 */ 3088 error(139); 3089 if (t == FLOAT) { 3090 v->v_ldbl = l < 0 ? -FLT_MAX : FLT_MAX; 3091 } else if (t == DOUBLE) { 3092 v->v_ldbl = l < 0 ? -DBL_MAX : DBL_MAX; 3093 } else { 3094 v->v_ldbl = l < 0 ? -LDBL_MAX : LDBL_MAX; 3095 } 3096 } else { 3097 v->v_ldbl = l / r; 3098 } 3099 break; 3100 case PLUS: 3101 v->v_ldbl = l + r; 3102 break; 3103 case MINUS: 3104 v->v_ldbl = l - r; 3105 break; 3106 case LT: 3107 v->v_quad = l < r ? 1 : 0; 3108 break; 3109 case LE: 3110 v->v_quad = l <= r ? 1 : 0; 3111 break; 3112 case GE: 3113 v->v_quad = l >= r ? 1 : 0; 3114 break; 3115 case GT: 3116 v->v_quad = l > r ? 1 : 0; 3117 break; 3118 case EQ: 3119 v->v_quad = l == r ? 1 : 0; 3120 break; 3121 case NE: 3122 v->v_quad = l != r ? 1 : 0; 3123 break; 3124 default: 3125 lint_assert(/*CONSTCOND*/false); 3126 } 3127 3128 lint_assert(fpe != 0 || isnan((double)v->v_ldbl) == 0); 3129 if (fpe != 0 || finite((double)v->v_ldbl) == 0 || 3130 (t == FLOAT && 3131 (v->v_ldbl > FLT_MAX || v->v_ldbl < -FLT_MAX)) || 3132 (t == DOUBLE && 3133 (v->v_ldbl > DBL_MAX || v->v_ldbl < -DBL_MAX))) { 3134 /* floating point overflow detected, op %s */ 3135 warning(142, op_name(tn->tn_op)); 3136 if (t == FLOAT) { 3137 v->v_ldbl = v->v_ldbl < 0 ? -FLT_MAX : FLT_MAX; 3138 } else if (t == DOUBLE) { 3139 v->v_ldbl = v->v_ldbl < 0 ? -DBL_MAX : DBL_MAX; 3140 } else { 3141 v->v_ldbl = v->v_ldbl < 0 ? -LDBL_MAX: LDBL_MAX; 3142 } 3143 fpe = 0; 3144 } 3145 3146 return expr_new_constant(tn->tn_type, v); 3147 } 3148 3149 3150 /* 3151 * Create a constant node for sizeof. 3152 */ 3153 tnode_t * 3154 build_sizeof(const type_t *tp) 3155 { 3156 int64_t size_in_bytes = type_size_in_bits(tp) / CHAR_SIZE; 3157 tnode_t *tn = expr_new_integer_constant(SIZEOF_TSPEC, size_in_bytes); 3158 tn->tn_system_dependent = true; 3159 return tn; 3160 } 3161 3162 /* 3163 * Create a constant node for offsetof. 3164 */ 3165 tnode_t * 3166 build_offsetof(const type_t *tp, const sym_t *sym) 3167 { 3168 tspec_t t = tp->t_tspec; 3169 if (t != STRUCT && t != UNION) 3170 /* unacceptable operand of '%s' */ 3171 error(111, "offsetof"); 3172 3173 // XXX: wrong size, no checking for sym fixme 3174 int64_t offset_in_bytes = type_size_in_bits(tp) / CHAR_SIZE; 3175 tnode_t *tn = expr_new_integer_constant(SIZEOF_TSPEC, offset_in_bytes); 3176 tn->tn_system_dependent = true; 3177 return tn; 3178 } 3179 3180 int64_t 3181 type_size_in_bits(const type_t *tp) 3182 { 3183 int elem, elsz; 3184 bool flex; 3185 3186 elem = 1; 3187 flex = false; 3188 while (tp->t_tspec == ARRAY) { 3189 flex = true; /* allow c99 flex arrays [] [0] */ 3190 elem *= tp->t_dim; 3191 tp = tp->t_subt; 3192 } 3193 if (elem == 0) { 3194 if (!flex) { 3195 /* cannot take size/alignment of incomplete type */ 3196 error(143); 3197 elem = 1; 3198 } 3199 } 3200 switch (tp->t_tspec) { 3201 case FUNC: 3202 /* cannot take size/alignment of function */ 3203 error(144); 3204 elsz = 1; 3205 break; 3206 case STRUCT: 3207 case UNION: 3208 if (is_incomplete(tp)) { 3209 /* cannot take size/alignment of incomplete type */ 3210 error(143); 3211 elsz = 1; 3212 } else { 3213 elsz = tp->t_str->sou_size_in_bits; 3214 } 3215 break; 3216 case ENUM: 3217 if (is_incomplete(tp)) { 3218 /* cannot take size/alignment of incomplete type */ 3219 warning(143); 3220 } 3221 /* FALLTHROUGH */ 3222 default: 3223 if (tp->t_bitfield) { 3224 /* cannot take size/alignment of bit-field */ 3225 error(145); 3226 } 3227 if (tp->t_tspec == VOID) { 3228 /* cannot take size/alignment of void */ 3229 error(146); 3230 elsz = 1; 3231 } else { 3232 elsz = size_in_bits(tp->t_tspec); 3233 lint_assert(elsz > 0); 3234 } 3235 break; 3236 } 3237 3238 return (int64_t)elem * elsz; 3239 } 3240 3241 tnode_t * 3242 build_alignof(const type_t *tp) 3243 { 3244 switch (tp->t_tspec) { 3245 case ARRAY: 3246 break; 3247 3248 case FUNC: 3249 /* cannot take size/alignment of function */ 3250 error(144); 3251 return 0; 3252 3253 case STRUCT: 3254 case UNION: 3255 if (is_incomplete(tp)) { 3256 /* cannot take size/alignment of incomplete type */ 3257 error(143); 3258 return 0; 3259 } 3260 break; 3261 case ENUM: 3262 break; 3263 default: 3264 if (tp->t_bitfield) { 3265 /* cannot take size/alignment of bit-field */ 3266 error(145); 3267 return 0; 3268 } 3269 if (tp->t_tspec == VOID) { 3270 /* cannot take size/alignment of void */ 3271 error(146); 3272 return 0; 3273 } 3274 break; 3275 } 3276 3277 return expr_new_integer_constant(SIZEOF_TSPEC, 3278 (int64_t)alignment_in_bits(tp) / CHAR_SIZE); 3279 } 3280 3281 /* 3282 * Type casts. 3283 */ 3284 tnode_t * 3285 cast(tnode_t *tn, type_t *tp) 3286 { 3287 tspec_t nt, ot; 3288 3289 if (tn == NULL) 3290 return NULL; 3291 3292 /* 3293 * XXX: checking for tp == NULL is only a quick fix for PR 22119. 3294 * The proper fix needs to be investigated properly. 3295 * See d_pr_22119.c for how to get here. 3296 */ 3297 if (tp == NULL) 3298 return NULL; 3299 3300 tn = cconv(tn); 3301 3302 nt = tp->t_tspec; 3303 ot = tn->tn_type->t_tspec; 3304 3305 if (nt == VOID) { 3306 /* 3307 * XXX ANSI C requires scalar types or void (Plauger & Brodie). 3308 * But this seems really questionable. 3309 */ 3310 } else if (nt == UNION) { 3311 sym_t *m; 3312 struct_or_union *str = tp->t_str; 3313 if (!Sflag) { 3314 /* union cast is a C9X feature */ 3315 error(328); 3316 return NULL; 3317 } 3318 for (m = str->sou_first_member; m != NULL; m = m->s_next) { 3319 if (sametype(m->s_type, tn->tn_type)) { 3320 tn = expr_zalloc_tnode(); 3321 tn->tn_op = CVT; 3322 tn->tn_type = tp; 3323 tn->tn_cast = true; 3324 tn->tn_right = NULL; 3325 return tn; 3326 } 3327 } 3328 /* type '%s' is not a member of '%s' */ 3329 error(329, type_name(tn->tn_type), type_name(tp)); 3330 return NULL; 3331 } else if (nt == STRUCT || nt == ARRAY || nt == FUNC) { 3332 if (!Sflag || nt == ARRAY || nt == FUNC) { 3333 /* invalid cast expression */ 3334 error(147); 3335 return NULL; 3336 } 3337 } else if (ot == STRUCT || ot == UNION) { 3338 /* invalid cast expression */ 3339 error(147); 3340 return NULL; 3341 } else if (ot == VOID) { 3342 /* improper cast of void expression */ 3343 error(148); 3344 return NULL; 3345 } else if (is_integer(nt) && is_scalar(ot)) { 3346 /* ok */ 3347 } else if (is_floating(nt) && is_arithmetic(ot)) { 3348 /* ok */ 3349 } else if (nt == PTR && is_integer(ot)) { 3350 /* ok */ 3351 } else if (nt == PTR && ot == PTR) { 3352 if (!tp->t_subt->t_const && tn->tn_type->t_subt->t_const) { 3353 if (hflag) 3354 /* cast discards 'const' from type '%s' */ 3355 warning(275, type_name(tn->tn_type)); 3356 } 3357 } else { 3358 /* invalid cast expression */ 3359 error(147); 3360 return NULL; 3361 } 3362 3363 tn = convert(CVT, 0, tp, tn); 3364 tn->tn_cast = true; 3365 3366 return tn; 3367 } 3368 3369 /* 3370 * Create the node for a function argument. 3371 * All necessary conversions and type checks are done in 3372 * new_function_call_node because new_function_argument_node has no 3373 * information about expected argument types. 3374 */ 3375 tnode_t * 3376 new_function_argument_node(tnode_t *args, tnode_t *arg) 3377 { 3378 tnode_t *ntn; 3379 3380 /* 3381 * If there was a serious error in the expression for the argument, 3382 * create a dummy argument so the positions of the remaining arguments 3383 * will not change. 3384 */ 3385 if (arg == NULL) 3386 arg = expr_new_integer_constant(INT, 0); 3387 3388 ntn = new_tnode(PUSH, arg->tn_type, arg, args); 3389 3390 return ntn; 3391 } 3392 3393 /* 3394 * Create the node for a function call. Also check types of 3395 * function arguments and insert conversions, if necessary. 3396 */ 3397 tnode_t * 3398 new_function_call_node(tnode_t *func, tnode_t *args) 3399 { 3400 tnode_t *ntn; 3401 op_t fcop; 3402 3403 if (func == NULL) 3404 return NULL; 3405 3406 if (func->tn_op == NAME && func->tn_type->t_tspec == FUNC) { 3407 fcop = CALL; 3408 } else { 3409 fcop = ICALL; 3410 } 3411 3412 check_ctype_function_call(func, args); 3413 3414 /* 3415 * after cconv() func will always be a pointer to a function 3416 * if it is a valid function designator. 3417 */ 3418 func = cconv(func); 3419 3420 if (func->tn_type->t_tspec != PTR || 3421 func->tn_type->t_subt->t_tspec != FUNC) { 3422 /* illegal function (type %s) */ 3423 error(149, type_name(func->tn_type)); 3424 return NULL; 3425 } 3426 3427 args = check_function_arguments(func->tn_type->t_subt, args); 3428 3429 ntn = new_tnode(fcop, func->tn_type->t_subt->t_subt, func, args); 3430 3431 return ntn; 3432 } 3433 3434 /* 3435 * Check types of all function arguments and insert conversions, 3436 * if necessary. 3437 */ 3438 static tnode_t * 3439 check_function_arguments(type_t *ftp, tnode_t *args) 3440 { 3441 tnode_t *arg; 3442 sym_t *asym; 3443 tspec_t at; 3444 int narg, npar, n, i; 3445 3446 /* get # of args in the prototype */ 3447 npar = 0; 3448 for (asym = ftp->t_args; asym != NULL; asym = asym->s_next) 3449 npar++; 3450 3451 /* get # of args in function call */ 3452 narg = 0; 3453 for (arg = args; arg != NULL; arg = arg->tn_right) 3454 narg++; 3455 3456 asym = ftp->t_args; 3457 if (ftp->t_proto && npar != narg && !(ftp->t_vararg && npar < narg)) { 3458 /* argument mismatch: %d arg%s passed, %d expected */ 3459 error(150, narg, narg > 1 ? "s" : "", npar); 3460 asym = NULL; 3461 } 3462 3463 for (n = 1; n <= narg; n++) { 3464 3465 /* 3466 * The rightmost argument is at the top of the argument 3467 * subtree. 3468 */ 3469 for (i = narg, arg = args; i > n; i--, arg = arg->tn_right) 3470 continue; 3471 3472 /* some things which are always not allowed */ 3473 if ((at = arg->tn_left->tn_type->t_tspec) == VOID) { 3474 /* void expressions may not be arguments, arg #%d */ 3475 error(151, n); 3476 return NULL; 3477 } else if ((at == STRUCT || at == UNION) && 3478 is_incomplete(arg->tn_left->tn_type)) { 3479 /* argument cannot have unknown size, arg #%d */ 3480 error(152, n); 3481 return NULL; 3482 } else if (is_integer(at) && 3483 arg->tn_left->tn_type->t_is_enum && 3484 is_incomplete(arg->tn_left->tn_type)) { 3485 /* argument cannot have unknown size, arg #%d */ 3486 warning(152, n); 3487 } 3488 3489 /* class conversions (arg in value context) */ 3490 arg->tn_left = cconv(arg->tn_left); 3491 3492 if (asym != NULL) { 3493 arg->tn_left = check_prototype_argument( 3494 n, asym->s_type, arg->tn_left); 3495 } else { 3496 arg->tn_left = promote(NOOP, true, arg->tn_left); 3497 } 3498 arg->tn_type = arg->tn_left->tn_type; 3499 3500 if (asym != NULL) 3501 asym = asym->s_next; 3502 } 3503 3504 return args; 3505 } 3506 3507 /* 3508 * Compare the type of an argument with the corresponding type of a 3509 * prototype parameter. If it is a valid combination, but both types 3510 * are not the same, insert a conversion to convert the argument into 3511 * the type of the parameter. 3512 */ 3513 static tnode_t * 3514 check_prototype_argument( 3515 int n, /* pos of arg */ 3516 type_t *tp, /* expected type (from prototype) */ 3517 tnode_t *tn) /* argument */ 3518 { 3519 tnode_t *ln; 3520 bool dowarn; 3521 3522 ln = xcalloc(1, sizeof(*ln)); 3523 ln->tn_type = expr_dup_type(tp); 3524 ln->tn_type->t_const = false; 3525 ln->tn_lvalue = true; 3526 if (typeok(FARG, n, ln, tn)) { 3527 if (!eqtype(tp, tn->tn_type, 3528 true, false, (dowarn = false, &dowarn)) || dowarn) 3529 tn = convert(FARG, n, tp, tn); 3530 } 3531 free(ln); 3532 return tn; 3533 } 3534 3535 /* 3536 * Return the value of an integral constant expression. 3537 * If the expression is not constant or its type is not an integer 3538 * type, an error message is printed. 3539 */ 3540 val_t * 3541 constant(tnode_t *tn, bool required) 3542 { 3543 val_t *v; 3544 3545 if (tn != NULL) 3546 tn = cconv(tn); 3547 if (tn != NULL) 3548 tn = promote(NOOP, false, tn); 3549 3550 v = xcalloc(1, sizeof(*v)); 3551 3552 if (tn == NULL) { 3553 lint_assert(nerr != 0); 3554 if (dflag) 3555 printf("constant node is null; returning 1 instead\n"); 3556 v->v_tspec = INT; 3557 v->v_quad = 1; 3558 return v; 3559 } 3560 3561 v->v_tspec = tn->tn_type->t_tspec; 3562 3563 if (tn->tn_op == CON) { 3564 lint_assert(tn->tn_type->t_tspec == tn->tn_val->v_tspec); 3565 if (is_integer(tn->tn_val->v_tspec)) { 3566 v->v_ansiu = tn->tn_val->v_ansiu; 3567 v->v_quad = tn->tn_val->v_quad; 3568 return v; 3569 } 3570 v->v_quad = tn->tn_val->v_ldbl; 3571 } else { 3572 v->v_quad = 1; 3573 } 3574 3575 if (required) 3576 /* integral constant expression expected */ 3577 error(55); 3578 else 3579 /* variable array dimension is a C99/GCC extension */ 3580 c99ism(318); 3581 3582 if (!is_integer(v->v_tspec)) 3583 v->v_tspec = INT; 3584 3585 return v; 3586 } 3587 3588 static bool 3589 is_constcond_false(const tnode_t *tn, tspec_t t) 3590 { 3591 return (t == BOOL || t == INT) && 3592 tn->tn_op == CON && tn->tn_val->v_quad == 0; 3593 } 3594 3595 /* 3596 * Perform some tests on expressions which can't be done in build() and 3597 * functions called by build(). These tests must be done here because 3598 * we need some information about the context in which the operations 3599 * are performed. 3600 * After all tests are performed and dofreeblk is true, expr() frees the 3601 * memory which is used for the expression. 3602 */ 3603 void 3604 expr(tnode_t *tn, bool vctx, bool tctx, bool dofreeblk, bool is_do_while) 3605 { 3606 3607 lint_assert(tn != NULL || nerr != 0); 3608 3609 if (tn == NULL) { 3610 expr_free_all(); 3611 return; 3612 } 3613 3614 /* expr() is also called in global initializations */ 3615 if (dcs->d_ctx != EXTERN && !is_do_while) 3616 check_statement_reachable(); 3617 3618 check_expr_misc(tn, vctx, tctx, !tctx, false, false, false); 3619 if (tn->tn_op == ASSIGN) { 3620 if (hflag && tctx) 3621 /* assignment in conditional context */ 3622 warning(159); 3623 } else if (tn->tn_op == CON) { 3624 if (hflag && tctx && !constcond_flag && 3625 !tn->tn_system_dependent && 3626 !(is_do_while && 3627 is_constcond_false(tn, tn->tn_type->t_tspec))) 3628 /* constant in conditional context */ 3629 warning(161); 3630 } 3631 if (!modtab[tn->tn_op].m_has_side_effect) { 3632 /* 3633 * for left operands of COMMA this warning is already 3634 * printed 3635 */ 3636 if (tn->tn_op != COMMA && !vctx && !tctx) 3637 check_null_effect(tn); 3638 } 3639 if (dflag) 3640 display_expression(tn, 0); 3641 3642 /* free the tree memory */ 3643 if (dofreeblk) 3644 expr_free_all(); 3645 } 3646 3647 static bool 3648 has_side_effect(const tnode_t *tn) // NOLINT(misc-no-recursion) 3649 { 3650 op_t op = tn->tn_op; 3651 3652 if (modtab[op].m_has_side_effect) 3653 return true; 3654 3655 if (op == CVT && tn->tn_type->t_tspec == VOID) 3656 return has_side_effect(tn->tn_left); 3657 3658 /* XXX: Why not has_side_effect(tn->tn_left) as well? */ 3659 if (op == LOGAND || op == LOGOR) 3660 return has_side_effect(tn->tn_right); 3661 3662 /* XXX: Why not has_side_effect(tn->tn_left) as well? */ 3663 if (op == QUEST) 3664 return has_side_effect(tn->tn_right); 3665 3666 if (op == COLON || op == COMMA) { 3667 return has_side_effect(tn->tn_left) || 3668 has_side_effect(tn->tn_right); 3669 } 3670 3671 return false; 3672 } 3673 3674 static void 3675 check_null_effect(const tnode_t *tn) 3676 { 3677 3678 if (hflag && !has_side_effect(tn)) { 3679 /* expression has null effect */ 3680 warning(129); 3681 } 3682 } 3683 3684 /* 3685 * Dump an expression to stdout 3686 * only used for debugging 3687 */ 3688 static void 3689 display_expression(const tnode_t *tn, int offs) 3690 { 3691 uint64_t uq; 3692 3693 if (tn == NULL) { 3694 (void)printf("%*s%s\n", offs, "", "NULL"); 3695 return; 3696 } 3697 (void)printf("%*sop %s ", offs, "", op_name(tn->tn_op)); 3698 3699 if (tn->tn_op == NAME) { 3700 (void)printf("%s: %s ", 3701 tn->tn_sym->s_name, 3702 storage_class_name(tn->tn_sym->s_scl)); 3703 } else if (tn->tn_op == CON && is_floating(tn->tn_type->t_tspec)) { 3704 (void)printf("%#g ", (double)tn->tn_val->v_ldbl); 3705 } else if (tn->tn_op == CON && is_integer(tn->tn_type->t_tspec)) { 3706 uq = tn->tn_val->v_quad; 3707 (void)printf("0x %08lx %08lx ", 3708 (long)(uq >> 32) & 0xffffffffl, 3709 (long)uq & 0xffffffffl); 3710 } else if (tn->tn_op == CON) { 3711 lint_assert(tn->tn_type->t_tspec == PTR); 3712 (void)printf("0x%0*lx ", (int)(sizeof(void *) * CHAR_BIT / 4), 3713 (u_long)tn->tn_val->v_quad); 3714 } else if (tn->tn_op == STRING) { 3715 if (tn->tn_string->st_tspec == CHAR) { 3716 (void)printf("\"%s\"", tn->tn_string->st_cp); 3717 } else { 3718 char *s; 3719 size_t n; 3720 n = MB_CUR_MAX * (tn->tn_string->st_len + 1); 3721 s = xmalloc(n); 3722 (void)wcstombs(s, tn->tn_string->st_wcp, n); 3723 (void)printf("L\"%s\"", s); 3724 free(s); 3725 } 3726 (void)printf(" "); 3727 } else if (tn->tn_op == FSEL) { 3728 (void)printf("o=%d, l=%d ", tn->tn_type->t_foffs, 3729 tn->tn_type->t_flen); 3730 } 3731 (void)printf("%s\n", ttos(tn->tn_type)); 3732 if (tn->tn_op == NAME || tn->tn_op == CON || tn->tn_op == STRING) 3733 return; 3734 display_expression(tn->tn_left, offs + 2); 3735 if (modtab[tn->tn_op].m_binary || 3736 (tn->tn_op == PUSH && tn->tn_right != NULL)) { 3737 display_expression(tn->tn_right, offs + 2); 3738 } 3739 } 3740 3741 /* 3742 * Called by expr() to recursively perform some tests. 3743 */ 3744 /* ARGSUSED */ 3745 void 3746 check_expr_misc(const tnode_t *tn, bool vctx, bool tctx, 3747 bool eqwarn, bool fcall, bool rvdisc, bool szof) 3748 { 3749 tnode_t *ln, *rn; 3750 const mod_t *mp; 3751 op_t op; 3752 scl_t sc; 3753 dinfo_t *di; 3754 3755 if (tn == NULL) 3756 return; 3757 3758 ln = tn->tn_left; 3759 rn = tn->tn_right; 3760 mp = &modtab[op = tn->tn_op]; 3761 3762 switch (op) { 3763 case ADDR: 3764 /* XXX: Taking warn_about_unreachable into account here feels wrong. */ 3765 if (ln->tn_op == NAME && (reached || !warn_about_unreachable)) { 3766 if (!szof) 3767 mark_as_set(ln->tn_sym); 3768 mark_as_used(ln->tn_sym, fcall, szof); 3769 } 3770 if (ln->tn_op == INDIR && ln->tn_left->tn_op == PLUS) 3771 /* check the range of array indices */ 3772 check_array_index(ln->tn_left, true); 3773 break; 3774 case LOAD: 3775 if (ln->tn_op == INDIR && ln->tn_left->tn_op == PLUS) 3776 /* check the range of array indices */ 3777 check_array_index(ln->tn_left, false); 3778 /* FALLTHROUGH */ 3779 case PUSH: 3780 case INCBEF: 3781 case DECBEF: 3782 case INCAFT: 3783 case DECAFT: 3784 case ADDASS: 3785 case SUBASS: 3786 case MULASS: 3787 case DIVASS: 3788 case MODASS: 3789 case ANDASS: 3790 case ORASS: 3791 case XORASS: 3792 case SHLASS: 3793 case SHRASS: 3794 case REAL: 3795 case IMAG: 3796 /* XXX: Taking warn_about_unreachable into account here feels wrong. */ 3797 if (ln->tn_op == NAME && (reached || !warn_about_unreachable)) { 3798 sc = ln->tn_sym->s_scl; 3799 /* 3800 * Look if there was a asm statement in one of the 3801 * compound statements we are in. If not, we don't 3802 * print a warning. 3803 */ 3804 for (di = dcs; di != NULL; di = di->d_next) { 3805 if (di->d_asm) 3806 break; 3807 } 3808 if (sc != EXTERN && sc != STATIC && 3809 !ln->tn_sym->s_set && !szof && di == NULL) { 3810 /* %s may be used before set */ 3811 warning(158, ln->tn_sym->s_name); 3812 mark_as_set(ln->tn_sym); 3813 } 3814 mark_as_used(ln->tn_sym, false, false); 3815 } 3816 break; 3817 case ASSIGN: 3818 /* XXX: Taking warn_about_unreachable into account here feels wrong. */ 3819 if (ln->tn_op == NAME && !szof && (reached || !warn_about_unreachable)) { 3820 mark_as_set(ln->tn_sym); 3821 if (ln->tn_sym->s_scl == EXTERN) 3822 outusg(ln->tn_sym); 3823 } 3824 if (ln->tn_op == INDIR && ln->tn_left->tn_op == PLUS) 3825 /* check the range of array indices */ 3826 check_array_index(ln->tn_left, false); 3827 break; 3828 case CALL: 3829 lint_assert(ln->tn_op == ADDR); 3830 lint_assert(ln->tn_left->tn_op == NAME); 3831 if (!szof) 3832 outcall(tn, vctx || tctx, rvdisc); 3833 break; 3834 case EQ: 3835 if (hflag && eqwarn) 3836 /* operator '==' found where '=' was expected */ 3837 warning(160); 3838 break; 3839 case CON: 3840 case NAME: 3841 case STRING: 3842 return; 3843 /* LINTED206: (enumeration values not handled in switch) */ 3844 case BITOR: 3845 case BITXOR: 3846 case NE: 3847 case GE: 3848 case GT: 3849 case LE: 3850 case LT: 3851 case SHR: 3852 case SHL: 3853 case MINUS: 3854 case PLUS: 3855 case MOD: 3856 case DIV: 3857 case MULT: 3858 case INDIR: 3859 case UMINUS: 3860 case UPLUS: 3861 case DEC: 3862 case INC: 3863 case COMPL: 3864 case NOT: 3865 case POINT: 3866 case ARROW: 3867 case NOOP: 3868 case BITAND: 3869 case FARG: 3870 case CASE: 3871 case INIT: 3872 case RETURN: 3873 case ICALL: 3874 case CVT: 3875 case COMMA: 3876 case FSEL: 3877 case COLON: 3878 case QUEST: 3879 case LOGOR: 3880 case LOGAND: 3881 break; 3882 } 3883 3884 bool cvctx = mp->m_left_value_context; 3885 bool ctctx = mp->m_left_test_context; 3886 bool eq = mp->m_warn_if_operand_eq && 3887 !ln->tn_parenthesized && 3888 rn != NULL && !rn->tn_parenthesized; 3889 3890 /* 3891 * values of operands of ':' are not used if the type of at least 3892 * one of the operands (for gcc compatibility) is void 3893 * XXX test/value context of QUEST should probably be used as 3894 * context for both operands of COLON 3895 */ 3896 if (op == COLON && tn->tn_type->t_tspec == VOID) 3897 cvctx = ctctx = false; 3898 bool discard = op == CVT && tn->tn_type->t_tspec == VOID; 3899 check_expr_misc(ln, cvctx, ctctx, eq, op == CALL, discard, szof); 3900 3901 switch (op) { 3902 case PUSH: 3903 if (rn != NULL) 3904 check_expr_misc(rn, false, false, eq, false, false, 3905 szof); 3906 break; 3907 case LOGAND: 3908 case LOGOR: 3909 check_expr_misc(rn, false, true, eq, false, false, szof); 3910 break; 3911 case COLON: 3912 check_expr_misc(rn, cvctx, ctctx, eq, false, false, szof); 3913 break; 3914 case COMMA: 3915 check_expr_misc(rn, vctx, tctx, eq, false, false, szof); 3916 break; 3917 default: 3918 if (mp->m_binary) 3919 check_expr_misc(rn, true, false, eq, false, false, 3920 szof); 3921 break; 3922 } 3923 3924 } 3925 3926 /* 3927 * Checks the range of array indices, if possible. 3928 * amper is set if only the address of the element is used. This 3929 * means that the index is allowed to refer to the first element 3930 * after the array. 3931 */ 3932 static void 3933 check_array_index(tnode_t *tn, bool amper) 3934 { 3935 int dim; 3936 tnode_t *ln, *rn; 3937 int elsz; 3938 int64_t con; 3939 3940 ln = tn->tn_left; 3941 rn = tn->tn_right; 3942 3943 /* We can only check constant indices. */ 3944 if (rn->tn_op != CON) 3945 return; 3946 3947 /* Return if the left node does not stem from an array. */ 3948 if (ln->tn_op != ADDR) 3949 return; 3950 if (ln->tn_left->tn_op != STRING && ln->tn_left->tn_op != NAME) 3951 return; 3952 if (ln->tn_left->tn_type->t_tspec != ARRAY) 3953 return; 3954 3955 /* 3956 * For incomplete array types, we can print a warning only if 3957 * the index is negative. 3958 */ 3959 if (is_incomplete(ln->tn_left->tn_type) && rn->tn_val->v_quad >= 0) 3960 return; 3961 3962 /* Get the size of one array element */ 3963 if ((elsz = length(ln->tn_type->t_subt, NULL)) == 0) 3964 return; 3965 elsz /= CHAR_SIZE; 3966 3967 /* Change the unit of the index from bytes to element size. */ 3968 if (is_uinteger(rn->tn_type->t_tspec)) { 3969 con = (uint64_t)rn->tn_val->v_quad / elsz; 3970 } else { 3971 con = rn->tn_val->v_quad / elsz; 3972 } 3973 3974 dim = ln->tn_left->tn_type->t_dim + (amper ? 1 : 0); 3975 3976 if (!is_uinteger(rn->tn_type->t_tspec) && con < 0) { 3977 /* array subscript cannot be negative: %ld */ 3978 warning(167, (long)con); 3979 } else if (dim > 0 && (uint64_t)con >= (uint64_t)dim) { 3980 /* array subscript cannot be > %d: %ld */ 3981 warning(168, dim - 1, (long)con); 3982 } 3983 } 3984 3985 /* 3986 * Check for ordered comparisons of unsigned values with 0. 3987 */ 3988 static void 3989 check_integer_comparison(op_t op, tnode_t *ln, tnode_t *rn) 3990 { 3991 tspec_t lt, rt; 3992 3993 lt = ln->tn_type->t_tspec; 3994 rt = rn->tn_type->t_tspec; 3995 3996 if (ln->tn_op != CON && rn->tn_op != CON) 3997 return; 3998 3999 if (!is_integer(lt) || !is_integer(rt)) 4000 return; 4001 4002 if ((hflag || pflag) && lt == CHAR && rn->tn_op == CON && 4003 (rn->tn_val->v_quad < 0 || 4004 rn->tn_val->v_quad > (int)~(~0U << (CHAR_SIZE - 1)))) { 4005 /* nonportable character comparison, op %s */ 4006 warning(230, op_name(op)); 4007 return; 4008 } 4009 if ((hflag || pflag) && rt == CHAR && ln->tn_op == CON && 4010 (ln->tn_val->v_quad < 0 || 4011 ln->tn_val->v_quad > (int)~(~0U << (CHAR_SIZE - 1)))) { 4012 /* nonportable character comparison, op %s */ 4013 warning(230, op_name(op)); 4014 return; 4015 } 4016 if (is_uinteger(lt) && !is_uinteger(rt) && 4017 rn->tn_op == CON && rn->tn_val->v_quad <= 0) { 4018 if (rn->tn_val->v_quad < 0) { 4019 /* comparison of %s with %s, op %s */ 4020 warning(162, type_name(ln->tn_type), 4021 "negative constant", op_name(op)); 4022 } else if (op == LT || op == GE || (hflag && op == LE)) { 4023 /* comparison of %s with %s, op %s */ 4024 warning(162, type_name(ln->tn_type), "0", op_name(op)); 4025 } 4026 return; 4027 } 4028 if (is_uinteger(rt) && !is_uinteger(lt) && 4029 ln->tn_op == CON && ln->tn_val->v_quad <= 0) { 4030 if (ln->tn_val->v_quad < 0) { 4031 /* comparison of %s with %s, op %s */ 4032 warning(162, "negative constant", 4033 type_name(rn->tn_type), op_name(op)); 4034 } else if (op == GT || op == LE || (hflag && op == GE)) { 4035 /* comparison of %s with %s, op %s */ 4036 warning(162, "0", type_name(rn->tn_type), op_name(op)); 4037 } 4038 return; 4039 } 4040 } 4041 4042 /* 4043 * Return whether the expression can be used for static initialization. 4044 * 4045 * Constant initialization expressions must be constant or an address 4046 * of a static object with an optional offset. In the first case, 4047 * the result is returned in *offsp. In the second case, the static 4048 * object is returned in *symp and the offset in *offsp. 4049 * 4050 * The expression can consist of PLUS, MINUS, ADDR, NAME, STRING and 4051 * CON. Type conversions are allowed if they do not change binary 4052 * representation (including width). 4053 * 4054 * C99 6.6 "Constant expressions" 4055 * C99 6.7.8p4 restricts initializers for static storage duration 4056 */ 4057 bool 4058 constant_addr(const tnode_t *tn, const sym_t **symp, ptrdiff_t *offsp) 4059 { 4060 const sym_t *sym; 4061 ptrdiff_t offs1, offs2; 4062 tspec_t t, ot; 4063 4064 switch (tn->tn_op) { 4065 case MINUS: 4066 if (tn->tn_right->tn_op == CVT) 4067 return constant_addr(tn->tn_right, symp, offsp); 4068 else if (tn->tn_right->tn_op != CON) 4069 return false; 4070 /* FALLTHROUGH */ 4071 case PLUS: 4072 offs1 = offs2 = 0; 4073 if (tn->tn_left->tn_op == CON) { 4074 offs1 = (ptrdiff_t)tn->tn_left->tn_val->v_quad; 4075 if (!constant_addr(tn->tn_right, &sym, &offs2)) 4076 return false; 4077 } else if (tn->tn_right->tn_op == CON) { 4078 offs2 = (ptrdiff_t)tn->tn_right->tn_val->v_quad; 4079 if (tn->tn_op == MINUS) 4080 offs2 = -offs2; 4081 if (!constant_addr(tn->tn_left, &sym, &offs1)) 4082 return false; 4083 } else { 4084 return false; 4085 } 4086 *symp = sym; 4087 *offsp = offs1 + offs2; 4088 return true; 4089 case ADDR: 4090 if (tn->tn_left->tn_op == NAME) { 4091 *symp = tn->tn_left->tn_sym; 4092 *offsp = 0; 4093 return true; 4094 } else { 4095 /* 4096 * If this would be the front end of a compiler we 4097 * would return a label instead of 0, at least if 4098 * 'tn->tn_left->tn_op == STRING'. 4099 */ 4100 *symp = NULL; 4101 *offsp = 0; 4102 return true; 4103 } 4104 case CVT: 4105 t = tn->tn_type->t_tspec; 4106 ot = tn->tn_left->tn_type->t_tspec; 4107 if ((!is_integer(t) && t != PTR) || 4108 (!is_integer(ot) && ot != PTR)) { 4109 return false; 4110 } 4111 #ifdef notdef 4112 /* 4113 * consider: 4114 * struct foo { 4115 * unsigned char a; 4116 * } f = { 4117 * (u_char)(u_long)(&(((struct foo *)0)->a)) 4118 * }; 4119 * since psize(u_long) != psize(u_char) this fails. 4120 */ 4121 else if (psize(t) != psize(ot)) 4122 return -1; 4123 #endif 4124 return constant_addr(tn->tn_left, symp, offsp); 4125 default: 4126 return false; 4127 } 4128 } 4129 4130 /* 4131 * Concatenate two string constants. 4132 */ 4133 strg_t * 4134 cat_strings(strg_t *strg1, strg_t *strg2) 4135 { 4136 size_t len1, len2, len; 4137 4138 if (strg1->st_tspec != strg2->st_tspec) { 4139 /* cannot concatenate wide and regular string literals */ 4140 error(292); 4141 return strg1; 4142 } 4143 4144 len1 = strg1->st_len; 4145 len2 = strg2->st_len + 1; /* + NUL */ 4146 len = len1 + len2; 4147 4148 #define COPY(F) \ 4149 do { \ 4150 strg1->F = xrealloc(strg1->F, len * sizeof(*strg1->F)); \ 4151 (void)memcpy(strg1->F + len1, strg2->F, len2 * sizeof(*strg1->F)); \ 4152 free(strg2->F); \ 4153 } while (false) 4154 4155 if (strg1->st_tspec == CHAR) 4156 COPY(st_cp); 4157 else 4158 COPY(st_wcp); 4159 4160 strg1->st_len = len - 1; /* - NUL */ 4161 free(strg2); 4162 4163 return strg1; 4164 } 4165 4166 static bool 4167 is_confusing_precedence(op_t op, op_t lop, bool lparen, op_t rop, bool rparen) 4168 { 4169 4170 if (op == SHL || op == SHR) { 4171 if (!lparen && (lop == PLUS || lop == MINUS)) 4172 return true; 4173 if (!rparen && (rop == PLUS || rop == MINUS)) 4174 return true; 4175 return false; 4176 } 4177 4178 if (op == LOGOR) { 4179 if (!lparen && lop == LOGAND) 4180 return true; 4181 if (!rparen && rop == LOGAND) 4182 return true; 4183 return false; 4184 } 4185 4186 lint_assert(op == BITAND || op == BITXOR || op == BITOR); 4187 if (!lparen && lop != op) { 4188 if (lop == PLUS || lop == MINUS) 4189 return true; 4190 if (lop == BITAND || lop == BITXOR) 4191 return true; 4192 } 4193 if (!rparen && rop != op) { 4194 if (rop == PLUS || rop == MINUS) 4195 return true; 4196 if (rop == BITAND || rop == BITXOR) 4197 return true; 4198 } 4199 return false; 4200 } 4201 4202 /* 4203 * Print a warning if the given node has operands which should be 4204 * parenthesized. 4205 * 4206 * XXX Does not work if an operand is a constant expression. Constant 4207 * expressions are already folded. 4208 */ 4209 static void 4210 check_precedence_confusion(tnode_t *tn) 4211 { 4212 tnode_t *ln, *rn; 4213 4214 if (!hflag) 4215 return; 4216 4217 debug_node(tn, 0); 4218 4219 lint_assert(modtab[tn->tn_op].m_binary); 4220 for (ln = tn->tn_left; ln->tn_op == CVT; ln = ln->tn_left) 4221 continue; 4222 for (rn = tn->tn_right; rn->tn_op == CVT; rn = rn->tn_left) 4223 continue; 4224 4225 if (is_confusing_precedence(tn->tn_op, 4226 ln->tn_op, ln->tn_parenthesized, 4227 rn->tn_op, rn->tn_parenthesized)) { 4228 /* precedence confusion possible: parenthesize! */ 4229 warning(169); 4230 } 4231 } 4232