1 /* $NetBSD: tree.c,v 1.484 2022/11/30 20:59:28 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) 40 __RCSID("$NetBSD: tree.c,v 1.484 2022/11/30 20:59:28 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 52 typedef struct integer_constraints { 53 int64_t smin; /* signed minimum */ 54 int64_t smax; /* signed maximum */ 55 uint64_t umin; /* unsigned minimum */ 56 uint64_t umax; /* unsigned maximum */ 57 uint64_t bset; /* bits that are definitely set */ 58 uint64_t bclr; /* bits that are definitely clear */ 59 } integer_constraints; 60 61 static tnode_t *build_integer_constant(tspec_t, int64_t); 62 static void check_pointer_comparison(op_t, 63 const tnode_t *, const tnode_t *); 64 static bool check_assign_types_compatible(op_t, int, 65 const tnode_t *, const tnode_t *); 66 static void check_bad_enum_operation(op_t, 67 const tnode_t *, const tnode_t *); 68 static void check_enum_type_mismatch(op_t, int, 69 const tnode_t *, const tnode_t *); 70 static void check_enum_int_mismatch(op_t, int, 71 const tnode_t *, const tnode_t *); 72 static tnode_t *new_tnode(op_t, bool, type_t *, tnode_t *, tnode_t *); 73 static void balance(op_t, tnode_t **, tnode_t **); 74 static void warn_incompatible_types(op_t, const type_t *, tspec_t, 75 const type_t *, tspec_t); 76 static void warn_incompatible_pointers(const mod_t *, 77 const type_t *, const type_t *); 78 static bool has_constant_member(const type_t *); 79 static void check_prototype_conversion(int, tspec_t, tspec_t, type_t *, 80 tnode_t *); 81 static void convert_integer_from_integer(op_t, int, tspec_t, tspec_t, 82 type_t *, tnode_t *); 83 static void convert_integer_from_pointer(op_t, tspec_t, type_t *, 84 tnode_t *); 85 static void convert_pointer_from_pointer(type_t *, tnode_t *); 86 static tnode_t *build_struct_access(op_t, bool, tnode_t *, tnode_t *); 87 static tnode_t *build_prepost_incdec(op_t, bool, tnode_t *); 88 static tnode_t *build_real_imag(op_t, bool, tnode_t *); 89 static tnode_t *build_address(bool, tnode_t *, bool); 90 static tnode_t *build_plus_minus(op_t, bool, tnode_t *, tnode_t *); 91 static tnode_t *build_bit_shift(op_t, bool, tnode_t *, tnode_t *); 92 static tnode_t *build_colon(bool, tnode_t *, tnode_t *); 93 static tnode_t *build_assignment(op_t, bool, tnode_t *, tnode_t *); 94 static tnode_t *subt_size_in_bytes(type_t *); 95 static tnode_t *fold(tnode_t *); 96 static tnode_t *fold_bool(tnode_t *); 97 static tnode_t *fold_float(tnode_t *); 98 static tnode_t *check_function_arguments(type_t *, tnode_t *); 99 static tnode_t *check_prototype_argument(int, type_t *, tnode_t *); 100 static void check_null_effect(const tnode_t *); 101 static void check_array_index(tnode_t *, bool); 102 static void check_integer_comparison(op_t, tnode_t *, tnode_t *); 103 static void check_precedence_confusion(tnode_t *); 104 105 extern sig_atomic_t fpe; 106 107 static uint64_t 108 u64_fill_right(uint64_t x) 109 { 110 x |= x >> 1; 111 x |= x >> 2; 112 x |= x >> 4; 113 x |= x >> 8; 114 x |= x >> 16; 115 x |= x >> 32; 116 return x; 117 } 118 119 static unsigned 120 width_in_bits(const type_t *tp) 121 { 122 123 lint_assert(is_integer(tp->t_tspec)); 124 return tp->t_bitfield ? tp->t_flen : size_in_bits(tp->t_tspec); 125 } 126 127 static bool 128 ic_maybe_signed(const type_t *tp, const integer_constraints *ic) 129 { 130 131 return !is_uinteger(tp->t_tspec) && 132 (ic->bclr & ((uint64_t)1 << 63)) == 0; 133 } 134 135 static integer_constraints 136 ic_any(const type_t *tp) 137 { 138 integer_constraints c; 139 140 uint64_t vbits = value_bits(width_in_bits(tp)); 141 if (is_uinteger(tp->t_tspec)) { 142 c.smin = INT64_MIN; 143 c.smax = INT64_MAX; 144 c.umin = 0; 145 c.umax = vbits; 146 c.bset = 0; 147 c.bclr = ~c.umax; 148 } else { 149 c.smin = (int64_t)-1 - (int64_t)(vbits >> 1); 150 c.smax = (int64_t)(vbits >> 1); 151 c.umin = 0; 152 c.umax = UINT64_MAX; 153 c.bset = 0; 154 c.bclr = 0; 155 } 156 return c; 157 } 158 159 static integer_constraints 160 ic_con(const type_t *tp, const val_t *v) 161 { 162 integer_constraints c; 163 164 lint_assert(is_integer(tp->t_tspec)); 165 int64_t s = v->v_quad; 166 uint64_t u = (uint64_t)s; 167 c.smin = s; 168 c.smax = s; 169 c.umin = u; 170 c.umax = u; 171 c.bset = u; 172 c.bclr = ~u; 173 return c; 174 } 175 176 static integer_constraints 177 ic_cvt(const type_t *ntp, const type_t *otp, integer_constraints a) 178 { 179 180 if (width_in_bits(ntp) > width_in_bits(otp) && 181 is_uinteger(otp->t_tspec)) 182 return a; 183 return ic_any(ntp); 184 } 185 186 static integer_constraints 187 ic_bitand(integer_constraints a, integer_constraints b) 188 { 189 integer_constraints c; 190 191 c.smin = INT64_MIN; 192 c.smax = INT64_MAX; 193 c.umin = 0; 194 c.umax = UINT64_MAX; 195 c.bset = a.bset & b.bset; 196 c.bclr = a.bclr | b.bclr; 197 return c; 198 } 199 200 static integer_constraints 201 ic_bitor(integer_constraints a, integer_constraints b) 202 { 203 integer_constraints c; 204 205 c.smin = INT64_MIN; 206 c.smax = INT64_MAX; 207 c.umin = 0; 208 c.umax = UINT64_MAX; 209 c.bset = a.bset | b.bset; 210 c.bclr = a.bclr & b.bclr; 211 return c; 212 } 213 214 static integer_constraints 215 ic_mod(const type_t *tp, integer_constraints a, integer_constraints b) 216 { 217 integer_constraints c; 218 219 if (ic_maybe_signed(tp, &a) || ic_maybe_signed(tp, &b)) 220 return ic_any(tp); 221 222 c.smin = INT64_MIN; 223 c.smax = INT64_MAX; 224 c.umin = 0; 225 c.umax = b.umax - 1; 226 c.bset = 0; 227 c.bclr = ~u64_fill_right(c.umax); 228 return c; 229 } 230 231 static integer_constraints 232 ic_shl(const type_t *tp, integer_constraints a, integer_constraints b) 233 { 234 integer_constraints c; 235 unsigned int amount; 236 237 if (ic_maybe_signed(tp, &a)) 238 return ic_any(tp); 239 240 if (b.smin == b.smax && b.smin >= 0 && b.smin < 64) 241 amount = (unsigned int)b.smin; 242 else if (b.umin == b.umax && b.umin < 64) 243 amount = (unsigned int)b.umin; 244 else 245 return ic_any(tp); 246 247 c.smin = INT64_MIN; 248 c.smax = INT64_MAX; 249 c.umin = 0; 250 c.umax = UINT64_MAX; 251 c.bset = a.bset << amount; 252 c.bclr = a.bclr << amount | (((uint64_t)1 << amount) - 1); 253 return c; 254 } 255 256 static integer_constraints 257 ic_shr(const type_t *tp, integer_constraints a, integer_constraints b) 258 { 259 integer_constraints c; 260 unsigned int amount; 261 262 if (ic_maybe_signed(tp, &a)) 263 return ic_any(tp); 264 265 if (b.smin == b.smax && b.smin >= 0 && b.smin < 64) 266 amount = (unsigned int)b.smin; 267 else if (b.umin == b.umax && b.umin < 64) 268 amount = (unsigned int)b.umin; 269 else 270 return ic_any(tp); 271 272 c.smin = INT64_MIN; 273 c.smax = INT64_MAX; 274 c.umin = 0; 275 c.umax = UINT64_MAX; 276 c.bset = a.bset >> amount; 277 c.bclr = a.bclr >> amount | ~(~(uint64_t)0 >> amount); 278 return c; 279 } 280 281 static integer_constraints 282 ic_expr(const tnode_t *tn) 283 { 284 integer_constraints lc, rc; 285 286 lint_assert(is_integer(tn->tn_type->t_tspec)); 287 288 switch (tn->tn_op) { 289 case CON: 290 return ic_con(tn->tn_type, tn->tn_val); 291 case CVT: 292 if (!is_integer(tn->tn_left->tn_type->t_tspec)) 293 return ic_any(tn->tn_type); 294 lc = ic_expr(tn->tn_left); 295 return ic_cvt(tn->tn_type, tn->tn_left->tn_type, lc); 296 case MOD: 297 lc = ic_expr(before_conversion(tn->tn_left)); 298 rc = ic_expr(before_conversion(tn->tn_right)); 299 return ic_mod(tn->tn_type, lc, rc); 300 case SHL: 301 lc = ic_expr(tn->tn_left); 302 rc = ic_expr(tn->tn_right); 303 return ic_shl(tn->tn_type, lc, rc); 304 case SHR: 305 lc = ic_expr(tn->tn_left); 306 rc = ic_expr(tn->tn_right); 307 return ic_shr(tn->tn_type, lc, rc); 308 case BITAND: 309 lc = ic_expr(tn->tn_left); 310 rc = ic_expr(tn->tn_right); 311 return ic_bitand(lc, rc); 312 case BITOR: 313 lc = ic_expr(tn->tn_left); 314 rc = ic_expr(tn->tn_right); 315 return ic_bitor(lc, rc); 316 default: 317 return ic_any(tn->tn_type); 318 } 319 } 320 321 static const char * 322 op_name(op_t op) 323 { 324 return modtab[op].m_name; 325 } 326 327 /* Build 'pointer to tp', 'array of tp' or 'function returning tp'. */ 328 type_t * 329 block_derive_type(type_t *tp, tspec_t t) 330 { 331 type_t *tp2; 332 333 tp2 = block_zero_alloc(sizeof(*tp2)); 334 tp2->t_tspec = t; 335 tp2->t_subt = tp; 336 return tp2; 337 } 338 339 /* 340 * Derive 'pointer to tp' or 'function returning tp'. 341 * The memory is freed at the end of the current expression. 342 */ 343 type_t * 344 expr_derive_type(type_t *tp, tspec_t t) 345 { 346 type_t *tp2; 347 348 tp2 = expr_zero_alloc(sizeof(*tp2)); 349 tp2->t_tspec = t; 350 tp2->t_subt = tp; 351 return tp2; 352 } 353 354 /* 355 * Create a node for a constant. 356 */ 357 tnode_t * 358 build_constant(type_t *tp, val_t *v) 359 { 360 tnode_t *n; 361 362 n = expr_alloc_tnode(); 363 n->tn_op = CON; 364 n->tn_type = tp; 365 n->tn_val = expr_zero_alloc(sizeof(*n->tn_val)); 366 n->tn_val->v_tspec = tp->t_tspec; 367 n->tn_val->v_unsigned_since_c90 = v->v_unsigned_since_c90; 368 n->tn_val->v_u = v->v_u; 369 free(v); 370 return n; 371 } 372 373 static tnode_t * 374 build_integer_constant(tspec_t t, int64_t q) 375 { 376 tnode_t *n; 377 378 n = expr_alloc_tnode(); 379 n->tn_op = CON; 380 n->tn_type = gettyp(t); 381 n->tn_val = expr_zero_alloc(sizeof(*n->tn_val)); 382 n->tn_val->v_tspec = t; 383 n->tn_val->v_quad = q; 384 return n; 385 } 386 387 static void 388 fallback_symbol(sym_t *sym) 389 { 390 391 if (fallback_symbol_strict_bool(sym)) 392 return; 393 394 if (block_level > 0 && (strcmp(sym->s_name, "__FUNCTION__") == 0 || 395 strcmp(sym->s_name, "__PRETTY_FUNCTION__") == 0)) { 396 /* __FUNCTION__/__PRETTY_FUNCTION__ is a GCC extension */ 397 gnuism(316); 398 sym->s_type = block_derive_type(gettyp(CHAR), PTR); 399 sym->s_type->t_const = true; 400 return; 401 } 402 403 if (block_level > 0 && strcmp(sym->s_name, "__func__") == 0) { 404 if (!allow_c99) 405 /* __func__ is a C99 feature */ 406 warning(317); 407 sym->s_type = block_derive_type(gettyp(CHAR), PTR); 408 sym->s_type->t_const = true; 409 return; 410 } 411 412 /* '%s' undefined */ 413 error(99, sym->s_name); 414 } 415 416 /* 417 * Functions that are predeclared by GCC or other compilers can be called 418 * with arbitrary arguments. Since lint usually runs after a successful 419 * compilation, it's the compiler's job to catch any errors. 420 */ 421 bool 422 is_compiler_builtin(const char *name) 423 { 424 /* https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html */ 425 if (allow_gcc) { 426 if (strncmp(name, "__atomic_", 9) == 0 || 427 strncmp(name, "__builtin_", 10) == 0 || 428 strcmp(name, "alloca") == 0 || 429 /* obsolete but still in use, as of 2021 */ 430 strncmp(name, "__sync_", 7) == 0) 431 return true; 432 } 433 434 /* https://software.intel.com/sites/landingpage/IntrinsicsGuide/ */ 435 if (strncmp(name, "_mm_", 4) == 0) 436 return true; 437 438 return false; 439 } 440 441 static bool 442 str_endswith(const char *haystack, const char *needle) 443 { 444 size_t hlen = strlen(haystack); 445 size_t nlen = strlen(needle); 446 447 return nlen <= hlen && 448 memcmp(haystack + hlen - nlen, needle, nlen) == 0; 449 } 450 451 /* https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html */ 452 static bool 453 is_gcc_bool_builtin(const char *name) 454 { 455 return strncmp(name, "__builtin_", 10) == 0 && 456 (str_endswith(name, "_overflow") || 457 str_endswith(name, "_overflow_p")); 458 } 459 460 static void 461 build_name_call(sym_t *sym) 462 { 463 464 if (is_compiler_builtin(sym->s_name)) { 465 /* 466 * Do not warn about these, just assume that 467 * they are regular functions compatible with 468 * non-prototype calling conventions. 469 */ 470 if (allow_gcc && is_gcc_bool_builtin(sym->s_name)) 471 sym->s_type = gettyp(BOOL); 472 473 } else if (allow_c99) { 474 /* function '%s' implicitly declared to return int */ 475 error(215, sym->s_name); 476 } else if (!allow_trad) { 477 /* function '%s' implicitly declared to return int */ 478 warning(215, sym->s_name); 479 } 480 481 /* XXX if !allow_c90, the symbol should be exported to level 0 */ 482 sym->s_type = block_derive_type(sym->s_type, FUNC); 483 } 484 485 /* Create a node for a name (symbol table entry). */ 486 tnode_t * 487 build_name(sym_t *sym, bool is_funcname) 488 { 489 tnode_t *n; 490 491 if (sym->s_scl == NOSCL && !in_gcc_attribute) { 492 sym->s_scl = EXTERN; 493 sym->s_def = DECL; 494 if (is_funcname) 495 build_name_call(sym); 496 else 497 fallback_symbol(sym); 498 } 499 500 lint_assert(sym->s_kind == FVFT || sym->s_kind == FMEMBER); 501 502 n = expr_alloc_tnode(); 503 n->tn_type = sym->s_type; 504 if (sym->s_scl == BOOL_CONST) { 505 n->tn_op = CON; 506 n->tn_val = expr_zero_alloc(sizeof(*n->tn_val)); 507 n->tn_val->v_tspec = BOOL; 508 n->tn_val->v_quad = sym->u.s_bool_constant ? 1 : 0; 509 } else if (sym->s_scl == ENUM_CONST) { 510 n->tn_op = CON; 511 n->tn_val = expr_zero_alloc(sizeof(*n->tn_val)); 512 n->tn_val->v_tspec = INT; /* ENUM is in n->tn_type */ 513 n->tn_val->v_quad = sym->u.s_enum_constant; 514 } else { 515 n->tn_op = NAME; 516 n->tn_sym = sym; 517 if (sym->s_kind == FVFT && sym->s_type->t_tspec != FUNC) 518 n->tn_lvalue = true; 519 } 520 521 return n; 522 } 523 524 tnode_t * 525 build_string(strg_t *strg) 526 { 527 size_t len; 528 tnode_t *n; 529 type_t *tp; 530 531 len = strg->st_len; 532 533 n = expr_alloc_tnode(); 534 535 tp = expr_zero_alloc(sizeof(*tp)); 536 tp->t_tspec = ARRAY; 537 tp->t_subt = gettyp(strg->st_char ? CHAR : WCHAR); 538 tp->t_dim = (int)(len + 1); 539 540 n->tn_op = STRING; 541 n->tn_type = tp; 542 n->tn_lvalue = true; 543 544 n->tn_string = expr_zero_alloc(sizeof(*n->tn_string)); 545 n->tn_string->st_char = strg->st_char; 546 n->tn_string->st_len = len; 547 548 size_t chsize = strg->st_char ? sizeof(char) : sizeof(wchar_t); 549 size_t size = (len + 1) * chsize; 550 n->tn_string->st_mem = expr_zero_alloc(size); 551 (void)memcpy(n->tn_string->st_mem, strg->st_mem, size); 552 free(strg->st_mem); 553 free(strg); 554 555 return n; 556 } 557 558 /* 559 * Returns a symbol which has the same name as the msym argument and is a 560 * member of the struct or union specified by the tn argument. 561 */ 562 static sym_t * 563 struct_or_union_member(tnode_t *tn, op_t op, sym_t *msym) 564 { 565 struct_or_union *str; 566 type_t *tp; 567 sym_t *sym, *csym; 568 bool eq; 569 tspec_t t; 570 571 /* 572 * Remove the member if it was unknown until now, which means 573 * that no defined struct or union has a member with the same name. 574 */ 575 if (msym->s_scl == NOSCL) { 576 /* type '%s' does not have member '%s' */ 577 error(101, type_name(tn->tn_type), msym->s_name); 578 rmsym(msym); 579 msym->s_kind = FMEMBER; 580 msym->s_scl = MOS; 581 582 struct_or_union *sou = expr_zero_alloc(sizeof(*sou)); 583 sou->sou_tag = expr_zero_alloc(sizeof(*sou->sou_tag)); 584 sou->sou_tag->s_name = unnamed; 585 586 msym->u.s_member.sm_sou_type = sou; 587 /* 588 * The member sm_offset_in_bits is not needed here since this 589 * symbol can only be used for error reporting. 590 */ 591 return msym; 592 } 593 594 /* Set str to the tag of which msym is expected to be a member. */ 595 str = NULL; 596 t = (tp = tn->tn_type)->t_tspec; 597 if (op == POINT) { 598 if (is_struct_or_union(t)) 599 str = tp->t_str; 600 } else if (op == ARROW && t == PTR) { 601 t = (tp = tp->t_subt)->t_tspec; 602 if (is_struct_or_union(t)) 603 str = tp->t_str; 604 } 605 606 /* 607 * If this struct/union has a member with the name of msym, return it. 608 */ 609 if (str != NULL) { 610 for (sym = msym; sym != NULL; sym = sym->s_symtab_next) { 611 if (!is_member(sym)) 612 continue; 613 if (sym->u.s_member.sm_sou_type != str) 614 continue; 615 if (strcmp(sym->s_name, msym->s_name) != 0) 616 continue; 617 return sym; 618 } 619 } 620 621 /* 622 * Set eq to false if there are struct/union members with the same 623 * name and different types and/or offsets. 624 */ 625 eq = true; 626 for (csym = msym; csym != NULL; csym = csym->s_symtab_next) { 627 if (csym->s_scl != MOS && csym->s_scl != MOU) 628 continue; 629 if (strcmp(msym->s_name, csym->s_name) != 0) 630 continue; 631 for (sym = csym->s_symtab_next; sym != NULL; 632 sym = sym->s_symtab_next) { 633 bool w; 634 635 if (sym->s_scl != MOS && sym->s_scl != MOU) 636 continue; 637 if (strcmp(csym->s_name, sym->s_name) != 0) 638 continue; 639 if (csym->u.s_member.sm_offset_in_bits != 640 sym->u.s_member.sm_offset_in_bits) { 641 eq = false; 642 break; 643 } 644 w = false; 645 eq = types_compatible(csym->s_type, sym->s_type, 646 false, false, &w) && !w; 647 if (!eq) 648 break; 649 if (csym->s_bitfield != sym->s_bitfield) { 650 eq = false; 651 break; 652 } 653 if (csym->s_bitfield) { 654 type_t *tp1, *tp2; 655 656 tp1 = csym->s_type; 657 tp2 = sym->s_type; 658 if (tp1->t_flen != tp2->t_flen) { 659 eq = false; 660 break; 661 } 662 if (tp1->t_foffs != tp2->t_foffs) { 663 eq = false; 664 break; 665 } 666 } 667 } 668 if (!eq) 669 break; 670 } 671 672 /* 673 * Now handle the case in which the left operand refers really 674 * to a struct/union, but the right operand is not member of it. 675 */ 676 if (str != NULL) { 677 if (eq && !allow_c90) { 678 /* illegal use of member '%s' */ 679 warning(102, msym->s_name); 680 } else { 681 /* illegal use of member '%s' */ 682 error(102, msym->s_name); 683 } 684 return msym; 685 } 686 687 /* 688 * Now the left operand of ARROW does not point to a struct/union 689 * or the left operand of POINT is no struct/union. 690 */ 691 if (eq) { 692 if (op == POINT) { 693 if (!allow_c90) { 694 /* left operand of '.' must be struct ... */ 695 warning(103, type_name(tn->tn_type)); 696 } else { 697 /* left operand of '.' must be struct ... */ 698 error(103, type_name(tn->tn_type)); 699 } 700 } else { 701 if (!allow_c90 && tn->tn_type->t_tspec == PTR) { 702 /* left operand of '->' must be pointer ... */ 703 warning(104, type_name(tn->tn_type)); 704 } else { 705 /* left operand of '->' must be pointer ... */ 706 error(104, type_name(tn->tn_type)); 707 } 708 } 709 } else { 710 if (!allow_c90) { 711 /* non-unique member requires struct/union %s */ 712 error(105, op == POINT ? "object" : "pointer"); 713 } else { 714 /* unacceptable operand of '%s' */ 715 error(111, op_name(op)); 716 } 717 } 718 719 return msym; 720 } 721 722 tnode_t * 723 build_generic_selection(const tnode_t *expr, 724 struct generic_association *sel) 725 { 726 tnode_t *default_result = NULL; 727 728 for (; sel != NULL; sel = sel->ga_prev) { 729 if (expr != NULL && 730 types_compatible(sel->ga_arg, expr->tn_type, 731 false, false, NULL)) 732 return sel->ga_result; 733 else if (sel->ga_arg == NULL) 734 default_result = sel->ga_result; 735 } 736 return default_result; 737 } 738 739 /* 740 * Create a tree node for a binary operator and its two operands. Also called 741 * for unary operators; in that case rn is NULL. 742 * 743 * Function calls, sizeof and casts are handled elsewhere. 744 */ 745 tnode_t * 746 build_binary(tnode_t *ln, op_t op, bool sys, tnode_t *rn) 747 { 748 const mod_t *mp; 749 tnode_t *ntn; 750 type_t *rettp; 751 752 mp = &modtab[op]; 753 754 /* If there was an error in one of the operands, return. */ 755 if (ln == NULL || (mp->m_binary && rn == NULL)) 756 return NULL; 757 758 /* 759 * Apply class conversions to the left operand, but only if its 760 * value is needed or it is compared with zero. 761 */ 762 if (mp->m_value_context || mp->m_compares_with_zero) 763 ln = cconv(ln); 764 /* 765 * The right operand is almost always in a test or value context, 766 * except if it is a struct or union member. 767 */ 768 if (mp->m_binary && op != ARROW && op != POINT) 769 rn = cconv(rn); 770 771 /* 772 * Print some warnings for comparisons of unsigned values with 773 * constants lower than or equal to null. This must be done 774 * before promote() because otherwise unsigned char and unsigned 775 * short would be promoted to int. Types are also tested to be 776 * CHAR, which would also become int. 777 */ 778 if (mp->m_comparison) 779 check_integer_comparison(op, ln, rn); 780 781 if (mp->m_value_context || mp->m_compares_with_zero) 782 ln = promote(op, false, ln); 783 if (mp->m_binary && op != ARROW && op != POINT && 784 op != ASSIGN && op != RETURN && op != INIT) { 785 rn = promote(op, false, rn); 786 } 787 788 /* 789 * If the result of the operation is different for signed or 790 * unsigned operands and one of the operands is signed only in 791 * ANSI C, print a warning. 792 */ 793 if (mp->m_warn_if_left_unsigned_in_c90 && 794 ln->tn_op == CON && ln->tn_val->v_unsigned_since_c90) { 795 /* ANSI C treats constant as unsigned, op '%s' */ 796 warning(218, mp->m_name); 797 ln->tn_val->v_unsigned_since_c90 = false; 798 } 799 if (mp->m_warn_if_right_unsigned_in_c90 && 800 rn->tn_op == CON && rn->tn_val->v_unsigned_since_c90) { 801 /* ANSI C treats constant as unsigned, op '%s' */ 802 warning(218, mp->m_name); 803 rn->tn_val->v_unsigned_since_c90 = false; 804 } 805 806 /* Make sure both operands are of the same type */ 807 if (mp->m_balance_operands || (!allow_c90 && (op == SHL || op == SHR))) 808 balance(op, &ln, &rn); 809 810 /* 811 * Check types for compatibility with the operation and mutual 812 * compatibility. Return if there are serious problems. 813 */ 814 if (!typeok(op, 0, ln, rn)) 815 return NULL; 816 817 /* And now create the node. */ 818 switch (op) { 819 case POINT: 820 case ARROW: 821 ntn = build_struct_access(op, sys, ln, rn); 822 break; 823 case INCAFT: 824 case DECAFT: 825 case INCBEF: 826 case DECBEF: 827 ntn = build_prepost_incdec(op, sys, ln); 828 break; 829 case ADDR: 830 ntn = build_address(sys, ln, false); 831 break; 832 case INDIR: 833 ntn = new_tnode(INDIR, sys, ln->tn_type->t_subt, ln, NULL); 834 break; 835 case PLUS: 836 case MINUS: 837 ntn = build_plus_minus(op, sys, ln, rn); 838 break; 839 case SHL: 840 case SHR: 841 ntn = build_bit_shift(op, sys, ln, rn); 842 break; 843 case COLON: 844 ntn = build_colon(sys, ln, rn); 845 break; 846 case ASSIGN: 847 case MULASS: 848 case DIVASS: 849 case MODASS: 850 case ADDASS: 851 case SUBASS: 852 case SHLASS: 853 case SHRASS: 854 case ANDASS: 855 case XORASS: 856 case ORASS: 857 case RETURN: 858 case INIT: 859 ntn = build_assignment(op, sys, ln, rn); 860 break; 861 case COMMA: 862 case QUEST: 863 ntn = new_tnode(op, sys, rn->tn_type, ln, rn); 864 break; 865 case REAL: 866 case IMAG: 867 ntn = build_real_imag(op, sys, ln); 868 break; 869 default: 870 rettp = mp->m_returns_bool 871 ? gettyp(Tflag ? BOOL : INT) : ln->tn_type; 872 lint_assert(mp->m_binary == (rn != NULL)); 873 ntn = new_tnode(op, sys, rettp, ln, rn); 874 break; 875 } 876 877 /* Return if an error occurred. */ 878 if (ntn == NULL) 879 return NULL; 880 881 /* Print a warning if precedence confusion is possible */ 882 if (mp->m_possible_precedence_confusion) 883 check_precedence_confusion(ntn); 884 885 /* 886 * Print a warning if one of the operands is in a context where 887 * it is compared with zero and if this operand is a constant. 888 */ 889 if (hflag && !constcond_flag && 890 mp->m_compares_with_zero && 891 (ln->tn_op == CON || 892 ((mp->m_binary && op != QUEST) && rn->tn_op == CON)) && 893 /* XXX: rn->tn_system_dependent should be checked as well */ 894 !ln->tn_system_dependent) { 895 /* constant in conditional context */ 896 warning(161); 897 } 898 899 /* Fold if the operator requires it */ 900 if (mp->m_fold_constant_operands) { 901 if (ln->tn_op == CON && (!mp->m_binary || rn->tn_op == CON)) { 902 if (mp->m_compares_with_zero) { 903 ntn = fold_bool(ntn); 904 } else if (is_floating(ntn->tn_type->t_tspec)) { 905 ntn = fold_float(ntn); 906 } else { 907 ntn = fold(ntn); 908 } 909 } else if (op == QUEST && ln->tn_op == CON) { 910 ntn = ln->tn_val->v_quad != 0 911 ? rn->tn_left : rn->tn_right; 912 } 913 } 914 915 return ntn; 916 } 917 918 tnode_t * 919 build_unary(op_t op, bool sys, tnode_t *tn) 920 { 921 return build_binary(tn, op, sys, NULL); 922 } 923 924 tnode_t * 925 build_member_access(tnode_t *ln, op_t op, bool sys, sbuf_t *member) 926 { 927 sym_t *msym; 928 929 if (ln == NULL) 930 return NULL; 931 932 if (op == ARROW) { 933 /* must do this before struct_or_union_member is called */ 934 ln = cconv(ln); 935 } 936 msym = struct_or_union_member(ln, op, getsym(member)); 937 return build_binary(ln, op, sys, build_name(msym, false)); 938 } 939 940 /* 941 * Perform class conversions. 942 * 943 * Arrays of type T are converted into pointers to type T. 944 * Functions are converted to pointers to functions. 945 * Lvalues are converted to rvalues. 946 * 947 * C99 6.3 "Conversions" 948 * C99 6.3.2 "Other operands" 949 * C99 6.3.2.1 "Lvalues, arrays, and function designators" 950 */ 951 tnode_t * 952 cconv(tnode_t *tn) 953 { 954 type_t *tp; 955 956 /* 957 * Array-lvalue (array of type T) is converted into rvalue 958 * (pointer to type T) 959 */ 960 if (tn->tn_type->t_tspec == ARRAY) { 961 if (!tn->tn_lvalue) { 962 /* XXX print correct operator */ 963 /* %soperand of '%s' must be lvalue */ 964 gnuism(114, "", op_name(ADDR)); 965 } 966 tn = new_tnode(ADDR, tn->tn_sys, 967 expr_derive_type(tn->tn_type->t_subt, PTR), tn, NULL); 968 } 969 970 /* 971 * Expression of type function (function with return value of type T) 972 * in rvalue-expression (pointer to function with return value 973 * of type T) 974 */ 975 if (tn->tn_type->t_tspec == FUNC) 976 tn = build_address(tn->tn_sys, tn, true); 977 978 /* lvalue to rvalue */ 979 if (tn->tn_lvalue) { 980 tp = expr_dup_type(tn->tn_type); 981 /* C99 6.3.2.1p2 sentence 2 says to remove the qualifiers. */ 982 tp->t_const = tp->t_volatile = false; 983 tn = new_tnode(LOAD, tn->tn_sys, tp, tn, NULL); 984 } 985 986 return tn; 987 } 988 989 const tnode_t * 990 before_conversion(const tnode_t *tn) 991 { 992 while (tn->tn_op == CVT && !tn->tn_cast) 993 tn = tn->tn_left; 994 return tn; 995 } 996 997 static bool 998 is_null_pointer(const tnode_t *tn) 999 { 1000 tspec_t t = tn->tn_type->t_tspec; 1001 1002 return ((t == PTR && tn->tn_type->t_subt->t_tspec == VOID) || 1003 is_integer(t)) 1004 && (tn->tn_op == CON && tn->tn_val->v_quad == 0); 1005 } 1006 1007 /* 1008 * Most errors required by ANSI C are reported in struct_or_union_member(). 1009 * Here we only check for totally wrong things. 1010 */ 1011 static bool 1012 typeok_point(const tnode_t *ln, const type_t *ltp, tspec_t lt) 1013 { 1014 if (is_struct_or_union(lt)) 1015 return true; 1016 1017 if (lt == FUNC || lt == VOID || ltp->t_bitfield) 1018 goto wrong; 1019 1020 /* 1021 * Some C dialects from before C90 tolerated any lvalue on the 1022 * left-hand side of the '.' operator, allowing things like 1023 * char st[100]; st.st_mtime, assuming that the member 'st_mtime' 1024 * only occurred in a single struct; see typeok_arrow. 1025 */ 1026 if (ln->tn_lvalue) 1027 return true; 1028 1029 wrong: 1030 /* With allow_c90 we already got an error */ 1031 if (!allow_c90) 1032 /* unacceptable operand of '%s' */ 1033 error(111, op_name(POINT)); 1034 1035 return false; 1036 } 1037 1038 static bool 1039 typeok_arrow(tspec_t lt) 1040 { 1041 /* 1042 * C1978 Appendix A 14.1 says: <quote>In fact, any lvalue is allowed 1043 * before '.', and that lvalue is then assumed to have the form of 1044 * the structure of which the name of the right is a member. [...] 1045 * Such constructions are non-portable.</quote> 1046 */ 1047 if (lt == PTR || (!allow_c90 && is_integer(lt))) 1048 return true; 1049 1050 /* With allow_c90 we already got an error */ 1051 if (!allow_c90) 1052 /* unacceptable operand of '%s' */ 1053 error(111, op_name(ARROW)); 1054 return false; 1055 } 1056 1057 static bool 1058 typeok_incdec(op_t op, const tnode_t *tn, const type_t *tp) 1059 { 1060 /* operand has scalar type (checked in typeok) */ 1061 if (!tn->tn_lvalue) { 1062 if (tn->tn_op == CVT && tn->tn_cast && 1063 tn->tn_left->tn_op == LOAD) { 1064 /* a cast does not yield an lvalue */ 1065 error(163); 1066 } 1067 /* %soperand of '%s' must be lvalue */ 1068 error(114, "", op_name(op)); 1069 return false; 1070 } else if (tp->t_const) { 1071 if (allow_c90) 1072 /* %soperand of '%s' must be modifiable lvalue */ 1073 warning(115, "", op_name(op)); 1074 } 1075 return true; 1076 } 1077 1078 static bool 1079 typeok_address(const mod_t *mp, 1080 const tnode_t *tn, const type_t *tp, tspec_t t) 1081 { 1082 if (t == ARRAY || t == FUNC) { 1083 /* ok, a warning comes later (in build_address()) */ 1084 } else if (!tn->tn_lvalue) { 1085 if (tn->tn_op == CVT && tn->tn_cast && 1086 tn->tn_left->tn_op == LOAD) { 1087 /* a cast does not yield an lvalue */ 1088 error(163); 1089 } 1090 /* %soperand of '%s' must be lvalue */ 1091 error(114, "", mp->m_name); 1092 return false; 1093 } else if (is_scalar(t)) { 1094 if (tp->t_bitfield) { 1095 /* cannot take address of bit-field */ 1096 error(112); 1097 return false; 1098 } 1099 } else if (t != STRUCT && t != UNION) { 1100 /* unacceptable operand of '%s' */ 1101 error(111, mp->m_name); 1102 return false; 1103 } 1104 if (tn->tn_op == NAME && tn->tn_sym->s_register) { 1105 /* cannot take address of register '%s' */ 1106 error(113, tn->tn_sym->s_name); 1107 return false; 1108 } 1109 return true; 1110 } 1111 1112 static bool 1113 typeok_indir(const type_t *tp, tspec_t t) 1114 { 1115 1116 if (t != PTR) { 1117 /* cannot dereference non-pointer type '%s' */ 1118 error(96, type_name(tp)); 1119 return false; 1120 } 1121 return true; 1122 } 1123 1124 static bool 1125 typeok_plus(op_t op, 1126 const type_t *ltp, tspec_t lt, 1127 const type_t *rtp, tspec_t rt) 1128 { 1129 /* operands have scalar types (checked in typeok) */ 1130 if ((lt == PTR && !is_integer(rt)) || (rt == PTR && !is_integer(lt))) { 1131 warn_incompatible_types(op, ltp, lt, rtp, rt); 1132 return false; 1133 } 1134 return true; 1135 } 1136 1137 static bool 1138 typeok_minus(op_t op, 1139 const type_t *ltp, tspec_t lt, 1140 const type_t *rtp, tspec_t rt) 1141 { 1142 /* operands have scalar types (checked in typeok) */ 1143 if ((lt == PTR && rt != PTR && !is_integer(rt)) || 1144 (lt != PTR && rt == PTR)) { 1145 warn_incompatible_types(op, ltp, lt, rtp, rt); 1146 return false; 1147 } 1148 if (lt == PTR && rt == PTR) { 1149 if (!types_compatible(ltp->t_subt, rtp->t_subt, 1150 true, false, NULL)) { 1151 /* illegal pointer subtraction */ 1152 error(116); 1153 } 1154 } 1155 return true; 1156 } 1157 1158 static void 1159 typeok_shr(const mod_t *mp, 1160 const tnode_t *ln, tspec_t lt, 1161 const tnode_t *rn, tspec_t rt) 1162 { 1163 tspec_t olt, ort; 1164 1165 olt = before_conversion(ln)->tn_type->t_tspec; 1166 ort = before_conversion(rn)->tn_type->t_tspec; 1167 1168 /* operands have integer types (checked in typeok) */ 1169 if (pflag && !is_uinteger(olt)) { 1170 /* 1171 * The left operand is signed. This means that 1172 * the operation is (possibly) nonportable. 1173 */ 1174 if (ln->tn_op != CON) { 1175 /* bitwise '%s' on signed value possibly nonportable */ 1176 warning(117, mp->m_name); 1177 } else if (ln->tn_val->v_quad < 0) { 1178 /* bitwise '%s' on signed value nonportable */ 1179 warning(120, mp->m_name); 1180 } 1181 } else if (allow_trad && allow_c90 && 1182 !is_uinteger(olt) && is_uinteger(ort)) { 1183 /* 1184 * The left operand would become unsigned in 1185 * traditional C. 1186 */ 1187 if (hflag && (ln->tn_op != CON || ln->tn_val->v_quad < 0)) { 1188 /* semantics of '%s' change in ANSI C; use ... */ 1189 warning(118, mp->m_name); 1190 } 1191 } else if (allow_trad && allow_c90 && 1192 !is_uinteger(olt) && !is_uinteger(ort) && 1193 portable_size_in_bits(lt) < portable_size_in_bits(rt)) { 1194 /* 1195 * In traditional C the left operand would be extended 1196 * (possibly sign-extended) and then shifted. 1197 */ 1198 if (hflag && (ln->tn_op != CON || ln->tn_val->v_quad < 0)) { 1199 /* semantics of '%s' change in ANSI C; use ... */ 1200 warning(118, mp->m_name); 1201 } 1202 } 1203 } 1204 1205 static void 1206 typeok_shl(const mod_t *mp, tspec_t lt, tspec_t rt) 1207 { 1208 /* 1209 * C90 does not perform balancing for shift operations, 1210 * but traditional C does. If the width of the right operand 1211 * is greater than the width of the left operand, then in 1212 * traditional C the left operand would be extended to the 1213 * width of the right operand. For SHL this may result in 1214 * different results. 1215 */ 1216 if (portable_size_in_bits(lt) < portable_size_in_bits(rt)) { 1217 /* 1218 * XXX If both operands are constant, make sure 1219 * that there is really a difference between 1220 * ANSI C and traditional C. 1221 */ 1222 if (hflag && !allow_c99) 1223 /* semantics of '%s' change in ANSI C; use ... */ 1224 warning(118, mp->m_name); 1225 } 1226 } 1227 1228 static void 1229 typeok_shift(const type_t *ltp, tspec_t lt, const tnode_t *rn, tspec_t rt) 1230 { 1231 if (rn->tn_op != CON) 1232 return; 1233 1234 if (!is_uinteger(rt) && rn->tn_val->v_quad < 0) { 1235 /* negative shift */ 1236 warning(121); 1237 } else if ((uint64_t)rn->tn_val->v_quad == 1238 (uint64_t)size_in_bits(lt)) { 1239 /* shift amount %u equals bit-size of '%s' */ 1240 warning(267, (unsigned)rn->tn_val->v_quad, type_name(ltp)); 1241 } else if ((uint64_t)rn->tn_val->v_quad > (uint64_t)size_in_bits(lt)) { 1242 /* shift amount %llu is greater than bit-size %llu of '%s' */ 1243 warning(122, (unsigned long long)rn->tn_val->v_quad, 1244 (unsigned long long)size_in_bits(lt), 1245 tspec_name(lt)); 1246 } 1247 } 1248 1249 static bool 1250 is_typeok_eq(const tnode_t *ln, tspec_t lt, const tnode_t *rn, tspec_t rt) 1251 { 1252 if (lt == PTR && is_null_pointer(rn)) 1253 return true; 1254 if (rt == PTR && is_null_pointer(ln)) 1255 return true; 1256 return false; 1257 } 1258 1259 static bool 1260 typeok_compare(op_t op, 1261 const tnode_t *ln, const type_t *ltp, tspec_t lt, 1262 const tnode_t *rn, const type_t *rtp, tspec_t rt) 1263 { 1264 const char *lx, *rx; 1265 1266 if (lt == PTR && rt == PTR) { 1267 check_pointer_comparison(op, ln, rn); 1268 return true; 1269 } 1270 1271 if (lt != PTR && rt != PTR) 1272 return true; 1273 1274 if (!is_integer(lt) && !is_integer(rt)) { 1275 warn_incompatible_types(op, ltp, lt, rtp, rt); 1276 return false; 1277 } 1278 1279 lx = lt == PTR ? "pointer" : "integer"; 1280 rx = rt == PTR ? "pointer" : "integer"; 1281 /* illegal combination of %s '%s' and %s '%s', op '%s' */ 1282 warning(123, lx, type_name(ltp), rx, type_name(rtp), op_name(op)); 1283 return true; 1284 } 1285 1286 static bool 1287 typeok_quest(tspec_t lt, const tnode_t *rn) 1288 { 1289 if (!is_scalar(lt)) { 1290 /* first operand must have scalar type, op ? : */ 1291 error(170); 1292 return false; 1293 } 1294 lint_assert(before_conversion(rn)->tn_op == COLON); 1295 return true; 1296 } 1297 1298 static void 1299 typeok_colon_pointer(const mod_t *mp, const type_t *ltp, const type_t *rtp) 1300 { 1301 type_t *lstp = ltp->t_subt; 1302 type_t *rstp = rtp->t_subt; 1303 tspec_t lst = lstp->t_tspec; 1304 tspec_t rst = rstp->t_tspec; 1305 1306 if ((lst == VOID && rst == FUNC) || (lst == FUNC && rst == VOID)) { 1307 /* (void *)0 is handled in typeok_colon */ 1308 /* TODO: C99 behaves like C90 here. */ 1309 if (!allow_trad && !allow_c99) 1310 /* ANSI C forbids conversion of %s to %s, op %s */ 1311 warning(305, "function pointer", "'void *'", 1312 mp->m_name); 1313 return; 1314 } 1315 1316 if (pointer_types_are_compatible(lstp, rstp, true)) 1317 return; 1318 if (!types_compatible(lstp, rstp, true, false, NULL)) 1319 warn_incompatible_pointers(mp, ltp, rtp); 1320 } 1321 1322 static bool 1323 typeok_colon(const mod_t *mp, 1324 const tnode_t *ln, const type_t *ltp, tspec_t lt, 1325 const tnode_t *rn, const type_t *rtp, tspec_t rt) 1326 { 1327 1328 if (is_arithmetic(lt) && is_arithmetic(rt)) 1329 return true; 1330 if (lt == BOOL && rt == BOOL) 1331 return true; 1332 1333 if (lt == STRUCT && rt == STRUCT && ltp->t_str == rtp->t_str) 1334 return true; 1335 if (lt == UNION && rt == UNION && ltp->t_str == rtp->t_str) 1336 return true; 1337 1338 if (lt == PTR && is_null_pointer(rn)) 1339 return true; 1340 if (rt == PTR && is_null_pointer(ln)) 1341 return true; 1342 1343 if ((lt == PTR && is_integer(rt)) || (is_integer(lt) && rt == PTR)) { 1344 const char *lx = lt == PTR ? "pointer" : "integer"; 1345 const char *rx = rt == PTR ? "pointer" : "integer"; 1346 /* illegal combination of %s '%s' and %s '%s', op '%s' */ 1347 warning(123, lx, type_name(ltp), 1348 rx, type_name(rtp), mp->m_name); 1349 return true; 1350 } 1351 1352 if (lt == VOID || rt == VOID) { 1353 if (lt != VOID || rt != VOID) 1354 /* incompatible types '%s' and '%s' in conditional */ 1355 warning(126, type_name(ltp), type_name(rtp)); 1356 return true; 1357 } 1358 1359 if (lt == PTR && rt == PTR) { 1360 typeok_colon_pointer(mp, ltp, rtp); 1361 return true; 1362 } 1363 1364 /* incompatible types '%s' and '%s' in conditional */ 1365 error(126, type_name(ltp), type_name(rtp)); 1366 return false; 1367 } 1368 1369 static bool 1370 typeok_assign(op_t op, const tnode_t *ln, const type_t *ltp, tspec_t lt) 1371 { 1372 if (op == RETURN || op == INIT || op == FARG) 1373 return true; 1374 1375 if (!ln->tn_lvalue) { 1376 if (ln->tn_op == CVT && ln->tn_cast && 1377 ln->tn_left->tn_op == LOAD) { 1378 /* a cast does not yield an lvalue */ 1379 error(163); 1380 } 1381 /* %soperand of '%s' must be lvalue */ 1382 error(114, "left ", op_name(op)); 1383 return false; 1384 } else if (ltp->t_const || (is_struct_or_union(lt) && 1385 has_constant_member(ltp))) { 1386 if (allow_c90) 1387 /* %soperand of '%s' must be modifiable lvalue */ 1388 warning(115, "left ", op_name(op)); 1389 } 1390 return true; 1391 } 1392 1393 /* Check the types using the information from modtab[]. */ 1394 static bool 1395 typeok_scalar(op_t op, const mod_t *mp, 1396 const type_t *ltp, tspec_t lt, 1397 const type_t *rtp, tspec_t rt) 1398 { 1399 if (mp->m_takes_bool && lt == BOOL && rt == BOOL) 1400 return true; 1401 if (mp->m_requires_integer) { 1402 if (!is_integer(lt) || (mp->m_binary && !is_integer(rt))) { 1403 warn_incompatible_types(op, ltp, lt, rtp, rt); 1404 return false; 1405 } 1406 } else if (mp->m_requires_integer_or_complex) { 1407 if ((!is_integer(lt) && !is_complex(lt)) || 1408 (mp->m_binary && (!is_integer(rt) && !is_complex(rt)))) { 1409 warn_incompatible_types(op, ltp, lt, rtp, rt); 1410 return false; 1411 } 1412 } else if (mp->m_requires_scalar) { 1413 if (!is_scalar(lt) || (mp->m_binary && !is_scalar(rt))) { 1414 warn_incompatible_types(op, ltp, lt, rtp, rt); 1415 return false; 1416 } 1417 } else if (mp->m_requires_arith) { 1418 if (!is_arithmetic(lt) || 1419 (mp->m_binary && !is_arithmetic(rt))) { 1420 warn_incompatible_types(op, ltp, lt, rtp, rt); 1421 return false; 1422 } 1423 } 1424 return true; 1425 } 1426 1427 /* 1428 * Check the types for specific operators and type combinations. 1429 * 1430 * At this point, the operands already conform to the type requirements of 1431 * the operator, such as being integer, floating or scalar. 1432 */ 1433 static bool 1434 typeok_op(op_t op, const mod_t *mp, int arg, 1435 const tnode_t *ln, const type_t *ltp, tspec_t lt, 1436 const tnode_t *rn, const type_t *rtp, tspec_t rt) 1437 { 1438 switch (op) { 1439 case ARROW: 1440 return typeok_arrow(lt); 1441 case POINT: 1442 return typeok_point(ln, ltp, lt); 1443 case INCBEF: 1444 case DECBEF: 1445 case INCAFT: 1446 case DECAFT: 1447 return typeok_incdec(op, ln, ltp); 1448 case INDIR: 1449 return typeok_indir(ltp, lt); 1450 case ADDR: 1451 return typeok_address(mp, ln, ltp, lt); 1452 case PLUS: 1453 return typeok_plus(op, ltp, lt, rtp, rt); 1454 case MINUS: 1455 return typeok_minus(op, ltp, lt, rtp, rt); 1456 case SHL: 1457 typeok_shl(mp, lt, rt); 1458 goto shift; 1459 case SHR: 1460 typeok_shr(mp, ln, lt, rn, rt); 1461 shift: 1462 typeok_shift(ltp, lt, rn, rt); 1463 break; 1464 case LT: 1465 case LE: 1466 case GT: 1467 case GE: 1468 compare: 1469 return typeok_compare(op, ln, ltp, lt, rn, rtp, rt); 1470 case EQ: 1471 case NE: 1472 if (is_typeok_eq(ln, lt, rn, rt)) 1473 break; 1474 goto compare; 1475 case QUEST: 1476 return typeok_quest(lt, rn); 1477 case COLON: 1478 return typeok_colon(mp, ln, ltp, lt, rn, rtp, rt); 1479 case ASSIGN: 1480 case INIT: 1481 case FARG: 1482 case RETURN: 1483 if (!check_assign_types_compatible(op, arg, ln, rn)) 1484 return false; 1485 goto assign; 1486 case MULASS: 1487 case DIVASS: 1488 case MODASS: 1489 goto assign; 1490 case ADDASS: 1491 case SUBASS: 1492 if ((lt == PTR && !is_integer(rt)) || rt == PTR) { 1493 warn_incompatible_types(op, ltp, lt, rtp, rt); 1494 return false; 1495 } 1496 goto assign; 1497 case SHLASS: 1498 goto assign; 1499 case SHRASS: 1500 if (pflag && !is_uinteger(lt) && 1501 !(!allow_c90 && is_uinteger(rt))) { 1502 /* bitwise '%s' on signed value possibly nonportable */ 1503 warning(117, mp->m_name); 1504 } 1505 goto assign; 1506 case ANDASS: 1507 case XORASS: 1508 case ORASS: 1509 assign: 1510 return typeok_assign(op, ln, ltp, lt); 1511 case COMMA: 1512 if (!modtab[ln->tn_op].m_has_side_effect) 1513 check_null_effect(ln); 1514 break; 1515 default: 1516 break; 1517 } 1518 return true; 1519 } 1520 1521 static void 1522 typeok_enum(op_t op, const mod_t *mp, int arg, 1523 const tnode_t *ln, const type_t *ltp, 1524 const tnode_t *rn, const type_t *rtp) 1525 { 1526 if (mp->m_bad_on_enum && 1527 (ltp->t_is_enum || (mp->m_binary && rtp->t_is_enum))) { 1528 check_bad_enum_operation(op, ln, rn); 1529 } else if (mp->m_valid_on_enum && 1530 (ltp->t_is_enum && rtp != NULL && rtp->t_is_enum)) { 1531 check_enum_type_mismatch(op, arg, ln, rn); 1532 } else if (mp->m_valid_on_enum && 1533 (ltp->t_is_enum || (rtp != NULL && rtp->t_is_enum))) { 1534 check_enum_int_mismatch(op, arg, ln, rn); 1535 } 1536 } 1537 1538 /* Perform most type checks. Return whether the types are ok. */ 1539 bool 1540 typeok(op_t op, int arg, const tnode_t *ln, const tnode_t *rn) 1541 { 1542 const mod_t *mp; 1543 tspec_t lt, rt; 1544 type_t *ltp, *rtp; 1545 1546 mp = &modtab[op]; 1547 1548 lint_assert((ltp = ln->tn_type) != NULL); 1549 lt = ltp->t_tspec; 1550 1551 if (mp->m_binary) { 1552 lint_assert((rtp = rn->tn_type) != NULL); 1553 rt = rtp->t_tspec; 1554 } else { 1555 rtp = NULL; 1556 rt = NOTSPEC; 1557 } 1558 1559 if (Tflag && !typeok_scalar_strict_bool(op, mp, arg, ln, rn)) 1560 return false; 1561 if (!typeok_scalar(op, mp, ltp, lt, rtp, rt)) 1562 return false; 1563 1564 if (!typeok_op(op, mp, arg, ln, ltp, lt, rn, rtp, rt)) 1565 return false; 1566 1567 typeok_enum(op, mp, arg, ln, ltp, rn, rtp); 1568 return true; 1569 } 1570 1571 static void 1572 check_pointer_comparison(op_t op, const tnode_t *ln, const tnode_t *rn) 1573 { 1574 type_t *ltp, *rtp; 1575 tspec_t lst, rst; 1576 const char *lsts, *rsts; 1577 1578 lst = (ltp = ln->tn_type)->t_subt->t_tspec; 1579 rst = (rtp = rn->tn_type)->t_subt->t_tspec; 1580 1581 if (lst == VOID || rst == VOID) { 1582 /* TODO: C99 behaves like C90 here. */ 1583 if ((!allow_trad && !allow_c99) && 1584 (lst == FUNC || rst == FUNC)) { 1585 /* (void *)0 already handled in typeok() */ 1586 *(lst == FUNC ? &lsts : &rsts) = "function pointer"; 1587 *(lst == VOID ? &lsts : &rsts) = "'void *'"; 1588 /* ANSI C forbids comparison of %s with %s */ 1589 warning(274, lsts, rsts); 1590 } 1591 return; 1592 } 1593 1594 if (!types_compatible(ltp->t_subt, rtp->t_subt, true, false, NULL)) { 1595 warn_incompatible_pointers(&modtab[op], ltp, rtp); 1596 return; 1597 } 1598 1599 if (lst == FUNC && rst == FUNC) { 1600 /* TODO: C99 behaves like C90 here, see C99 6.5.8p2. */ 1601 if ((!allow_trad && !allow_c99) && op != EQ && op != NE) 1602 /* ANSI C forbids ordered comparisons of ... */ 1603 warning(125); 1604 } 1605 } 1606 1607 static bool 1608 is_direct_function_call(const tnode_t *tn, const char **out_name) 1609 { 1610 1611 if (!(tn->tn_op == CALL && 1612 tn->tn_left->tn_op == ADDR && 1613 tn->tn_left->tn_left->tn_op == NAME)) 1614 return false; 1615 1616 *out_name = tn->tn_left->tn_left->tn_sym->s_name; 1617 return true; 1618 } 1619 1620 static bool 1621 is_unconst_function(const char *name) 1622 { 1623 1624 return strcmp(name, "memchr") == 0 || 1625 strcmp(name, "strchr") == 0 || 1626 strcmp(name, "strpbrk") == 0 || 1627 strcmp(name, "strrchr") == 0 || 1628 strcmp(name, "strstr") == 0; 1629 } 1630 1631 static bool 1632 is_const_char_pointer(const tnode_t *tn) 1633 { 1634 const type_t *tp; 1635 1636 /* 1637 * For traditional reasons, C99 6.4.5p5 defines that string literals 1638 * have type 'char[]'. They are often implicitly converted to 1639 * 'char *', for example when they are passed as function arguments. 1640 * 1641 * C99 6.4.5p6 further defines that modifying a string that is 1642 * constructed from a string literal invokes undefined behavior. 1643 * 1644 * Out of these reasons, string literals are treated as 'effectively 1645 * const' here. 1646 */ 1647 if (tn->tn_op == CVT && 1648 tn->tn_left->tn_op == ADDR && 1649 tn->tn_left->tn_left->tn_op == STRING) 1650 return true; 1651 1652 tp = before_conversion(tn)->tn_type; 1653 return tp->t_tspec == PTR && 1654 tp->t_subt->t_tspec == CHAR && 1655 tp->t_subt->t_const; 1656 } 1657 1658 static bool 1659 is_const_pointer(const tnode_t *tn) 1660 { 1661 const type_t *tp; 1662 1663 tp = before_conversion(tn)->tn_type; 1664 return tp->t_tspec == PTR && tp->t_subt->t_const; 1665 } 1666 1667 static bool 1668 is_first_arg_const_char_pointer(const tnode_t *tn) 1669 { 1670 const tnode_t *an; 1671 1672 an = tn->tn_right; 1673 if (an == NULL) 1674 return false; 1675 1676 while (an->tn_right != NULL) 1677 an = an->tn_right; 1678 return is_const_char_pointer(an->tn_left); 1679 } 1680 1681 static bool 1682 is_second_arg_const_pointer(const tnode_t *tn) 1683 { 1684 const tnode_t *an; 1685 1686 an = tn->tn_right; 1687 if (an == NULL || an->tn_right == NULL) 1688 return false; 1689 1690 while (an->tn_right->tn_right != NULL) 1691 an = an->tn_right; 1692 return is_const_pointer(an->tn_left); 1693 } 1694 1695 static void 1696 check_unconst_function(const type_t *lstp, const tnode_t *rn) 1697 { 1698 const char *function_name; 1699 1700 if (lstp->t_tspec == CHAR && !lstp->t_const && 1701 is_direct_function_call(rn, &function_name) && 1702 is_unconst_function(function_name) && 1703 is_first_arg_const_char_pointer(rn)) { 1704 /* call to '%s' effectively discards 'const' from argument */ 1705 warning(346, function_name); 1706 } 1707 1708 if (!lstp->t_const && 1709 is_direct_function_call(rn, &function_name) && 1710 strcmp(function_name, "bsearch") == 0 && 1711 is_second_arg_const_pointer(rn)) { 1712 /* call to '%s' effectively discards 'const' from argument */ 1713 warning(346, function_name); 1714 } 1715 } 1716 1717 static void 1718 check_assign_void_pointer(op_t op, int arg, 1719 tspec_t lt, tspec_t lst, 1720 tspec_t rt, tspec_t rst) 1721 { 1722 const char *lts, *rts; 1723 1724 if (!(lt == PTR && rt == PTR && (lst == VOID || rst == VOID))) 1725 return; 1726 /* two pointers, at least one pointer to void */ 1727 1728 /* TODO: C99 behaves like C90 here. */ 1729 if (!((!allow_trad && !allow_c99) && (lst == FUNC || rst == FUNC))) 1730 return; 1731 /* comb. of ptr to func and ptr to void */ 1732 1733 *(lst == FUNC ? <s : &rts) = "function pointer"; 1734 *(lst == VOID ? <s : &rts) = "'void *'"; 1735 1736 switch (op) { 1737 case INIT: 1738 case RETURN: 1739 /* ANSI C forbids conversion of %s to %s */ 1740 warning(303, rts, lts); 1741 break; 1742 case FARG: 1743 /* ANSI C forbids conversion of %s to %s, arg #%d */ 1744 warning(304, rts, lts, arg); 1745 break; 1746 default: 1747 /* ANSI C forbids conversion of %s to %s, op %s */ 1748 warning(305, rts, lts, op_name(op)); 1749 break; 1750 } 1751 } 1752 1753 static bool 1754 check_assign_void_pointer_compat(op_t op, int arg, 1755 const type_t *const ltp, tspec_t const lt, 1756 const type_t *const lstp, tspec_t const lst, 1757 const tnode_t *const rn, 1758 const type_t *const rtp, tspec_t const rt, 1759 const type_t *const rstp, tspec_t const rst) 1760 { 1761 if (!(lt == PTR && rt == PTR && (lst == VOID || rst == VOID || 1762 types_compatible(lstp, rstp, 1763 true, false, NULL)))) 1764 return false; 1765 1766 /* compatible pointer types (qualifiers ignored) */ 1767 if (allow_c90 && 1768 ((!lstp->t_const && rstp->t_const) || 1769 (!lstp->t_volatile && rstp->t_volatile))) { 1770 /* left side has not all qualifiers of right */ 1771 switch (op) { 1772 case INIT: 1773 case RETURN: 1774 /* incompatible pointer types to '%s' and '%s' */ 1775 warning(182, type_name(lstp), type_name(rstp)); 1776 break; 1777 case FARG: 1778 /* converting '%s' to incompatible '%s' ... */ 1779 warning(153, 1780 type_name(rtp), type_name(ltp), arg); 1781 break; 1782 default: 1783 /* operands of '%s' have incompatible pointer ... */ 1784 warning(128, op_name(op), 1785 type_name(lstp), type_name(rstp)); 1786 break; 1787 } 1788 } 1789 1790 if (allow_c90) 1791 check_unconst_function(lstp, rn); 1792 1793 return true; 1794 } 1795 1796 static bool 1797 check_assign_pointer_integer(op_t op, int arg, 1798 const type_t *const ltp, tspec_t const lt, 1799 const type_t *const rtp, tspec_t const rt) 1800 { 1801 const char *lx, *rx; 1802 1803 if (!((lt == PTR && is_integer(rt)) || (is_integer(lt) && rt == PTR))) 1804 return false; 1805 1806 lx = lt == PTR ? "pointer" : "integer"; 1807 rx = rt == PTR ? "pointer" : "integer"; 1808 1809 switch (op) { 1810 case INIT: 1811 case RETURN: 1812 /* illegal combination of %s '%s' and %s '%s' */ 1813 warning(183, lx, type_name(ltp), rx, type_name(rtp)); 1814 break; 1815 case FARG: 1816 /* illegal combination of %s '%s' and %s '%s', arg #%d */ 1817 warning(154, 1818 lx, type_name(ltp), rx, type_name(rtp), arg); 1819 break; 1820 default: 1821 /* illegal combination of %s '%s' and %s '%s', op '%s' */ 1822 warning(123, 1823 lx, type_name(ltp), rx, type_name(rtp), op_name(op)); 1824 break; 1825 } 1826 return true; 1827 } 1828 1829 static bool 1830 check_assign_pointer(op_t op, int arg, 1831 const type_t *ltp, tspec_t lt, 1832 const type_t *rtp, tspec_t rt) 1833 { 1834 if (!(lt == PTR && rt == PTR)) 1835 return false; 1836 1837 switch (op) { 1838 case RETURN: 1839 warn_incompatible_pointers(NULL, ltp, rtp); 1840 break; 1841 case FARG: 1842 /* converting '%s' to incompatible '%s' for ... */ 1843 warning(153, type_name(rtp), type_name(ltp), arg); 1844 break; 1845 default: 1846 warn_incompatible_pointers(&modtab[op], ltp, rtp); 1847 break; 1848 } 1849 return true; 1850 } 1851 1852 static void 1853 warn_assign(op_t op, int arg, 1854 const type_t *ltp, tspec_t lt, 1855 const type_t *rtp, tspec_t rt) 1856 { 1857 switch (op) { 1858 case INIT: 1859 /* cannot initialize '%s' from '%s' */ 1860 error(185, type_name(ltp), type_name(rtp)); 1861 break; 1862 case RETURN: 1863 /* function has return type '%s' but returns '%s' */ 1864 error(211, type_name(ltp), type_name(rtp)); 1865 break; 1866 case FARG: 1867 /* passing '%s' to incompatible '%s', arg #%d */ 1868 warning(155, type_name(rtp), type_name(ltp), arg); 1869 break; 1870 default: 1871 warn_incompatible_types(op, ltp, lt, rtp, rt); 1872 break; 1873 } 1874 } 1875 1876 /* 1877 * Checks type compatibility for ASSIGN, INIT, FARG and RETURN 1878 * and prints warnings/errors if necessary. 1879 * Returns whether the types are (almost) compatible. 1880 */ 1881 static bool 1882 check_assign_types_compatible(op_t op, int arg, 1883 const tnode_t *ln, const tnode_t *rn) 1884 { 1885 tspec_t lt, rt, lst = NOTSPEC, rst = NOTSPEC; 1886 type_t *ltp, *rtp, *lstp = NULL, *rstp = NULL; 1887 1888 if ((lt = (ltp = ln->tn_type)->t_tspec) == PTR) 1889 lst = (lstp = ltp->t_subt)->t_tspec; 1890 if ((rt = (rtp = rn->tn_type)->t_tspec) == PTR) 1891 rst = (rstp = rtp->t_subt)->t_tspec; 1892 1893 if (lt == BOOL && is_scalar(rt)) /* C99 6.3.1.2 */ 1894 return true; 1895 1896 if (is_arithmetic(lt) && (is_arithmetic(rt) || rt == BOOL)) 1897 return true; 1898 1899 if (is_struct_or_union(lt) && is_struct_or_union(rt)) 1900 /* both are struct or union */ 1901 return ltp->t_str == rtp->t_str; 1902 1903 /* a null pointer may be assigned to any pointer */ 1904 if (lt == PTR && is_null_pointer(rn)) 1905 return true; 1906 1907 check_assign_void_pointer(op, arg, lt, lst, rt, rst); 1908 1909 if (check_assign_void_pointer_compat(op, arg, 1910 ltp, lt, lstp, lst, rn, rtp, rt, rstp, rst)) 1911 return true; 1912 1913 if (check_assign_pointer_integer(op, arg, ltp, lt, rtp, rt)) 1914 return true; 1915 1916 if (check_assign_pointer(op, arg, ltp, lt, rtp, rt)) 1917 return true; 1918 1919 warn_assign(op, arg, ltp, lt, rtp, rt); 1920 return false; 1921 } 1922 1923 /* Prints a warning if a strange operator is used on an enum type. */ 1924 static void 1925 check_bad_enum_operation(op_t op, const tnode_t *ln, const tnode_t *rn) 1926 { 1927 1928 if (!eflag) 1929 return; 1930 1931 /* 1932 * Enum as offset to a pointer is an exception (otherwise enums 1933 * could not be used as array indices). 1934 */ 1935 if (op == PLUS && 1936 ((ln->tn_type->t_is_enum && rn->tn_type->t_tspec == PTR) || 1937 (rn->tn_type->t_is_enum && ln->tn_type->t_tspec == PTR))) { 1938 return; 1939 } 1940 1941 /* dubious operation on enum, op '%s' */ 1942 warning(241, op_name(op)); 1943 } 1944 1945 /* 1946 * Prints a warning if an operator is applied to two different enum types. 1947 */ 1948 static void 1949 check_enum_type_mismatch(op_t op, int arg, const tnode_t *ln, const tnode_t *rn) 1950 { 1951 const mod_t *mp; 1952 1953 mp = &modtab[op]; 1954 1955 if (ln->tn_type->t_enum != rn->tn_type->t_enum) { 1956 switch (op) { 1957 case INIT: 1958 /* enum type mismatch between '%s' and '%s' in ... */ 1959 warning(210, 1960 type_name(ln->tn_type), type_name(rn->tn_type)); 1961 break; 1962 case FARG: 1963 /* function expects '%s', passing '%s' for arg #%d */ 1964 warning(156, 1965 type_name(ln->tn_type), type_name(rn->tn_type), 1966 arg); 1967 break; 1968 case RETURN: 1969 /* function has return type '%s' but returns '%s' */ 1970 warning(211, 1971 type_name(ln->tn_type), type_name(rn->tn_type)); 1972 break; 1973 default: 1974 /* enum type mismatch: '%s' '%s' '%s' */ 1975 warning(130, type_name(ln->tn_type), mp->m_name, 1976 type_name(rn->tn_type)); 1977 break; 1978 } 1979 } else if (Pflag && mp->m_comparison && op != EQ && op != NE) { 1980 if (eflag) 1981 /* dubious comparison of enums, op '%s' */ 1982 warning(243, mp->m_name); 1983 } 1984 } 1985 1986 /* Prints a warning if the operands mix between enum and integer. */ 1987 static void 1988 check_enum_int_mismatch(op_t op, int arg, const tnode_t *ln, const tnode_t *rn) 1989 { 1990 1991 if (!eflag) 1992 return; 1993 1994 switch (op) { 1995 case INIT: 1996 /* 1997 * Initialization with 0 is allowed. Otherwise, all implicit 1998 * initializations would need to be warned upon as well. 1999 */ 2000 if (!rn->tn_type->t_is_enum && rn->tn_op == CON && 2001 is_integer(rn->tn_type->t_tspec) && 2002 rn->tn_val->v_quad == 0) { 2003 return; 2004 } 2005 /* initialization of '%s' with '%s' */ 2006 warning(277, type_name(ln->tn_type), type_name(rn->tn_type)); 2007 break; 2008 case FARG: 2009 /* combination of '%s' and '%s', arg #%d */ 2010 warning(278, 2011 type_name(ln->tn_type), type_name(rn->tn_type), arg); 2012 break; 2013 case RETURN: 2014 /* combination of '%s' and '%s' in return */ 2015 warning(279, type_name(ln->tn_type), type_name(rn->tn_type)); 2016 break; 2017 default: 2018 /* combination of '%s' and '%s', op '%s' */ 2019 warning(242, type_name(ln->tn_type), type_name(rn->tn_type), 2020 op_name(op)); 2021 break; 2022 } 2023 } 2024 2025 static void 2026 check_enum_array_index(const tnode_t *ln, const tnode_t *rn) 2027 { 2028 int max_array_index; 2029 int64_t max_enum_value; 2030 const struct sym *ec, *max_ec; 2031 const type_t *lt, *rt; 2032 2033 if (ln->tn_op != ADDR || ln->tn_left->tn_op != NAME) 2034 return; 2035 2036 lt = ln->tn_left->tn_type; 2037 if (lt->t_tspec != ARRAY || lt->t_incomplete_array) 2038 return; 2039 2040 if (rn->tn_op != CVT || !rn->tn_type->t_is_enum) 2041 return; 2042 if (rn->tn_left->tn_op != LOAD) 2043 return; 2044 2045 rt = rn->tn_left->tn_type; 2046 ec = rt->t_enum->en_first_enumerator; 2047 max_ec = ec; 2048 lint_assert(ec != NULL); 2049 for (ec = ec->s_next; ec != NULL; ec = ec->s_next) 2050 if (ec->u.s_enum_constant > max_ec->u.s_enum_constant) 2051 max_ec = ec; 2052 2053 max_enum_value = max_ec->u.s_enum_constant; 2054 lint_assert(INT_MIN <= max_enum_value && max_enum_value <= INT_MAX); 2055 2056 max_array_index = lt->t_dim - 1; 2057 if (max_enum_value == max_array_index) 2058 return; 2059 2060 /* 2061 * If the largest enum constant is named '*_NUM_*', it is typically 2062 * not part of the allowed enum values but a marker for the number 2063 * of actual enum values. 2064 */ 2065 if (max_enum_value == max_array_index + 1 && 2066 (strstr(max_ec->s_name, "NUM") != NULL || 2067 strstr(max_ec->s_name, "num") != NULL)) 2068 return; 2069 2070 /* maximum value %d of '%s' does not match maximum array index %d */ 2071 warning(348, (int)max_enum_value, type_name(rt), max_array_index); 2072 print_previous_declaration(max_ec); 2073 } 2074 2075 /* 2076 * Build and initialize a new node. 2077 */ 2078 static tnode_t * 2079 new_tnode(op_t op, bool sys, type_t *type, tnode_t *ln, tnode_t *rn) 2080 { 2081 tnode_t *ntn; 2082 tspec_t t; 2083 #if 0 /* not yet */ 2084 size_t l; 2085 uint64_t rnum; 2086 #endif 2087 2088 ntn = expr_alloc_tnode(); 2089 2090 ntn->tn_op = op; 2091 ntn->tn_type = type; 2092 ntn->tn_sys = sys; 2093 ntn->tn_left = ln; 2094 ntn->tn_right = rn; 2095 2096 switch (op) { 2097 #if 0 /* not yet */ 2098 case SHR: 2099 if (rn->tn_op != CON) 2100 break; 2101 rnum = rn->tn_val->v_quad; 2102 l = type_size_in_bits(ln->tn_type) / CHAR_SIZE; 2103 t = ln->tn_type->t_tspec; 2104 switch (l) { 2105 case 8: 2106 if (rnum >= 56) 2107 t = UCHAR; 2108 else if (rnum >= 48) 2109 t = USHORT; 2110 else if (rnum >= 32) 2111 t = UINT; 2112 break; 2113 case 4: 2114 if (rnum >= 24) 2115 t = UCHAR; 2116 else if (rnum >= 16) 2117 t = USHORT; 2118 break; 2119 case 2: 2120 if (rnum >= 8) 2121 t = UCHAR; 2122 break; 2123 default: 2124 break; 2125 } 2126 if (t != ln->tn_type->t_tspec) 2127 ntn->tn_type->t_tspec = t; 2128 break; 2129 #endif 2130 case INDIR: 2131 case FSEL: 2132 lint_assert(ln->tn_type->t_tspec == PTR); 2133 t = ln->tn_type->t_subt->t_tspec; 2134 if (t != FUNC && t != VOID) 2135 ntn->tn_lvalue = true; 2136 break; 2137 default: 2138 break; 2139 } 2140 2141 return ntn; 2142 } 2143 2144 /* 2145 * Performs the "integer promotions" (C99 6.3.1.1p2), which convert small 2146 * integer types to either int or unsigned int. 2147 * 2148 * If allow_c90 is unset or the operand is a function argument with no type 2149 * information (no prototype or variable # of args), converts float to double. 2150 */ 2151 tnode_t * 2152 promote(op_t op, bool farg, tnode_t *tn) 2153 { 2154 tspec_t t; 2155 type_t *ntp; 2156 unsigned int len; 2157 2158 t = tn->tn_type->t_tspec; 2159 2160 if (!is_arithmetic(t)) 2161 return tn; 2162 2163 if (allow_c90) { 2164 /* 2165 * C99 6.3.1.1p2 requires for types with lower rank than int 2166 * that "If an int can represent all the values of the 2167 * original type, the value is converted to an int; otherwise 2168 * it is converted to an unsigned int", and that "All other 2169 * types are unchanged by the integer promotions". 2170 */ 2171 if (tn->tn_type->t_bitfield) { 2172 len = tn->tn_type->t_flen; 2173 if (len < size_in_bits(INT)) { 2174 t = INT; 2175 } else if (len == size_in_bits(INT)) { 2176 t = is_uinteger(t) ? UINT : INT; 2177 } 2178 } else if (t == CHAR || t == UCHAR || t == SCHAR) { 2179 t = (size_in_bits(CHAR) < size_in_bits(INT) 2180 || t != UCHAR) ? INT : UINT; 2181 } else if (t == SHORT || t == USHORT) { 2182 t = (size_in_bits(SHORT) < size_in_bits(INT) 2183 || t == SHORT) ? INT : UINT; 2184 } else if (t == ENUM) { 2185 t = INT; 2186 } else if (farg && t == FLOAT) { 2187 t = DOUBLE; 2188 } 2189 } else { 2190 /* 2191 * In traditional C, keep unsigned and promote FLOAT 2192 * to DOUBLE. 2193 */ 2194 if (t == UCHAR || t == USHORT) { 2195 t = UINT; 2196 } else if (t == CHAR || t == SCHAR || t == SHORT) { 2197 t = INT; 2198 } else if (t == FLOAT) { 2199 t = DOUBLE; 2200 } else if (t == ENUM) { 2201 t = INT; 2202 } 2203 } 2204 2205 if (t != tn->tn_type->t_tspec) { 2206 ntp = expr_dup_type(tn->tn_type); 2207 ntp->t_tspec = t; 2208 /* 2209 * Keep t_is_enum even though t_tspec gets converted from 2210 * ENUM to INT, so we are later able to check compatibility 2211 * of enum types. 2212 */ 2213 tn = convert(op, 0, ntp, tn); 2214 } 2215 2216 return tn; 2217 } 2218 2219 /* 2220 * Apply the "usual arithmetic conversions" (C99 6.3.1.8). 2221 * 2222 * This gives both operands the same type. 2223 * This is done in different ways for traditional C and C90. 2224 */ 2225 static void 2226 balance(op_t op, tnode_t **lnp, tnode_t **rnp) 2227 { 2228 tspec_t lt, rt, t; 2229 int i; 2230 bool u; 2231 type_t *ntp; 2232 static const tspec_t tl[] = { 2233 LDOUBLE, DOUBLE, FLOAT, 2234 #ifdef INT128_SIZE 2235 UINT128, INT128, 2236 #endif 2237 UQUAD, QUAD, 2238 ULONG, LONG, 2239 UINT, INT, 2240 }; 2241 2242 lt = (*lnp)->tn_type->t_tspec; 2243 rt = (*rnp)->tn_type->t_tspec; 2244 2245 if (!is_arithmetic(lt) || !is_arithmetic(rt)) 2246 return; 2247 2248 if (allow_c90) { 2249 if (lt == rt) { 2250 t = lt; 2251 } else if (lt == LCOMPLEX || rt == LCOMPLEX) { 2252 t = LCOMPLEX; 2253 } else if (lt == DCOMPLEX || rt == DCOMPLEX) { 2254 t = DCOMPLEX; 2255 } else if (lt == FCOMPLEX || rt == FCOMPLEX) { 2256 t = FCOMPLEX; 2257 } else if (lt == LDOUBLE || rt == LDOUBLE) { 2258 t = LDOUBLE; 2259 } else if (lt == DOUBLE || rt == DOUBLE) { 2260 t = DOUBLE; 2261 } else if (lt == FLOAT || rt == FLOAT) { 2262 t = FLOAT; 2263 } else { 2264 /* 2265 * If type A has more bits than type B it should 2266 * be able to hold all possible values of type B. 2267 */ 2268 if (size_in_bits(lt) > size_in_bits(rt)) { 2269 t = lt; 2270 } else if (size_in_bits(lt) < size_in_bits(rt)) { 2271 t = rt; 2272 } else { 2273 for (i = 3; tl[i] != INT; i++) { 2274 if (tl[i] == lt || tl[i] == rt) 2275 break; 2276 } 2277 if ((is_uinteger(lt) || is_uinteger(rt)) && 2278 !is_uinteger(tl[i])) { 2279 i--; 2280 } 2281 t = tl[i]; 2282 } 2283 } 2284 } else { 2285 /* Keep unsigned in traditional C */ 2286 u = is_uinteger(lt) || is_uinteger(rt); 2287 for (i = 0; tl[i] != INT; i++) { 2288 if (lt == tl[i] || rt == tl[i]) 2289 break; 2290 } 2291 t = tl[i]; 2292 if (u && is_integer(t) && !is_uinteger(t)) 2293 t = unsigned_type(t); 2294 } 2295 2296 if (t != lt) { 2297 ntp = expr_dup_type((*lnp)->tn_type); 2298 ntp->t_tspec = t; 2299 /* usual arithmetic conversion for '%s' from '%s' to '%s' */ 2300 query_message(4, op_name(op), 2301 type_name((*lnp)->tn_type), type_name(ntp)); 2302 *lnp = convert(op, 0, ntp, *lnp); 2303 } 2304 if (t != rt) { 2305 ntp = expr_dup_type((*rnp)->tn_type); 2306 ntp->t_tspec = t; 2307 /* usual arithmetic conversion for '%s' from '%s' to '%s' */ 2308 query_message(4, op_name(op), 2309 type_name((*rnp)->tn_type), type_name(ntp)); 2310 *rnp = convert(op, 0, ntp, *rnp); 2311 } 2312 } 2313 2314 static void 2315 convert_integer_from_floating(op_t op, const type_t *tp, const tnode_t *tn) 2316 { 2317 2318 if (op == CVT) 2319 /* cast from floating point '%s' to integer '%s' */ 2320 query_message(2, type_name(tn->tn_type), type_name(tp)); 2321 else 2322 /* implicit conversion from floating point '%s' to ... */ 2323 query_message(1, type_name(tn->tn_type), type_name(tp)); 2324 } 2325 2326 /* 2327 * Insert a conversion operator, which converts the type of the node 2328 * to another given type. 2329 * 2330 * Possible values for 'op': 2331 * CVT a cast-expression 2332 * binary integer promotion for one of the operands, or a usual 2333 * arithmetic conversion 2334 * binary plain or compound assignments to bit-fields 2335 * FARG 'arg' is the number of the argument (used for warnings) 2336 * NOOP several other implicit conversions 2337 * ... 2338 */ 2339 tnode_t * 2340 convert(op_t op, int arg, type_t *tp, tnode_t *tn) 2341 { 2342 tnode_t *ntn; 2343 tspec_t nt, ot; 2344 2345 nt = tp->t_tspec; 2346 ot = tn->tn_type->t_tspec; 2347 2348 if (allow_trad && allow_c90 && op == FARG) 2349 check_prototype_conversion(arg, nt, ot, tp, tn); 2350 2351 if (nt == BOOL) { 2352 /* No further checks. */ 2353 2354 } else if (is_integer(nt)) { 2355 if (ot == BOOL) { 2356 /* No further checks. */ 2357 } else if (is_integer(ot)) { 2358 convert_integer_from_integer(op, arg, nt, ot, tp, tn); 2359 } else if (is_floating(ot)) { 2360 convert_integer_from_floating(op, tp, tn); 2361 } else if (ot == PTR) { 2362 convert_integer_from_pointer(op, nt, tp, tn); 2363 } 2364 2365 } else if (is_floating(nt)) { 2366 /* No further checks. */ 2367 2368 } else if (nt == PTR) { 2369 if (is_null_pointer(tn)) { 2370 /* a null pointer may be assigned to any pointer. */ 2371 } else if (ot == PTR && op == CVT) { 2372 convert_pointer_from_pointer(tp, tn); 2373 } 2374 } 2375 2376 ntn = expr_alloc_tnode(); 2377 ntn->tn_op = CVT; 2378 ntn->tn_type = tp; 2379 ntn->tn_cast = op == CVT; 2380 ntn->tn_sys |= tn->tn_sys; 2381 ntn->tn_right = NULL; 2382 if (tn->tn_op != CON || nt == VOID) { 2383 ntn->tn_left = tn; 2384 } else { 2385 ntn->tn_op = CON; 2386 ntn->tn_val = expr_zero_alloc(sizeof(*ntn->tn_val)); 2387 convert_constant(op, arg, ntn->tn_type, ntn->tn_val, 2388 tn->tn_val); 2389 } 2390 2391 return ntn; 2392 } 2393 2394 static bool 2395 should_warn_about_prototype_conversion(tspec_t nt, 2396 tspec_t ot, const tnode_t *ptn) 2397 { 2398 2399 if (nt == ot) 2400 return false; 2401 2402 if (nt == ENUM && ot == INT) 2403 return false; 2404 2405 if (is_floating(nt) != is_floating(ot) || 2406 portable_size_in_bits(nt) != portable_size_in_bits(ot)) { 2407 /* representation and/or width change */ 2408 if (!is_integer(ot)) 2409 return true; 2410 /* 2411 * XXX: Investigate whether this rule makes sense; see 2412 * tests/usr.bin/xlint/lint1/platform_long.c. 2413 */ 2414 return portable_size_in_bits(ot) > portable_size_in_bits(INT); 2415 } 2416 2417 if (!hflag) 2418 return false; 2419 2420 /* 2421 * If the types differ only in sign and the argument has the same 2422 * representation in both types, print no warning. 2423 */ 2424 if (ptn->tn_op == CON && is_integer(nt) && 2425 signed_type(nt) == signed_type(ot) && 2426 !msb(ptn->tn_val->v_quad, ot)) 2427 return false; 2428 2429 return true; 2430 } 2431 2432 /* 2433 * Warn if a prototype causes a type conversion that is different from what 2434 * would happen to the same argument in the absence of a prototype. This 2435 * check is intended for code that needs to stay compatible with pre-C90 C. 2436 * 2437 * Errors/warnings about illegal type combinations are already printed 2438 * in check_assign_types_compatible(). 2439 */ 2440 static void 2441 check_prototype_conversion(int arg, tspec_t nt, tspec_t ot, type_t *tp, 2442 tnode_t *tn) 2443 { 2444 tnode_t *ptn; 2445 2446 if (!is_arithmetic(nt) || !is_arithmetic(ot)) 2447 return; 2448 2449 /* 2450 * If the type of the formal parameter is char/short, a warning 2451 * would be useless, because functions declared the old style 2452 * can't expect char/short arguments. 2453 */ 2454 if (nt == CHAR || nt == SCHAR || nt == UCHAR || 2455 nt == SHORT || nt == USHORT) 2456 return; 2457 2458 /* apply the default promotion */ 2459 ptn = promote(NOOP, true, tn); 2460 ot = ptn->tn_type->t_tspec; 2461 2462 if (should_warn_about_prototype_conversion(nt, ot, ptn)) { 2463 /* argument #%d is converted from '%s' to '%s' ... */ 2464 warning(259, arg, type_name(tn->tn_type), type_name(tp)); 2465 } 2466 } 2467 2468 /* 2469 * When converting a large integer type to a small integer type, in some 2470 * cases the value of the actual expression is further restricted than the 2471 * type bounds, such as in (expr & 0xFF) or (expr % 100) or (expr >> 24). 2472 * 2473 * See new_tnode, the '#if 0' code for SHR. 2474 */ 2475 static bool 2476 can_represent(const type_t *tp, const tnode_t *tn) 2477 { 2478 2479 debug_step("%s: type '%s'", __func__, type_name(tp)); 2480 debug_node(tn); 2481 2482 uint64_t nmask = value_bits(width_in_bits(tp)); 2483 if (!is_uinteger(tp->t_tspec)) 2484 nmask >>= 1; 2485 2486 integer_constraints c = ic_expr(tn); 2487 if ((~c.bclr & ~nmask) == 0) 2488 return true; 2489 2490 return false; 2491 } 2492 2493 static void 2494 convert_integer_from_integer(op_t op, int arg, tspec_t nt, tspec_t ot, 2495 type_t *tp, tnode_t *tn) 2496 { 2497 2498 if (tn->tn_op == CON) 2499 return; 2500 2501 if (op == CVT) 2502 return; 2503 2504 if (Pflag && pflag && aflag > 0 && 2505 portable_size_in_bits(nt) > portable_size_in_bits(ot) && 2506 is_uinteger(nt) != is_uinteger(ot)) { 2507 if (op == FARG) { 2508 /* conversion to '%s' may sign-extend ... */ 2509 warning(297, type_name(tp), arg); 2510 } else { 2511 /* conversion to '%s' may sign-extend ... */ 2512 warning(131, type_name(tp)); 2513 } 2514 } 2515 2516 if (Pflag && portable_size_in_bits(nt) > portable_size_in_bits(ot) && 2517 (tn->tn_op == PLUS || tn->tn_op == MINUS || tn->tn_op == MULT || 2518 tn->tn_op == SHL)) { 2519 /* suggest cast from '%s' to '%s' on op '%s' to ... */ 2520 warning(324, type_name(gettyp(ot)), type_name(tp), 2521 op_name(tn->tn_op)); 2522 } 2523 2524 if (aflag > 0 && 2525 portable_size_in_bits(nt) < portable_size_in_bits(ot) && 2526 (ot == LONG || ot == ULONG || ot == QUAD || ot == UQUAD || 2527 aflag > 1) && 2528 !can_represent(tp, tn)) { 2529 if (op == FARG) { 2530 /* conversion from '%s' to '%s' may lose ... */ 2531 warning(298, 2532 type_name(tn->tn_type), type_name(tp), arg); 2533 } else { 2534 /* conversion from '%s' to '%s' may lose accuracy */ 2535 warning(132, 2536 type_name(tn->tn_type), type_name(tp)); 2537 } 2538 } 2539 2540 if (is_uinteger(nt) != is_uinteger(ot)) 2541 /* implicit conversion changes sign from '%s' to '%s' */ 2542 query_message(3, type_name(tn->tn_type), type_name(tp)); 2543 } 2544 2545 static void 2546 convert_integer_from_pointer(op_t op, tspec_t nt, type_t *tp, tnode_t *tn) 2547 { 2548 2549 if (tn->tn_op == CON) 2550 return; 2551 if (op != CVT) 2552 return; /* We got already an error. */ 2553 if (portable_size_in_bits(nt) >= portable_size_in_bits(PTR)) 2554 return; 2555 2556 if (pflag && size_in_bits(nt) >= size_in_bits(PTR)) { 2557 /* conversion of pointer to '%s' may lose bits */ 2558 warning(134, type_name(tp)); 2559 } else { 2560 /* conversion of pointer to '%s' loses bits */ 2561 warning(133, type_name(tp)); 2562 } 2563 } 2564 2565 static bool 2566 struct_starts_with(const type_t *struct_tp, const type_t *member_tp) 2567 { 2568 2569 return struct_tp->t_str->sou_first_member != NULL && 2570 types_compatible(struct_tp->t_str->sou_first_member->s_type, 2571 member_tp, true, false, NULL); 2572 } 2573 2574 static bool 2575 is_byte_array(const type_t *tp) 2576 { 2577 2578 return tp->t_tspec == ARRAY && 2579 (tp->t_subt->t_tspec == CHAR || tp->t_subt->t_tspec == UCHAR); 2580 } 2581 2582 static bool 2583 should_warn_about_pointer_cast(const type_t *nstp, tspec_t nst, 2584 const type_t *ostp, tspec_t ost) 2585 { 2586 2587 while (nst == ARRAY) 2588 nstp = nstp->t_subt, nst = nstp->t_tspec; 2589 while (ost == ARRAY) 2590 ostp = ostp->t_subt, ost = ostp->t_tspec; 2591 2592 if (nst == STRUCT && ost == STRUCT && 2593 (struct_starts_with(nstp, ostp) || 2594 struct_starts_with(ostp, nstp))) 2595 return false; 2596 2597 if (is_incomplete(nstp) || is_incomplete(ostp)) 2598 return false; 2599 2600 if (nst == CHAR || nst == UCHAR) 2601 return false; /* for the sake of traditional C code */ 2602 if (ost == CHAR || ost == UCHAR) 2603 return false; /* for the sake of traditional C code */ 2604 2605 /* Allow cast between pointers to sockaddr variants. */ 2606 if (nst == STRUCT && ost == STRUCT) { 2607 debug_type(nstp); 2608 debug_type(ostp); 2609 const sym_t *nmem = nstp->t_str->sou_first_member; 2610 const sym_t *omem = ostp->t_str->sou_first_member; 2611 while (nmem != NULL && omem != NULL && 2612 types_compatible(nmem->s_type, omem->s_type, 2613 true, false, NULL)) 2614 nmem = nmem->s_next, omem = omem->s_next; 2615 if (nmem != NULL && is_byte_array(nmem->s_type)) 2616 return false; 2617 if (omem != NULL && is_byte_array(omem->s_type)) 2618 return false; 2619 if (nmem == NULL && omem == NULL) 2620 return false; 2621 } 2622 2623 if (is_struct_or_union(nst) && nstp->t_str != ostp->t_str) 2624 return true; 2625 2626 return portable_size_in_bits(nst) != portable_size_in_bits(ost); 2627 } 2628 2629 static void 2630 convert_pointer_from_pointer(type_t *ntp, tnode_t *tn) 2631 { 2632 const type_t *nstp, *otp, *ostp; 2633 tspec_t nst, ost; 2634 const char *nts, *ots; 2635 2636 nstp = ntp->t_subt; 2637 otp = tn->tn_type; 2638 ostp = otp->t_subt; 2639 nst = nstp->t_tspec; 2640 ost = ostp->t_tspec; 2641 2642 if (nst == VOID || ost == VOID) { 2643 /* TODO: C99 behaves like C90 here. */ 2644 if ((!allow_trad && !allow_c99) && (nst == FUNC || ost == FUNC)) { 2645 /* null pointers are already handled in convert() */ 2646 *(nst == FUNC ? &nts : &ots) = "function pointer"; 2647 *(nst == VOID ? &nts : &ots) = "'void *'"; 2648 /* ANSI C forbids conversion of %s to %s */ 2649 warning(303, ots, nts); 2650 } 2651 return; 2652 } else if (nst == FUNC && ost == FUNC) { 2653 return; 2654 } else if (nst == FUNC || ost == FUNC) { 2655 /* converting '%s' to '%s' is questionable */ 2656 warning(229, type_name(otp), type_name(ntp)); 2657 return; 2658 } 2659 2660 if (hflag && alignment_in_bits(nstp) > alignment_in_bits(ostp) && 2661 ost != CHAR && ost != UCHAR && 2662 !is_incomplete(ostp)) { 2663 /* converting '%s' to '%s' increases alignment ... */ 2664 warning(135, type_name(otp), type_name(ntp), 2665 alignment_in_bits(ostp) / CHAR_SIZE, 2666 alignment_in_bits(nstp) / CHAR_SIZE); 2667 } 2668 2669 if (cflag && should_warn_about_pointer_cast(nstp, nst, ostp, ost)) { 2670 /* pointer cast from '%s' to '%s' may be troublesome */ 2671 warning(247, type_name(otp), type_name(ntp)); 2672 } 2673 } 2674 2675 static void 2676 convert_constant_floating(op_t op, int arg, tspec_t ot, const type_t *tp, 2677 tspec_t nt, val_t *v, val_t *nv) 2678 { 2679 ldbl_t max = 0.0, min = 0.0; 2680 2681 switch (nt) { 2682 case CHAR: 2683 max = TARG_CHAR_MAX; min = TARG_CHAR_MIN; break; 2684 case UCHAR: 2685 max = TARG_UCHAR_MAX; min = 0; break; 2686 case SCHAR: 2687 max = TARG_SCHAR_MAX; min = TARG_SCHAR_MIN; break; 2688 case SHORT: 2689 max = TARG_SHRT_MAX; min = TARG_SHRT_MIN; break; 2690 case USHORT: 2691 max = TARG_USHRT_MAX; min = 0; break; 2692 case ENUM: 2693 case INT: 2694 max = TARG_INT_MAX; min = TARG_INT_MIN; break; 2695 case UINT: 2696 max = TARG_UINT_MAX; min = 0; break; 2697 case LONG: 2698 max = TARG_LONG_MAX; min = TARG_LONG_MIN; break; 2699 case ULONG: 2700 max = TARG_ULONG_MAX; min = 0; break; 2701 case QUAD: 2702 max = QUAD_MAX; min = QUAD_MIN; break; 2703 case UQUAD: 2704 max = UQUAD_MAX; min = 0; break; 2705 case FLOAT: 2706 case FCOMPLEX: 2707 max = FLT_MAX; min = -FLT_MAX; break; 2708 case DOUBLE: 2709 case DCOMPLEX: 2710 max = DBL_MAX; min = -DBL_MAX; break; 2711 case PTR: 2712 /* Got already an error because of float --> ptr */ 2713 case LDOUBLE: 2714 case LCOMPLEX: 2715 /* LINTED 248 */ 2716 max = LDBL_MAX; min = -max; break; 2717 default: 2718 lint_assert(/*CONSTCOND*/false); 2719 } 2720 if (v->v_ldbl > max || v->v_ldbl < min) { 2721 lint_assert(nt != LDOUBLE); 2722 if (op == FARG) { 2723 /* conversion of '%s' to '%s' is out of range, ... */ 2724 warning(295, 2725 type_name(gettyp(ot)), type_name(tp), arg); 2726 } else { 2727 /* conversion of '%s' to '%s' is out of range */ 2728 warning(119, 2729 type_name(gettyp(ot)), type_name(tp)); 2730 } 2731 v->v_ldbl = v->v_ldbl > 0 ? max : min; 2732 } 2733 2734 if (nt == FLOAT) { 2735 nv->v_ldbl = (float)v->v_ldbl; 2736 } else if (nt == DOUBLE) { 2737 nv->v_ldbl = (double)v->v_ldbl; 2738 } else if (nt == LDOUBLE) { 2739 nv->v_ldbl = v->v_ldbl; 2740 } else { 2741 nv->v_quad = (int64_t)v->v_ldbl; 2742 } 2743 } 2744 2745 static bool 2746 convert_constant_to_floating(tspec_t nt, val_t *nv, 2747 tspec_t ot, const val_t *v) 2748 { 2749 if (nt == FLOAT) { 2750 nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ? 2751 (float)(uint64_t)v->v_quad : (float)v->v_quad; 2752 } else if (nt == DOUBLE) { 2753 nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ? 2754 (double)(uint64_t)v->v_quad : (double)v->v_quad; 2755 } else if (nt == LDOUBLE) { 2756 nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ? 2757 (ldbl_t)(uint64_t)v->v_quad : (ldbl_t)v->v_quad; 2758 } else 2759 return false; 2760 return true; 2761 } 2762 2763 /* 2764 * Print a warning if bits which were set are lost due to the conversion. 2765 * This can happen with operator ORASS only. 2766 */ 2767 static void 2768 convert_constant_check_range_bitor(size_t nsz, size_t osz, const val_t *v, 2769 uint64_t xmask, op_t op) 2770 { 2771 if (nsz < osz && (v->v_quad & xmask) != 0) { 2772 /* constant truncated by conversion, op '%s' */ 2773 warning(306, op_name(op)); 2774 } 2775 } 2776 2777 /* 2778 * Print a warning if additional bits are not all 1 2779 * and the most significant bit of the old value is 1, 2780 * or if at least one (but not all) removed bit was 0. 2781 */ 2782 static void 2783 convert_constant_check_range_bitand(size_t nsz, size_t osz, 2784 uint64_t xmask, const val_t *nv, 2785 tspec_t ot, const val_t *v, 2786 const type_t *tp, op_t op) 2787 { 2788 if (nsz > osz && 2789 (nv->v_quad & bit((unsigned int)(osz - 1))) != 0 && 2790 (nv->v_quad & xmask) != xmask) { 2791 /* extra bits set to 0 in conversion of '%s' to '%s', ... */ 2792 warning(309, type_name(gettyp(ot)), 2793 type_name(tp), op_name(op)); 2794 } else if (nsz < osz && 2795 (v->v_quad & xmask) != xmask && 2796 (v->v_quad & xmask) != 0) { 2797 /* constant truncated by conversion, op '%s' */ 2798 warning(306, op_name(op)); 2799 } 2800 } 2801 2802 static void 2803 convert_constant_check_range_signed(op_t op, int arg) 2804 { 2805 if (op == ASSIGN) { 2806 /* assignment of negative constant to unsigned type */ 2807 warning(164); 2808 } else if (op == INIT) { 2809 /* initialization of unsigned with negative constant */ 2810 warning(221); 2811 } else if (op == FARG) { 2812 /* conversion of negative constant to unsigned type, ... */ 2813 warning(296, arg); 2814 } else if (modtab[op].m_comparison) { 2815 /* handled by check_integer_comparison() */ 2816 } else { 2817 /* conversion of negative constant to unsigned type */ 2818 warning(222); 2819 } 2820 } 2821 2822 /* 2823 * Loss of significant bit(s). All truncated bits 2824 * of unsigned types or all truncated bits plus the 2825 * msb of the target for signed types are considered 2826 * to be significant bits. Loss of significant bits 2827 * means that at least one of the bits was set in an 2828 * unsigned type or that at least one but not all of 2829 * the bits was set in a signed type. 2830 * Loss of significant bits means that it is not 2831 * possible, also not with necessary casts, to convert 2832 * back to the original type. A example for a 2833 * necessary cast is: 2834 * char c; int i; c = 128; 2835 * i = c; ** yields -128 ** 2836 * i = (unsigned char)c; ** yields 128 ** 2837 */ 2838 static void 2839 convert_constant_check_range_truncated(op_t op, int arg, const type_t *tp, 2840 tspec_t ot) 2841 { 2842 if (op == ASSIGN && tp->t_bitfield) { 2843 /* precision lost in bit-field assignment */ 2844 warning(166); 2845 } else if (op == ASSIGN) { 2846 /* constant truncated by assignment */ 2847 warning(165); 2848 } else if (op == INIT && tp->t_bitfield) { 2849 /* bit-field initializer does not fit */ 2850 warning(180); 2851 } else if (op == INIT) { 2852 /* initializer does not fit */ 2853 warning(178); 2854 } else if (op == CASE) { 2855 /* case label affected by conversion */ 2856 warning(196); 2857 } else if (op == FARG) { 2858 /* conversion of '%s' to '%s' is out of range, arg #%d */ 2859 warning(295, 2860 type_name(gettyp(ot)), type_name(tp), arg); 2861 } else { 2862 /* conversion of '%s' to '%s' is out of range */ 2863 warning(119, 2864 type_name(gettyp(ot)), type_name(tp)); 2865 } 2866 } 2867 2868 static void 2869 convert_constant_check_range_loss(op_t op, int arg, const type_t *tp, 2870 tspec_t ot) 2871 { 2872 if (op == ASSIGN && tp->t_bitfield) { 2873 /* precision lost in bit-field assignment */ 2874 warning(166); 2875 } else if (op == INIT && tp->t_bitfield) { 2876 /* bit-field initializer out of range */ 2877 warning(11); 2878 } else if (op == CASE) { 2879 /* case label affected by conversion */ 2880 warning(196); 2881 } else if (op == FARG) { 2882 /* conversion of '%s' to '%s' is out of range, arg #%d */ 2883 warning(295, 2884 type_name(gettyp(ot)), type_name(tp), arg); 2885 } else { 2886 /* conversion of '%s' to '%s' is out of range */ 2887 warning(119, 2888 type_name(gettyp(ot)), type_name(tp)); 2889 } 2890 } 2891 2892 static void 2893 convert_constant_check_range(tspec_t ot, const type_t *tp, tspec_t nt, 2894 op_t op, int arg, const val_t *v, val_t *nv) 2895 { 2896 unsigned int obitsz, nbitsz; 2897 uint64_t xmask, xmsk1; 2898 2899 obitsz = size_in_bits(ot); 2900 nbitsz = tp->t_bitfield ? tp->t_flen : size_in_bits(nt); 2901 xmask = value_bits(nbitsz) ^ value_bits(obitsz); 2902 xmsk1 = value_bits(nbitsz) ^ value_bits(obitsz - 1); 2903 /* 2904 * For bitwise operations we are not interested in the arithmetic 2905 * value, but in the bits itself. 2906 */ 2907 if (op == ORASS || op == BITOR || op == BITXOR) { 2908 convert_constant_check_range_bitor( 2909 nbitsz, obitsz, v, xmask, op); 2910 } else if (op == ANDASS || op == BITAND) { 2911 convert_constant_check_range_bitand( 2912 nbitsz, obitsz, xmask, nv, ot, v, tp, op); 2913 } else if ((nt != PTR && is_uinteger(nt)) && 2914 (ot != PTR && !is_uinteger(ot)) && 2915 v->v_quad < 0) { 2916 convert_constant_check_range_signed(op, arg); 2917 } else if (nv->v_quad != v->v_quad && nbitsz <= obitsz && 2918 (v->v_quad & xmask) != 0 && 2919 (is_uinteger(ot) || (v->v_quad & xmsk1) != xmsk1)) { 2920 convert_constant_check_range_truncated(op, arg, tp, ot); 2921 } else if (nv->v_quad != v->v_quad) { 2922 convert_constant_check_range_loss(op, arg, tp, ot); 2923 } 2924 } 2925 2926 /* 2927 * Converts a typed constant to a constant of another type. 2928 * 2929 * op operator which requires conversion 2930 * arg if op is FARG, # of argument 2931 * tp type in which to convert the constant 2932 * nv new constant 2933 * v old constant 2934 */ 2935 void 2936 convert_constant(op_t op, int arg, const type_t *tp, val_t *nv, val_t *v) 2937 { 2938 tspec_t ot, nt; 2939 unsigned int sz; 2940 bool range_check; 2941 2942 /* 2943 * TODO: make 'v' const; the name of this function does not suggest 2944 * that it modifies 'v'. 2945 */ 2946 ot = v->v_tspec; 2947 nt = nv->v_tspec = tp->t_tspec; 2948 range_check = false; 2949 2950 if (nt == BOOL) { /* C99 6.3.1.2 */ 2951 nv->v_unsigned_since_c90 = false; 2952 nv->v_quad = is_nonzero_val(v) ? 1 : 0; 2953 return; 2954 } 2955 2956 if (ot == FLOAT || ot == DOUBLE || ot == LDOUBLE) { 2957 convert_constant_floating(op, arg, ot, tp, nt, v, nv); 2958 } else if (!convert_constant_to_floating(nt, nv, ot, v)) { 2959 range_check = true; /* Check for lost precision. */ 2960 nv->v_quad = v->v_quad; 2961 } 2962 2963 if (allow_trad && allow_c90 && v->v_unsigned_since_c90 && 2964 (is_floating(nt) || ( 2965 (is_integer(nt) && !is_uinteger(nt) && 2966 portable_size_in_bits(nt) > portable_size_in_bits(ot))))) { 2967 /* ANSI C treats constant as unsigned */ 2968 warning(157); 2969 v->v_unsigned_since_c90 = false; 2970 } 2971 2972 if (is_integer(nt)) { 2973 sz = tp->t_bitfield ? tp->t_flen : size_in_bits(nt); 2974 nv->v_quad = convert_integer(nv->v_quad, nt, sz); 2975 } 2976 2977 if (range_check && op != CVT) 2978 convert_constant_check_range(ot, tp, nt, op, arg, v, nv); 2979 } 2980 2981 /* 2982 * Called if incompatible types were detected. 2983 * Prints a appropriate warning. 2984 */ 2985 static void 2986 warn_incompatible_types(op_t op, 2987 const type_t *ltp, tspec_t lt, 2988 const type_t *rtp, tspec_t rt) 2989 { 2990 const mod_t *mp; 2991 2992 mp = &modtab[op]; 2993 2994 if (lt == VOID || (mp->m_binary && rt == VOID)) { 2995 /* void type illegal in expression */ 2996 error(109); 2997 } else if (op == ASSIGN) { 2998 /* cannot assign to '%s' from '%s' */ 2999 error(171, type_name(ltp), type_name(rtp)); 3000 } else if (mp->m_binary) { 3001 /* operands of '%s' have incompatible types '%s' and '%s' */ 3002 error(107, mp->m_name, tspec_name(lt), tspec_name(rt)); 3003 } else { 3004 lint_assert(rt == NOTSPEC); 3005 /* operand of '%s' has invalid type '%s' */ 3006 error(108, mp->m_name, type_name(ltp)); 3007 } 3008 } 3009 3010 /* 3011 * Called if incompatible pointer types are detected. 3012 * Print an appropriate warning. 3013 */ 3014 static void 3015 warn_incompatible_pointers(const mod_t *mp, 3016 const type_t *ltp, const type_t *rtp) 3017 { 3018 tspec_t lt, rt; 3019 3020 lint_assert(ltp->t_tspec == PTR); 3021 lint_assert(rtp->t_tspec == PTR); 3022 3023 lt = ltp->t_subt->t_tspec; 3024 rt = rtp->t_subt->t_tspec; 3025 3026 if (is_struct_or_union(lt) && is_struct_or_union(rt)) { 3027 if (mp == NULL) { 3028 /* illegal structure pointer combination */ 3029 warning(244); 3030 } else { 3031 /* incompatible structure pointers: '%s' '%s' '%s' */ 3032 warning(245, type_name(ltp), mp->m_name, type_name(rtp)); 3033 } 3034 } else { 3035 if (mp == NULL) { 3036 /* illegal combination of '%s' and '%s' */ 3037 warning(184, type_name(ltp), type_name(rtp)); 3038 } else { 3039 /* illegal combination of '%s' and '%s', op '%s' */ 3040 warning(124, 3041 type_name(ltp), type_name(rtp), mp->m_name); 3042 } 3043 } 3044 } 3045 3046 /* Return a type based on tp1, with added qualifiers from tp2. */ 3047 static type_t * 3048 merge_qualifiers(type_t *tp1, const type_t *tp2) 3049 { 3050 type_t *ntp, *nstp; 3051 bool c1, c2, v1, v2; 3052 3053 lint_assert(tp1->t_tspec == PTR); 3054 lint_assert(tp2->t_tspec == PTR); 3055 3056 c1 = tp1->t_subt->t_const; 3057 c2 = tp2->t_subt->t_const; 3058 v1 = tp1->t_subt->t_volatile; 3059 v2 = tp2->t_subt->t_volatile; 3060 3061 if (c1 == (c1 | c2) && v1 == (v1 | v2)) 3062 return tp1; 3063 3064 nstp = expr_dup_type(tp1->t_subt); 3065 nstp->t_const |= c2; 3066 nstp->t_volatile |= v2; 3067 3068 ntp = expr_dup_type(tp1); 3069 ntp->t_subt = nstp; 3070 return ntp; 3071 } 3072 3073 /* 3074 * Returns true if the given structure or union has a constant member 3075 * (maybe recursively). 3076 */ 3077 static bool 3078 has_constant_member(const type_t *tp) 3079 { 3080 sym_t *m; 3081 3082 lint_assert(is_struct_or_union(tp->t_tspec)); 3083 3084 for (m = tp->t_str->sou_first_member; m != NULL; m = m->s_next) { 3085 const type_t *mtp = m->s_type; 3086 if (mtp->t_const) 3087 return true; 3088 if (is_struct_or_union(mtp->t_tspec) && 3089 has_constant_member(mtp)) 3090 return true; 3091 } 3092 return false; 3093 } 3094 3095 /* 3096 * Create a new node for one of the operators POINT and ARROW. 3097 */ 3098 static tnode_t * 3099 build_struct_access(op_t op, bool sys, tnode_t *ln, tnode_t *rn) 3100 { 3101 tnode_t *ntn, *ctn; 3102 bool nolval; 3103 3104 lint_assert(rn->tn_op == NAME); 3105 lint_assert(is_member(rn->tn_sym)); 3106 3107 /* 3108 * Remember if the left operand is an lvalue (structure members 3109 * are lvalues if and only if the structure itself is an lvalue). 3110 */ 3111 nolval = op == POINT && !ln->tn_lvalue; 3112 3113 if (op == POINT) { 3114 ln = build_address(sys, ln, true); 3115 } else if (ln->tn_type->t_tspec != PTR) { 3116 lint_assert(!allow_c90); 3117 lint_assert(is_integer(ln->tn_type->t_tspec)); 3118 ln = convert(NOOP, 0, expr_derive_type(gettyp(VOID), PTR), ln); 3119 } 3120 3121 ctn = build_integer_constant(PTRDIFF_TSPEC, 3122 rn->tn_sym->u.s_member.sm_offset_in_bits / CHAR_SIZE); 3123 3124 ntn = new_tnode(PLUS, sys, expr_derive_type(rn->tn_type, PTR), 3125 ln, ctn); 3126 if (ln->tn_op == CON) 3127 ntn = fold(ntn); 3128 3129 if (rn->tn_type->t_bitfield) { 3130 ntn = new_tnode(FSEL, sys, ntn->tn_type->t_subt, ntn, NULL); 3131 } else { 3132 ntn = new_tnode(INDIR, sys, ntn->tn_type->t_subt, ntn, NULL); 3133 } 3134 3135 if (nolval) 3136 ntn->tn_lvalue = false; 3137 3138 return ntn; 3139 } 3140 3141 /* 3142 * Create a node for INCAFT, INCBEF, DECAFT and DECBEF. 3143 */ 3144 static tnode_t * 3145 build_prepost_incdec(op_t op, bool sys, tnode_t *ln) 3146 { 3147 tnode_t *cn, *ntn; 3148 3149 lint_assert(ln != NULL); 3150 3151 if (ln->tn_type->t_tspec == PTR) { 3152 cn = subt_size_in_bytes(ln->tn_type); 3153 } else { 3154 cn = build_integer_constant(INT, (int64_t)1); 3155 } 3156 ntn = new_tnode(op, sys, ln->tn_type, ln, cn); 3157 3158 return ntn; 3159 } 3160 3161 /* 3162 * Create a node for REAL, IMAG 3163 */ 3164 static tnode_t * 3165 build_real_imag(op_t op, bool sys, tnode_t *ln) 3166 { 3167 tnode_t *cn, *ntn; 3168 3169 lint_assert(ln != NULL); 3170 3171 if (ln->tn_op == NAME) { 3172 /* 3173 * This may be too much, but it avoids wrong warnings. 3174 * See d_c99_complex_split.c. 3175 */ 3176 mark_as_used(ln->tn_sym, false, false); 3177 mark_as_set(ln->tn_sym); 3178 } 3179 3180 switch (ln->tn_type->t_tspec) { 3181 case LCOMPLEX: 3182 /* XXX: integer and LDOUBLE don't match. */ 3183 cn = build_integer_constant(LDOUBLE, (int64_t)1); 3184 break; 3185 case DCOMPLEX: 3186 /* XXX: integer and DOUBLE don't match. */ 3187 cn = build_integer_constant(DOUBLE, (int64_t)1); 3188 break; 3189 case FCOMPLEX: 3190 /* XXX: integer and FLOAT don't match. */ 3191 cn = build_integer_constant(FLOAT, (int64_t)1); 3192 break; 3193 default: 3194 /* '__%s__' is illegal for type '%s' */ 3195 error(276, op == REAL ? "real" : "imag", 3196 type_name(ln->tn_type)); 3197 return NULL; 3198 } 3199 ntn = new_tnode(op, sys, cn->tn_type, ln, cn); 3200 ntn->tn_lvalue = true; 3201 3202 return ntn; 3203 } 3204 3205 /* 3206 * Create a tree node for the unary & operator 3207 */ 3208 static tnode_t * 3209 build_address(bool sys, tnode_t *tn, bool noign) 3210 { 3211 tspec_t t; 3212 3213 if (!noign && ((t = tn->tn_type->t_tspec) == ARRAY || t == FUNC)) { 3214 if (!allow_c90) 3215 /* '&' before array or function: ignored */ 3216 warning(127); 3217 return tn; 3218 } 3219 3220 /* eliminate &* */ 3221 if (tn->tn_op == INDIR && 3222 tn->tn_left->tn_type->t_tspec == PTR && 3223 tn->tn_left->tn_type->t_subt == tn->tn_type) { 3224 return tn->tn_left; 3225 } 3226 3227 return new_tnode(ADDR, sys, expr_derive_type(tn->tn_type, PTR), 3228 tn, NULL); 3229 } 3230 3231 /* 3232 * Create a node for operators PLUS and MINUS. 3233 */ 3234 static tnode_t * 3235 build_plus_minus(op_t op, bool sys, tnode_t *ln, tnode_t *rn) 3236 { 3237 3238 /* If pointer and integer, then pointer to the lhs. */ 3239 if (rn->tn_type->t_tspec == PTR && is_integer(ln->tn_type->t_tspec)) { 3240 tnode_t *tmp = ln; 3241 ln = rn; 3242 rn = tmp; 3243 /* pointer addition has integer on the left-hand side */ 3244 query_message(5); 3245 } 3246 3247 /* pointer +- integer */ 3248 if (ln->tn_type->t_tspec == PTR && rn->tn_type->t_tspec != PTR) { 3249 lint_assert(is_integer(rn->tn_type->t_tspec)); 3250 3251 check_ctype_macro_invocation(ln, rn); 3252 check_enum_array_index(ln, rn); 3253 3254 tnode_t *elsz = subt_size_in_bytes(ln->tn_type); 3255 if (rn->tn_type->t_tspec != elsz->tn_type->t_tspec) 3256 rn = convert(NOOP, 0, elsz->tn_type, rn); 3257 3258 tnode_t *prod = new_tnode(MULT, sys, rn->tn_type, rn, elsz); 3259 if (rn->tn_op == CON) 3260 prod = fold(prod); 3261 3262 return new_tnode(op, sys, ln->tn_type, ln, prod); 3263 } 3264 3265 /* pointer - pointer */ 3266 if (rn->tn_type->t_tspec == PTR) { 3267 lint_assert(ln->tn_type->t_tspec == PTR); 3268 lint_assert(op == MINUS); 3269 3270 type_t *ptrdiff = gettyp(PTRDIFF_TSPEC); 3271 tnode_t *raw_diff = new_tnode(op, sys, ptrdiff, ln, rn); 3272 if (ln->tn_op == CON && rn->tn_op == CON) 3273 raw_diff = fold(raw_diff); 3274 3275 tnode_t *elsz = subt_size_in_bytes(ln->tn_type); 3276 balance(NOOP, &raw_diff, &elsz); 3277 3278 return new_tnode(DIV, sys, ptrdiff, raw_diff, elsz); 3279 } 3280 3281 return new_tnode(op, sys, ln->tn_type, ln, rn); 3282 } 3283 3284 /* 3285 * Create a node for operators SHL and SHR. 3286 */ 3287 static tnode_t * 3288 build_bit_shift(op_t op, bool sys, tnode_t *ln, tnode_t *rn) 3289 { 3290 3291 if (!allow_c90 && rn->tn_type->t_tspec != INT) 3292 rn = convert(NOOP, 0, gettyp(INT), rn); 3293 return new_tnode(op, sys, ln->tn_type, ln, rn); 3294 } 3295 3296 /* 3297 * Create a node for COLON. 3298 */ 3299 static tnode_t * 3300 build_colon(bool sys, tnode_t *ln, tnode_t *rn) 3301 { 3302 tspec_t lt, rt, pdt; 3303 type_t *tp; 3304 tnode_t *ntn; 3305 3306 lt = ln->tn_type->t_tspec; 3307 rt = rn->tn_type->t_tspec; 3308 pdt = PTRDIFF_TSPEC; 3309 3310 /* 3311 * Arithmetic types are balanced, all other type combinations 3312 * still need to be handled. 3313 */ 3314 if (is_arithmetic(lt) && is_arithmetic(rt)) { 3315 tp = ln->tn_type; 3316 } else if (lt == BOOL && rt == BOOL) { 3317 tp = ln->tn_type; 3318 } else if (lt == VOID || rt == VOID) { 3319 tp = gettyp(VOID); 3320 } else if (is_struct_or_union(lt)) { 3321 /* Both types must be identical. */ 3322 lint_assert(is_struct_or_union(rt)); 3323 lint_assert(ln->tn_type->t_str == rn->tn_type->t_str); 3324 if (is_incomplete(ln->tn_type)) { 3325 /* unknown operand size, op '%s' */ 3326 error(138, op_name(COLON)); 3327 return NULL; 3328 } 3329 tp = ln->tn_type; 3330 } else if (lt == PTR && is_integer(rt)) { 3331 if (rt != pdt) { 3332 rn = convert(NOOP, 0, gettyp(pdt), rn); 3333 rt = pdt; 3334 } 3335 tp = ln->tn_type; 3336 } else if (rt == PTR && is_integer(lt)) { 3337 if (lt != pdt) { 3338 ln = convert(NOOP, 0, gettyp(pdt), ln); 3339 lt = pdt; 3340 } 3341 tp = rn->tn_type; 3342 } else if (lt == PTR && ln->tn_type->t_subt->t_tspec == VOID) { 3343 tp = merge_qualifiers(rn->tn_type, ln->tn_type); 3344 } else if (rt == PTR && rn->tn_type->t_subt->t_tspec == VOID) { 3345 tp = merge_qualifiers(ln->tn_type, rn->tn_type); 3346 } else { 3347 /* 3348 * XXX For now we simply take the left type. This is 3349 * probably wrong, if one type contains a function prototype 3350 * and the other one, at the same place, only an old-style 3351 * declaration. 3352 */ 3353 tp = merge_qualifiers(ln->tn_type, rn->tn_type); 3354 } 3355 3356 ntn = new_tnode(COLON, sys, tp, ln, rn); 3357 3358 return ntn; 3359 } 3360 3361 /* TODO: check for varargs */ 3362 static bool 3363 is_cast_redundant(const tnode_t *tn) 3364 { 3365 const type_t *ntp = tn->tn_type, *otp = tn->tn_left->tn_type; 3366 tspec_t nt = ntp->t_tspec, ot = otp->t_tspec; 3367 3368 if (nt == BOOL || ot == BOOL) 3369 return nt == BOOL && ot == BOOL; 3370 3371 if (is_integer(nt) && is_integer(ot)) { 3372 unsigned int nw = width_in_bits(ntp), ow = width_in_bits(otp); 3373 if (is_uinteger(nt) == is_uinteger(ot)) 3374 return nw >= ow; 3375 return is_uinteger(ot) && nw > ow; 3376 } 3377 3378 if (is_complex(nt) || is_complex(ot)) 3379 return is_complex(nt) && is_complex(ot) && 3380 size_in_bits(nt) >= size_in_bits(ot); 3381 3382 if (is_floating(nt) && is_floating(ot)) 3383 return size_in_bits(nt) >= size_in_bits(ot); 3384 3385 if (nt == PTR && ot == PTR) { 3386 if (!ntp->t_subt->t_const && otp->t_subt->t_const) 3387 return false; 3388 if (!ntp->t_subt->t_volatile && otp->t_subt->t_volatile) 3389 return false; 3390 3391 if (ntp->t_subt->t_tspec == VOID || 3392 otp->t_subt->t_tspec == VOID || 3393 types_compatible(ntp->t_subt, otp->t_subt, 3394 false, false, NULL)) 3395 return true; 3396 } 3397 3398 return false; 3399 } 3400 3401 /* 3402 * Create a node for an assignment operator (both = and op= ). 3403 */ 3404 static tnode_t * 3405 build_assignment(op_t op, bool sys, tnode_t *ln, tnode_t *rn) 3406 { 3407 tspec_t lt, rt; 3408 tnode_t *ntn, *ctn; 3409 3410 lint_assert(ln != NULL); 3411 lint_assert(rn != NULL); 3412 3413 lt = ln->tn_type->t_tspec; 3414 rt = rn->tn_type->t_tspec; 3415 3416 if ((op == ADDASS || op == SUBASS) && lt == PTR) { 3417 lint_assert(is_integer(rt)); 3418 ctn = subt_size_in_bytes(ln->tn_type); 3419 if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec) 3420 rn = convert(NOOP, 0, ctn->tn_type, rn); 3421 rn = new_tnode(MULT, sys, rn->tn_type, rn, ctn); 3422 if (rn->tn_left->tn_op == CON) 3423 rn = fold(rn); 3424 } 3425 3426 if ((op == ASSIGN || op == RETURN || op == INIT) && 3427 (lt == STRUCT || rt == STRUCT)) { 3428 lint_assert(lt == rt); 3429 lint_assert(ln->tn_type->t_str == rn->tn_type->t_str); 3430 if (is_incomplete(ln->tn_type)) { 3431 if (op == RETURN) { 3432 /* cannot return incomplete type */ 3433 error(212); 3434 } else { 3435 /* unknown operand size, op '%s' */ 3436 error(138, op_name(op)); 3437 } 3438 return NULL; 3439 } 3440 } 3441 3442 if (op == SHLASS) { 3443 if (portable_size_in_bits(lt) < portable_size_in_bits(rt)) { 3444 if (hflag) 3445 /* semantics of '%s' change in ANSI C; ... */ 3446 warning(118, "<<="); 3447 } 3448 } else if (op != SHRASS) { 3449 if (op == ASSIGN || lt != PTR) { 3450 if (lt != rt || 3451 (ln->tn_type->t_bitfield && rn->tn_op == CON)) { 3452 rn = convert(op, 0, ln->tn_type, rn); 3453 rt = lt; 3454 } 3455 } 3456 } 3457 3458 if (any_query_enabled && rn->tn_op == CVT && rn->tn_cast && 3459 types_compatible(ln->tn_type, rn->tn_type, false, false, NULL) && 3460 is_cast_redundant(rn)) { 3461 /* redundant cast from '%s' to '%s' before assignment */ 3462 query_message(7, 3463 type_name(rn->tn_left->tn_type), type_name(rn->tn_type)); 3464 } 3465 3466 ntn = new_tnode(op, sys, ln->tn_type, ln, rn); 3467 3468 return ntn; 3469 } 3470 3471 /* 3472 * Get the size in bytes of type tp->t_subt, as a constant expression of type 3473 * ptrdiff_t as seen from the target platform. 3474 */ 3475 static tnode_t * 3476 subt_size_in_bytes(type_t *tp) 3477 { 3478 int elem, elsz_in_bits; 3479 3480 lint_assert(tp->t_tspec == PTR); 3481 tp = tp->t_subt; 3482 3483 elem = 1; 3484 elsz_in_bits = 0; 3485 3486 while (tp->t_tspec == ARRAY) { 3487 elem *= tp->t_dim; 3488 tp = tp->t_subt; 3489 } 3490 3491 switch (tp->t_tspec) { 3492 case FUNC: 3493 /* pointer to function is not allowed here */ 3494 error(110); 3495 break; 3496 case VOID: 3497 /* cannot do pointer arithmetic on operand of unknown size */ 3498 gnuism(136); 3499 break; 3500 case STRUCT: 3501 case UNION: 3502 if ((elsz_in_bits = tp->t_str->sou_size_in_bits) == 0) 3503 /* cannot do pointer arithmetic on operand of ... */ 3504 error(136); 3505 break; 3506 case ENUM: 3507 if (is_incomplete(tp)) { 3508 /* cannot do pointer arithmetic on operand of ... */ 3509 warning(136); 3510 } 3511 /* FALLTHROUGH */ 3512 default: 3513 if ((elsz_in_bits = size_in_bits(tp->t_tspec)) == 0) { 3514 /* cannot do pointer arithmetic on operand of ... */ 3515 error(136); 3516 } else { 3517 lint_assert(elsz_in_bits != -1); 3518 } 3519 break; 3520 } 3521 3522 if (elem == 0 && elsz_in_bits != 0) { 3523 /* cannot do pointer arithmetic on operand of unknown size */ 3524 error(136); 3525 } 3526 3527 if (elsz_in_bits == 0) 3528 elsz_in_bits = CHAR_SIZE; 3529 3530 return build_integer_constant(PTRDIFF_TSPEC, 3531 (int64_t)(elem * elsz_in_bits / CHAR_SIZE)); 3532 } 3533 3534 /* 3535 * XXX 3536 * Note: There appear to be a number of bugs in detecting overflow in 3537 * this function. An audit and a set of proper regression tests are needed. 3538 * --Perry Metzger, Nov. 16, 2001 3539 */ 3540 /* 3541 * Do only as much as necessary to compute constant expressions. 3542 * Called only if the operator allows folding and all operands are constants. 3543 */ 3544 static tnode_t * 3545 fold(tnode_t *tn) 3546 { 3547 val_t *v; 3548 tspec_t t; 3549 bool utyp, ovfl; 3550 int64_t sl, sr = 0, q = 0, mask; 3551 uint64_t ul, ur = 0; 3552 tnode_t *cn; 3553 3554 v = xcalloc(1, sizeof(*v)); 3555 v->v_tspec = tn->tn_type->t_tspec; 3556 3557 t = tn->tn_left->tn_type->t_tspec; 3558 utyp = !is_integer(t) || is_uinteger(t); 3559 ul = sl = tn->tn_left->tn_val->v_quad; 3560 if (is_binary(tn)) 3561 ur = sr = tn->tn_right->tn_val->v_quad; 3562 3563 mask = value_bits(size_in_bits(t)); 3564 ovfl = false; 3565 3566 switch (tn->tn_op) { 3567 case UPLUS: 3568 q = sl; 3569 break; 3570 case UMINUS: 3571 q = sl == INT64_MIN ? sl : -sl; 3572 if (sl != 0 && msb(q, t) == msb(sl, t)) 3573 ovfl = true; 3574 break; 3575 case COMPL: 3576 q = ~sl; 3577 break; 3578 case MULT: 3579 if (utyp) { 3580 q = ul * ur; 3581 if (q != (q & mask)) 3582 ovfl = true; 3583 else if ((ul != 0) && ((q / ul) != ur)) 3584 ovfl = true; 3585 } else { 3586 q = sl * sr; 3587 if (msb(q, t) != (msb(sl, t) ^ msb(sr, t))) 3588 ovfl = true; 3589 } 3590 break; 3591 case DIV: 3592 if (sr == 0) { 3593 /* division by 0 */ 3594 error(139); 3595 q = utyp ? -1 : INT64_MAX; 3596 } else { 3597 q = utyp ? (int64_t)(ul / ur) : sl / sr; 3598 } 3599 break; 3600 case MOD: 3601 if (sr == 0) { 3602 /* modulus by 0 */ 3603 error(140); 3604 q = 0; 3605 } else { 3606 q = utyp ? (int64_t)(ul % ur) : sl % sr; 3607 } 3608 break; 3609 case PLUS: 3610 q = utyp ? (int64_t)(ul + ur) : sl + sr; 3611 if (msb(sl, t) && msb(sr, t) && !msb(q, t)) 3612 ovfl = true; 3613 if (!utyp && !msb(sl, t) && !msb(sr, t) && msb(q, t)) 3614 ovfl = true; 3615 break; 3616 case MINUS: 3617 q = utyp ? (int64_t)(ul - ur) : sl - sr; 3618 if (!utyp && msb(sl, t) && !msb(sr, t) && !msb(q, t)) 3619 ovfl = true; 3620 if (!msb(sl, t) && msb(sr, t) && msb(q, t)) 3621 ovfl = true; 3622 break; 3623 case SHL: 3624 /* TODO: warn about out-of-bounds 'sr'. */ 3625 q = utyp ? (int64_t)(ul << (sr & 63)) : sl << (sr & 63); 3626 break; 3627 case SHR: 3628 /* 3629 * The sign must be explicitly extended because 3630 * shifts of signed values are implementation dependent. 3631 */ 3632 /* TODO: warn about out-of-bounds 'sr'. */ 3633 q = ul >> (sr & 63); 3634 q = convert_integer(q, t, size_in_bits(t) - (int)sr); 3635 break; 3636 case LT: 3637 q = (utyp ? ul < ur : sl < sr) ? 1 : 0; 3638 break; 3639 case LE: 3640 q = (utyp ? ul <= ur : sl <= sr) ? 1 : 0; 3641 break; 3642 case GE: 3643 q = (utyp ? ul >= ur : sl >= sr) ? 1 : 0; 3644 break; 3645 case GT: 3646 q = (utyp ? ul > ur : sl > sr) ? 1 : 0; 3647 break; 3648 case EQ: 3649 q = (utyp ? ul == ur : sl == sr) ? 1 : 0; 3650 break; 3651 case NE: 3652 q = (utyp ? ul != ur : sl != sr) ? 1 : 0; 3653 break; 3654 case BITAND: 3655 q = utyp ? (int64_t)(ul & ur) : sl & sr; 3656 break; 3657 case BITXOR: 3658 q = utyp ? (int64_t)(ul ^ ur) : sl ^ sr; 3659 break; 3660 case BITOR: 3661 q = utyp ? (int64_t)(ul | ur) : sl | sr; 3662 break; 3663 default: 3664 lint_assert(/*CONSTCOND*/false); 3665 } 3666 3667 /* XXX does not work for quads. */ 3668 if (ovfl || 3669 ((uint64_t)(q | mask) != ~(uint64_t)0 && (q & ~mask) != 0)) { 3670 if (hflag) 3671 /* integer overflow detected, op '%s' */ 3672 warning(141, op_name(tn->tn_op)); 3673 } 3674 3675 v->v_quad = convert_integer(q, t, 0); 3676 3677 cn = build_constant(tn->tn_type, v); 3678 if (tn->tn_left->tn_system_dependent) 3679 cn->tn_system_dependent = true; 3680 if (is_binary(tn) && tn->tn_right->tn_system_dependent) 3681 cn->tn_system_dependent = true; 3682 3683 return cn; 3684 } 3685 3686 /* 3687 * Fold constant nodes, as much as is needed for comparing the value with 0. 3688 */ 3689 static tnode_t * 3690 fold_bool(tnode_t *tn) 3691 { 3692 bool l, r; 3693 val_t *v; 3694 3695 v = xcalloc(1, sizeof(*v)); 3696 v->v_tspec = tn->tn_type->t_tspec; 3697 lint_assert(v->v_tspec == INT || (Tflag && v->v_tspec == BOOL)); 3698 3699 l = constant_is_nonzero(tn->tn_left); 3700 r = is_binary(tn) && constant_is_nonzero(tn->tn_right); 3701 3702 switch (tn->tn_op) { 3703 case NOT: 3704 if (hflag && !constcond_flag) 3705 /* constant argument to '!' */ 3706 warning(239); 3707 v->v_quad = !l ? 1 : 0; 3708 break; 3709 case LOGAND: 3710 v->v_quad = l && r ? 1 : 0; 3711 break; 3712 case LOGOR: 3713 v->v_quad = l || r ? 1 : 0; 3714 break; 3715 default: 3716 lint_assert(/*CONSTCOND*/false); 3717 } 3718 3719 return build_constant(tn->tn_type, v); 3720 } 3721 3722 static ldbl_t 3723 floating_error_value(tspec_t t, ldbl_t lv) 3724 { 3725 if (t == FLOAT) { 3726 return lv < 0 ? -FLT_MAX : FLT_MAX; 3727 } else if (t == DOUBLE) { 3728 return lv < 0 ? -DBL_MAX : DBL_MAX; 3729 } else { 3730 /* LINTED 248: floating-point constant out of range */ 3731 ldbl_t max = LDBL_MAX; 3732 return lv < 0 ? -max : max; 3733 } 3734 } 3735 3736 /* 3737 * Fold constant nodes having operands with floating point type. 3738 */ 3739 static tnode_t * 3740 fold_float(tnode_t *tn) 3741 { 3742 val_t *v; 3743 tspec_t t; 3744 ldbl_t lv, rv = 0; 3745 3746 fpe = 0; 3747 v = xcalloc(1, sizeof(*v)); 3748 v->v_tspec = t = tn->tn_type->t_tspec; 3749 3750 lint_assert(is_floating(t)); 3751 lint_assert(t == tn->tn_left->tn_type->t_tspec); 3752 lint_assert(!is_binary(tn) || t == tn->tn_right->tn_type->t_tspec); 3753 3754 lv = tn->tn_left->tn_val->v_ldbl; 3755 if (is_binary(tn)) 3756 rv = tn->tn_right->tn_val->v_ldbl; 3757 3758 switch (tn->tn_op) { 3759 case UPLUS: 3760 v->v_ldbl = lv; 3761 break; 3762 case UMINUS: 3763 v->v_ldbl = -lv; 3764 break; 3765 case MULT: 3766 v->v_ldbl = lv * rv; 3767 break; 3768 case DIV: 3769 if (rv == 0.0) { 3770 /* division by 0 */ 3771 error(139); 3772 v->v_ldbl = floating_error_value(t, lv); 3773 } else { 3774 v->v_ldbl = lv / rv; 3775 } 3776 break; 3777 case PLUS: 3778 v->v_ldbl = lv + rv; 3779 break; 3780 case MINUS: 3781 v->v_ldbl = lv - rv; 3782 break; 3783 case LT: 3784 v->v_quad = lv < rv ? 1 : 0; 3785 break; 3786 case LE: 3787 v->v_quad = lv <= rv ? 1 : 0; 3788 break; 3789 case GE: 3790 v->v_quad = lv >= rv ? 1 : 0; 3791 break; 3792 case GT: 3793 v->v_quad = lv > rv ? 1 : 0; 3794 break; 3795 case EQ: 3796 v->v_quad = lv == rv ? 1 : 0; 3797 break; 3798 case NE: 3799 v->v_quad = lv != rv ? 1 : 0; 3800 break; 3801 default: 3802 lint_assert(/*CONSTCOND*/false); 3803 } 3804 3805 lint_assert(fpe != 0 || isnan((double)v->v_ldbl) == 0); 3806 if (fpe != 0 || isfinite((double)v->v_ldbl) == 0 || 3807 (t == FLOAT && 3808 (v->v_ldbl > FLT_MAX || v->v_ldbl < -FLT_MAX)) || 3809 (t == DOUBLE && 3810 (v->v_ldbl > DBL_MAX || v->v_ldbl < -DBL_MAX))) { 3811 /* floating point overflow on operator '%s' */ 3812 warning(142, op_name(tn->tn_op)); 3813 v->v_ldbl = floating_error_value(t, v->v_ldbl); 3814 fpe = 0; 3815 } 3816 3817 return build_constant(tn->tn_type, v); 3818 } 3819 3820 3821 /* 3822 * Create a constant node for sizeof. 3823 */ 3824 tnode_t * 3825 build_sizeof(const type_t *tp) 3826 { 3827 unsigned int size_in_bytes = type_size_in_bits(tp) / CHAR_SIZE; 3828 tnode_t *tn = build_integer_constant(SIZEOF_TSPEC, size_in_bytes); 3829 tn->tn_system_dependent = true; 3830 debug_step("build_sizeof '%s' = %u", type_name(tp), size_in_bytes); 3831 return tn; 3832 } 3833 3834 /* 3835 * Create a constant node for offsetof. 3836 */ 3837 /* ARGSUSED */ /* See implementation comments. */ 3838 tnode_t * 3839 build_offsetof(const type_t *tp, const sym_t *sym) 3840 { 3841 unsigned int offset_in_bytes; 3842 tnode_t *tn; 3843 3844 if (!is_struct_or_union(tp->t_tspec)) 3845 /* unacceptable operand of '%s' */ 3846 error(111, "offsetof"); 3847 3848 /* XXX: wrong size, no checking for sym fixme */ 3849 offset_in_bytes = type_size_in_bits(tp) / CHAR_SIZE; 3850 tn = build_integer_constant(SIZEOF_TSPEC, offset_in_bytes); 3851 tn->tn_system_dependent = true; 3852 return tn; 3853 } 3854 3855 unsigned int 3856 type_size_in_bits(const type_t *tp) 3857 { 3858 unsigned int elem, elsz; 3859 bool flex; 3860 3861 elem = 1; 3862 flex = false; 3863 lint_assert(tp != NULL); 3864 while (tp->t_tspec == ARRAY) { 3865 flex = true; /* allow c99 flex arrays [] [0] */ 3866 elem *= tp->t_dim; 3867 tp = tp->t_subt; 3868 } 3869 if (elem == 0) { 3870 if (!flex) { 3871 /* cannot take size/alignment of incomplete type */ 3872 error(143); 3873 elem = 1; 3874 } 3875 } 3876 switch (tp->t_tspec) { 3877 case FUNC: 3878 /* cannot take size/alignment of function type '%s' */ 3879 error(144, type_name(tp)); 3880 elsz = 1; 3881 break; 3882 case STRUCT: 3883 case UNION: 3884 if (is_incomplete(tp)) { 3885 /* cannot take size/alignment of incomplete type */ 3886 error(143); 3887 elsz = 1; 3888 } else { 3889 elsz = tp->t_str->sou_size_in_bits; 3890 } 3891 break; 3892 case ENUM: 3893 if (is_incomplete(tp)) { 3894 /* cannot take size/alignment of incomplete type */ 3895 warning(143); 3896 } 3897 /* FALLTHROUGH */ 3898 default: 3899 if (tp->t_bitfield) { 3900 /* cannot take size/alignment of bit-field */ 3901 error(145); 3902 } 3903 if (tp->t_tspec == VOID) { 3904 /* cannot take size/alignment of void */ 3905 error(146); 3906 elsz = 1; 3907 } else { 3908 elsz = size_in_bits(tp->t_tspec); 3909 lint_assert(elsz > 0); 3910 } 3911 break; 3912 } 3913 3914 return elem * elsz; 3915 } 3916 3917 tnode_t * 3918 build_alignof(const type_t *tp) 3919 { 3920 switch (tp->t_tspec) { 3921 case ARRAY: 3922 break; 3923 3924 case FUNC: 3925 /* cannot take size/alignment of function type '%s' */ 3926 error(144, type_name(tp)); 3927 return 0; 3928 3929 case STRUCT: 3930 case UNION: 3931 if (is_incomplete(tp)) { 3932 /* cannot take size/alignment of incomplete type */ 3933 error(143); 3934 return 0; 3935 } 3936 break; 3937 case ENUM: 3938 break; 3939 default: 3940 if (tp->t_bitfield) { 3941 /* cannot take size/alignment of bit-field */ 3942 error(145); 3943 return 0; 3944 } 3945 if (tp->t_tspec == VOID) { 3946 /* cannot take size/alignment of void */ 3947 error(146); 3948 return 0; 3949 } 3950 break; 3951 } 3952 3953 return build_integer_constant(SIZEOF_TSPEC, 3954 (int64_t)alignment_in_bits(tp) / CHAR_SIZE); 3955 } 3956 3957 /* 3958 * Type casts. 3959 */ 3960 tnode_t * 3961 cast(tnode_t *tn, type_t *tp) 3962 { 3963 tspec_t nt, ot; 3964 3965 if (tn == NULL) 3966 return NULL; 3967 3968 tn = cconv(tn); 3969 3970 lint_assert(tp != NULL); 3971 nt = tp->t_tspec; 3972 ot = tn->tn_type->t_tspec; 3973 3974 if (nt == VOID) { 3975 /* 3976 * C90 6.3.4, C99 6.5.4p2 and C11 6.5.4p2 allow any type to 3977 * be cast to void. The only other allowed casts are from a 3978 * scalar type to a scalar type. 3979 */ 3980 } else if (nt == UNION) { 3981 sym_t *m; 3982 struct_or_union *str = tp->t_str; 3983 if (!allow_gcc) { 3984 /* union cast is a GCC extension */ 3985 error(328); 3986 return NULL; 3987 } 3988 for (m = str->sou_first_member; m != NULL; m = m->s_next) { 3989 if (types_compatible(m->s_type, tn->tn_type, 3990 false, false, NULL)) { 3991 tn = expr_alloc_tnode(); 3992 tn->tn_op = CVT; 3993 tn->tn_type = tp; 3994 tn->tn_cast = true; 3995 tn->tn_right = NULL; 3996 return tn; 3997 } 3998 } 3999 /* type '%s' is not a member of '%s' */ 4000 error(329, type_name(tn->tn_type), type_name(tp)); 4001 return NULL; 4002 } else if (nt == STRUCT || nt == ARRAY || nt == FUNC) { 4003 /* Casting to a struct is an undocumented GCC extension. */ 4004 if (!(allow_gcc && nt == STRUCT)) 4005 goto invalid_cast; 4006 } else if (is_struct_or_union(ot)) { 4007 goto invalid_cast; 4008 } else if (ot == VOID) { 4009 /* improper cast of void expression */ 4010 error(148); 4011 return NULL; 4012 } else if (is_integer(nt) && is_scalar(ot)) { 4013 /* ok */ 4014 } else if (is_floating(nt) && is_arithmetic(ot)) { 4015 /* ok */ 4016 } else if (nt == PTR && is_integer(ot)) { 4017 /* ok */ 4018 } else if (nt == PTR && ot == PTR) { 4019 if (!tp->t_subt->t_const && tn->tn_type->t_subt->t_const) { 4020 if (hflag) 4021 /* cast discards 'const' from type '%s' */ 4022 warning(275, type_name(tn->tn_type)); 4023 } 4024 } else 4025 goto invalid_cast; 4026 4027 if (any_query_enabled && types_compatible(tp, tn->tn_type, 4028 false, false, NULL)) { 4029 /* no-op cast from '%s' to '%s' */ 4030 query_message(6, type_name(tn->tn_type), type_name(tp)); 4031 } 4032 4033 tn = convert(CVT, 0, tp, tn); 4034 tn->tn_cast = true; 4035 4036 return tn; 4037 4038 invalid_cast: 4039 /* invalid cast from '%s' to '%s' */ 4040 error(147, type_name(tn->tn_type), type_name(tp)); 4041 return NULL; 4042 } 4043 4044 /* 4045 * Create the node for a function argument. 4046 * All necessary conversions and type checks are done in 4047 * build_function_call because build_function_argument has no 4048 * information about expected argument types. 4049 */ 4050 tnode_t * 4051 build_function_argument(tnode_t *args, tnode_t *arg) 4052 { 4053 /* 4054 * If there was a serious error in the expression for the argument, 4055 * create a dummy argument so the positions of the remaining arguments 4056 * will not change. 4057 */ 4058 if (arg == NULL) 4059 arg = build_integer_constant(INT, 0); 4060 4061 return new_tnode(PUSH, arg->tn_sys, arg->tn_type, arg, args); 4062 } 4063 4064 /* 4065 * Create the node for a function call. Also check types of 4066 * function arguments and insert conversions, if necessary. 4067 */ 4068 tnode_t * 4069 build_function_call(tnode_t *func, bool sys, tnode_t *args) 4070 { 4071 tnode_t *ntn; 4072 op_t fcop; 4073 4074 if (func == NULL) 4075 return NULL; 4076 4077 if (func->tn_op == NAME && func->tn_type->t_tspec == FUNC) { 4078 fcop = CALL; 4079 } else { 4080 fcop = ICALL; 4081 } 4082 4083 check_ctype_function_call(func, args); 4084 4085 /* 4086 * after cconv() func will always be a pointer to a function 4087 * if it is a valid function designator. 4088 */ 4089 func = cconv(func); 4090 4091 if (func->tn_type->t_tspec != PTR || 4092 func->tn_type->t_subt->t_tspec != FUNC) { 4093 /* cannot call '%s', must be a function */ 4094 error(149, type_name(func->tn_type)); 4095 return NULL; 4096 } 4097 4098 args = check_function_arguments(func->tn_type->t_subt, args); 4099 4100 ntn = new_tnode(fcop, sys, func->tn_type->t_subt->t_subt, func, args); 4101 4102 return ntn; 4103 } 4104 4105 /* 4106 * Check types of all function arguments and insert conversions, 4107 * if necessary. 4108 */ 4109 static tnode_t * 4110 check_function_arguments(type_t *ftp, tnode_t *args) 4111 { 4112 tnode_t *arg; 4113 sym_t *asym; 4114 tspec_t at; 4115 int narg, npar, n, i; 4116 4117 /* get # of args in the prototype */ 4118 npar = 0; 4119 for (asym = ftp->t_args; asym != NULL; asym = asym->s_next) 4120 npar++; 4121 4122 /* get # of args in function call */ 4123 narg = 0; 4124 for (arg = args; arg != NULL; arg = arg->tn_right) 4125 narg++; 4126 4127 asym = ftp->t_args; 4128 if (ftp->t_proto && npar != narg && !(ftp->t_vararg && npar < narg)) { 4129 /* argument mismatch: %d %s passed, %d expected */ 4130 error(150, narg, narg > 1 ? "arguments" : "argument", npar); 4131 asym = NULL; 4132 } 4133 4134 for (n = 1; n <= narg; n++) { 4135 4136 /* 4137 * The rightmost argument is at the top of the argument 4138 * subtree. 4139 */ 4140 for (i = narg, arg = args; i > n; i--, arg = arg->tn_right) 4141 continue; 4142 4143 /* some things which are always not allowed */ 4144 if ((at = arg->tn_left->tn_type->t_tspec) == VOID) { 4145 /* void expressions may not be arguments, arg #%d */ 4146 error(151, n); 4147 return NULL; 4148 } else if (is_struct_or_union(at) && 4149 is_incomplete(arg->tn_left->tn_type)) { 4150 /* argument cannot have unknown size, arg #%d */ 4151 error(152, n); 4152 return NULL; 4153 } else if (is_integer(at) && 4154 arg->tn_left->tn_type->t_is_enum && 4155 is_incomplete(arg->tn_left->tn_type)) { 4156 /* argument cannot have unknown size, arg #%d */ 4157 warning(152, n); 4158 } 4159 4160 /* class conversions (arg in value context) */ 4161 arg->tn_left = cconv(arg->tn_left); 4162 4163 if (asym != NULL) { 4164 arg->tn_left = check_prototype_argument( 4165 n, asym->s_type, arg->tn_left); 4166 } else { 4167 arg->tn_left = promote(NOOP, true, arg->tn_left); 4168 } 4169 arg->tn_type = arg->tn_left->tn_type; 4170 4171 if (asym != NULL) 4172 asym = asym->s_next; 4173 } 4174 4175 return args; 4176 } 4177 4178 /* 4179 * Compare the type of an argument with the corresponding type of a 4180 * prototype parameter. If it is a valid combination, but both types 4181 * are not the same, insert a conversion to convert the argument into 4182 * the type of the parameter. 4183 */ 4184 static tnode_t * 4185 check_prototype_argument( 4186 int n, /* pos of arg */ 4187 type_t *tp, /* expected type (from prototype) */ 4188 tnode_t *tn) /* argument */ 4189 { 4190 tnode_t *ln; 4191 bool dowarn; 4192 4193 ln = xcalloc(1, sizeof(*ln)); 4194 ln->tn_type = expr_unqualified_type(tp); 4195 ln->tn_lvalue = true; 4196 if (typeok(FARG, n, ln, tn)) { 4197 if (!types_compatible(tp, tn->tn_type, 4198 true, false, (dowarn = false, &dowarn)) || dowarn) 4199 tn = convert(FARG, n, tp, tn); 4200 } 4201 free(ln); 4202 return tn; 4203 } 4204 4205 /* 4206 * Return the value of an integral constant expression. 4207 * If the expression is not constant or its type is not an integer 4208 * type, an error message is printed. 4209 */ 4210 val_t * 4211 constant(tnode_t *tn, bool required) 4212 { 4213 val_t *v; 4214 4215 if (tn != NULL) 4216 tn = cconv(tn); 4217 if (tn != NULL) 4218 tn = promote(NOOP, false, tn); 4219 4220 v = xcalloc(1, sizeof(*v)); 4221 4222 if (tn == NULL) { 4223 lint_assert(nerr != 0); 4224 debug_step("constant node is null; returning 1 instead"); 4225 v->v_tspec = INT; 4226 v->v_quad = 1; 4227 return v; 4228 } 4229 4230 v->v_tspec = tn->tn_type->t_tspec; 4231 4232 if (tn->tn_op == CON) { 4233 lint_assert(tn->tn_type->t_tspec == tn->tn_val->v_tspec); 4234 if (is_integer(tn->tn_val->v_tspec)) { 4235 v->v_unsigned_since_c90 = 4236 tn->tn_val->v_unsigned_since_c90; 4237 v->v_quad = tn->tn_val->v_quad; 4238 return v; 4239 } 4240 v->v_quad = tn->tn_val->v_ldbl; 4241 } else { 4242 v->v_quad = 1; 4243 } 4244 4245 if (required) 4246 /* integral constant expression expected */ 4247 error(55); 4248 else 4249 /* variable array dimension is a C99/GCC extension */ 4250 c99ism(318); 4251 4252 if (!is_integer(v->v_tspec)) 4253 v->v_tspec = INT; 4254 4255 return v; 4256 } 4257 4258 static bool 4259 is_constcond_false(const tnode_t *tn, tspec_t t) 4260 { 4261 return (t == BOOL || t == INT) && 4262 tn->tn_op == CON && tn->tn_val->v_quad == 0; 4263 } 4264 4265 /* 4266 * Perform some tests on expressions which can't be done in build_binary() 4267 * and functions called by build_binary(). These tests must be done here 4268 * because we need some information about the context in which the operations 4269 * are performed. 4270 * After all tests are performed and dofreeblk is true, expr() frees the 4271 * memory which is used for the expression. 4272 */ 4273 void 4274 expr(tnode_t *tn, bool vctx, bool cond, bool dofreeblk, bool is_do_while) 4275 { 4276 4277 if (tn == NULL) { /* in case of errors */ 4278 expr_free_all(); 4279 return; 4280 } 4281 4282 /* expr() is also called in global initializations */ 4283 if (dcs->d_kind != DK_EXTERN && !is_do_while) 4284 check_statement_reachable(); 4285 4286 check_expr_misc(tn, vctx, cond, !cond, false, false, false); 4287 if (tn->tn_op == ASSIGN) { 4288 if (hflag && cond) 4289 /* assignment in conditional context */ 4290 warning(159); 4291 } else if (tn->tn_op == CON) { 4292 if (hflag && cond && !constcond_flag && 4293 !tn->tn_system_dependent && 4294 !(is_do_while && 4295 is_constcond_false(tn, tn->tn_type->t_tspec))) 4296 /* constant in conditional context */ 4297 warning(161); 4298 } 4299 if (!modtab[tn->tn_op].m_has_side_effect) { 4300 /* 4301 * for left operands of COMMA this warning is already 4302 * printed 4303 */ 4304 if (tn->tn_op != COMMA && !vctx && !cond) 4305 check_null_effect(tn); 4306 } 4307 debug_node(tn); 4308 4309 /* free the tree memory */ 4310 if (dofreeblk) 4311 expr_free_all(); 4312 } 4313 4314 static bool 4315 has_side_effect(const tnode_t *tn) /* NOLINT(misc-no-recursion) */ 4316 { 4317 op_t op = tn->tn_op; 4318 4319 if (modtab[op].m_has_side_effect) 4320 return true; 4321 4322 if (op == CVT && tn->tn_type->t_tspec == VOID) 4323 return has_side_effect(tn->tn_left); 4324 4325 /* XXX: Why not has_side_effect(tn->tn_left) as well? */ 4326 if (op == LOGAND || op == LOGOR) 4327 return has_side_effect(tn->tn_right); 4328 4329 /* XXX: Why not has_side_effect(tn->tn_left) as well? */ 4330 if (op == QUEST) 4331 return has_side_effect(tn->tn_right); 4332 4333 if (op == COLON || op == COMMA) { 4334 return has_side_effect(tn->tn_left) || 4335 has_side_effect(tn->tn_right); 4336 } 4337 4338 return false; 4339 } 4340 4341 static bool 4342 is_void_cast(const tnode_t *tn) 4343 { 4344 4345 return tn->tn_op == CVT && tn->tn_cast && 4346 tn->tn_type->t_tspec == VOID; 4347 } 4348 4349 static bool 4350 is_local_symbol(const tnode_t *tn) 4351 { 4352 4353 return tn->tn_op == LOAD && 4354 tn->tn_left->tn_op == NAME && 4355 tn->tn_left->tn_sym->s_scl == AUTO; 4356 } 4357 4358 static bool 4359 is_int_constant_zero(const tnode_t *tn) 4360 { 4361 4362 return tn->tn_op == CON && 4363 tn->tn_type->t_tspec == INT && 4364 tn->tn_val->v_quad == 0; 4365 } 4366 4367 static void 4368 check_null_effect(const tnode_t *tn) 4369 { 4370 4371 if (!hflag) 4372 return; 4373 if (has_side_effect(tn)) 4374 return; 4375 if (is_void_cast(tn) && is_local_symbol(tn->tn_left)) 4376 return; 4377 if (is_void_cast(tn) && is_int_constant_zero(tn->tn_left)) 4378 return; 4379 4380 /* expression has null effect */ 4381 warning(129); 4382 } 4383 4384 static void 4385 check_expr_addr(const tnode_t *ln, bool szof, bool fcall) 4386 { 4387 /* XXX: Taking warn_about_unreachable into account here feels wrong. */ 4388 if (ln->tn_op == NAME && (reached || !warn_about_unreachable)) { 4389 if (!szof) 4390 mark_as_set(ln->tn_sym); 4391 mark_as_used(ln->tn_sym, fcall, szof); 4392 } 4393 if (ln->tn_op == INDIR && ln->tn_left->tn_op == PLUS) 4394 /* check the range of array indices */ 4395 check_array_index(ln->tn_left, true); 4396 } 4397 4398 static void 4399 check_expr_load(const tnode_t *ln) 4400 { 4401 if (ln->tn_op == INDIR && ln->tn_left->tn_op == PLUS) 4402 /* check the range of array indices */ 4403 check_array_index(ln->tn_left, false); 4404 } 4405 4406 static void 4407 check_expr_side_effect(const tnode_t *ln, bool szof) 4408 { 4409 scl_t sc; 4410 dinfo_t *di; 4411 4412 /* XXX: Taking warn_about_unreachable into account here feels wrong. */ 4413 if (ln->tn_op == NAME && (reached || !warn_about_unreachable)) { 4414 sc = ln->tn_sym->s_scl; 4415 /* 4416 * Look if there was a asm statement in one of the 4417 * compound statements we are in. If not, we don't 4418 * print a warning. 4419 */ 4420 for (di = dcs; di != NULL; di = di->d_enclosing) { 4421 if (di->d_asm) 4422 break; 4423 } 4424 if (sc != EXTERN && sc != STATIC && 4425 !ln->tn_sym->s_set && !szof && di == NULL) { 4426 /* '%s' may be used before set */ 4427 warning(158, ln->tn_sym->s_name); 4428 mark_as_set(ln->tn_sym); 4429 } 4430 mark_as_used(ln->tn_sym, false, false); 4431 } 4432 } 4433 4434 static void 4435 check_expr_assign(const tnode_t *ln, bool szof) 4436 { 4437 /* XXX: Taking warn_about_unreachable into account here feels wrong. */ 4438 if (ln->tn_op == NAME && !szof && (reached || !warn_about_unreachable)) { 4439 mark_as_set(ln->tn_sym); 4440 if (ln->tn_sym->s_scl == EXTERN) 4441 outusg(ln->tn_sym); 4442 } 4443 if (ln->tn_op == INDIR && ln->tn_left->tn_op == PLUS) 4444 /* check the range of array indices */ 4445 check_array_index(ln->tn_left, false); 4446 } 4447 4448 static void 4449 check_expr_call(const tnode_t *tn, const tnode_t *ln, 4450 bool szof, bool vctx, bool cond, bool retval_discarded) 4451 { 4452 lint_assert(ln->tn_op == ADDR); 4453 lint_assert(ln->tn_left->tn_op == NAME); 4454 if (!szof && 4455 !is_compiler_builtin(ln->tn_left->tn_sym->s_name)) 4456 outcall(tn, vctx || cond, retval_discarded); 4457 } 4458 4459 static bool 4460 check_expr_op(const tnode_t *tn, op_t op, const tnode_t *ln, 4461 bool szof, bool fcall, bool vctx, bool cond, 4462 bool retval_discarded, bool eqwarn) 4463 { 4464 switch (op) { 4465 case ADDR: 4466 check_expr_addr(ln, szof, fcall); 4467 break; 4468 case LOAD: 4469 check_expr_load(ln); 4470 /* FALLTHROUGH */ 4471 case PUSH: 4472 case INCBEF: 4473 case DECBEF: 4474 case INCAFT: 4475 case DECAFT: 4476 case ADDASS: 4477 case SUBASS: 4478 case MULASS: 4479 case DIVASS: 4480 case MODASS: 4481 case ANDASS: 4482 case ORASS: 4483 case XORASS: 4484 case SHLASS: 4485 case SHRASS: 4486 case REAL: 4487 case IMAG: 4488 check_expr_side_effect(ln, szof); 4489 break; 4490 case ASSIGN: 4491 check_expr_assign(ln, szof); 4492 break; 4493 case CALL: 4494 check_expr_call(tn, ln, szof, vctx, cond, retval_discarded); 4495 break; 4496 case EQ: 4497 if (hflag && eqwarn) 4498 /* operator '==' found where '=' was expected */ 4499 warning(160); 4500 break; 4501 case CON: 4502 case NAME: 4503 case STRING: 4504 return false; 4505 default: 4506 break; 4507 } 4508 return true; 4509 } 4510 4511 /* 4512 * vctx ??? 4513 * cond whether the expression is a condition that 4514 * will be compared with 0 4515 * eqwarn whether the operator '==' might be a 4516 * misspelled '=' 4517 * fcall whether the expression is a function call 4518 * retval_discarded whether the return value of a function call 4519 * is discarded; such calls will be analyzed by 4520 * lint2 in messages 4, 8 and 9 4521 * szof whether the expression is part of a sizeof 4522 * expression, which means that its value is 4523 * discarded since only the type is relevant 4524 */ 4525 void 4526 check_expr_misc(const tnode_t *tn, bool vctx, bool cond, 4527 bool eqwarn, bool fcall, bool retval_discarded, bool szof) 4528 { 4529 tnode_t *ln, *rn; 4530 const mod_t *mp; 4531 op_t op; 4532 bool cvctx, ccond, eq, discard; 4533 4534 if (tn == NULL) 4535 return; 4536 4537 ln = tn->tn_left; 4538 rn = tn->tn_right; 4539 mp = &modtab[op = tn->tn_op]; 4540 4541 if (!check_expr_op(tn, op, ln, 4542 szof, fcall, vctx, cond, retval_discarded, eqwarn)) 4543 return; 4544 4545 cvctx = mp->m_value_context; 4546 ccond = mp->m_compares_with_zero; 4547 eq = mp->m_warn_if_operand_eq && 4548 !ln->tn_parenthesized && 4549 rn != NULL && !rn->tn_parenthesized; 4550 4551 /* 4552 * values of operands of ':' are not used if the type of at least 4553 * one of the operands (for gcc compatibility) is void 4554 * XXX test/value context of QUEST should probably be used as 4555 * context for both operands of COLON 4556 */ 4557 if (op == COLON && tn->tn_type->t_tspec == VOID) 4558 cvctx = ccond = false; 4559 discard = op == CVT && tn->tn_type->t_tspec == VOID; 4560 check_expr_misc(ln, cvctx, ccond, eq, op == CALL, discard, szof); 4561 4562 switch (op) { 4563 case PUSH: 4564 if (rn != NULL) 4565 check_expr_misc(rn, false, false, eq, false, false, 4566 szof); 4567 break; 4568 case LOGAND: 4569 case LOGOR: 4570 check_expr_misc(rn, false, true, eq, false, false, szof); 4571 break; 4572 case COLON: 4573 check_expr_misc(rn, cvctx, ccond, eq, false, false, szof); 4574 break; 4575 case COMMA: 4576 check_expr_misc(rn, vctx, cond, false, false, false, szof); 4577 break; 4578 default: 4579 if (mp->m_binary) 4580 check_expr_misc(rn, true, false, eq, false, false, 4581 szof); 4582 break; 4583 } 4584 } 4585 4586 /* 4587 * Checks the range of array indices, if possible. 4588 * amper is set if only the address of the element is used. This 4589 * means that the index is allowed to refer to the first element 4590 * after the array. 4591 */ 4592 static void 4593 check_array_index(tnode_t *tn, bool amper) 4594 { 4595 int dim; 4596 tnode_t *ln, *rn; 4597 int elsz; 4598 int64_t con; 4599 4600 ln = tn->tn_left; 4601 rn = tn->tn_right; 4602 4603 /* We can only check constant indices. */ 4604 if (rn->tn_op != CON) 4605 return; 4606 4607 /* Return if the left node does not stem from an array. */ 4608 if (ln->tn_op != ADDR) 4609 return; 4610 if (ln->tn_left->tn_op != STRING && ln->tn_left->tn_op != NAME) 4611 return; 4612 if (ln->tn_left->tn_type->t_tspec != ARRAY) 4613 return; 4614 4615 /* 4616 * For incomplete array types, we can print a warning only if 4617 * the index is negative. 4618 */ 4619 if (is_incomplete(ln->tn_left->tn_type) && rn->tn_val->v_quad >= 0) 4620 return; 4621 4622 /* Get the size of one array element */ 4623 if ((elsz = length_in_bits(ln->tn_type->t_subt, NULL)) == 0) 4624 return; 4625 elsz /= CHAR_SIZE; 4626 4627 /* Change the unit of the index from bytes to element size. */ 4628 if (is_uinteger(rn->tn_type->t_tspec)) { 4629 con = (uint64_t)rn->tn_val->v_quad / elsz; 4630 } else { 4631 con = rn->tn_val->v_quad / elsz; 4632 } 4633 4634 dim = ln->tn_left->tn_type->t_dim + (amper ? 1 : 0); 4635 4636 if (!is_uinteger(rn->tn_type->t_tspec) && con < 0) { 4637 /* array subscript cannot be negative: %ld */ 4638 warning(167, (long)con); 4639 } else if (dim > 0 && (uint64_t)con >= (uint64_t)dim) { 4640 /* array subscript cannot be > %d: %ld */ 4641 warning(168, dim - 1, (long)con); 4642 } 4643 } 4644 4645 static bool 4646 is_out_of_char_range(const tnode_t *tn) 4647 { 4648 return tn->tn_op == CON && 4649 !(0 <= tn->tn_val->v_quad && 4650 tn->tn_val->v_quad < 1 << (CHAR_SIZE - 1)); 4651 } 4652 4653 /* 4654 * Check for ordered comparisons of unsigned values with 0. 4655 */ 4656 static void 4657 check_integer_comparison(op_t op, tnode_t *ln, tnode_t *rn) 4658 { 4659 tspec_t lt, rt; 4660 4661 lt = ln->tn_type->t_tspec; 4662 rt = rn->tn_type->t_tspec; 4663 4664 if (ln->tn_op != CON && rn->tn_op != CON) 4665 return; 4666 4667 if (!is_integer(lt) || !is_integer(rt)) 4668 return; 4669 4670 if (hflag || pflag) { 4671 if (lt == CHAR && is_out_of_char_range(rn)) { 4672 /* nonportable character comparison '%s %d' */ 4673 warning(230, op_name(op), (int)rn->tn_val->v_quad); 4674 return; 4675 } 4676 if (rt == CHAR && is_out_of_char_range(ln)) { 4677 /* nonportable character comparison '%s %d' */ 4678 warning(230, op_name(op), (int)ln->tn_val->v_quad); 4679 return; 4680 } 4681 } 4682 4683 if (is_uinteger(lt) && !is_uinteger(rt) && 4684 rn->tn_op == CON && rn->tn_val->v_quad <= 0) { 4685 if (rn->tn_val->v_quad < 0) { 4686 /* operator '%s' compares '%s' with '%s' */ 4687 warning(162, op_name(op), 4688 type_name(ln->tn_type), "negative constant"); 4689 } else if (op == LT || op == GE) { 4690 /* operator '%s' compares '%s' with '%s' */ 4691 warning(162, op_name(op), type_name(ln->tn_type), "0"); 4692 } 4693 return; 4694 } 4695 if (is_uinteger(rt) && !is_uinteger(lt) && 4696 ln->tn_op == CON && ln->tn_val->v_quad <= 0) { 4697 if (ln->tn_val->v_quad < 0) { 4698 /* operator '%s' compares '%s' with '%s' */ 4699 warning(162, op_name(op), 4700 "negative constant", type_name(rn->tn_type)); 4701 } else if (op == GT || op == LE) { 4702 /* operator '%s' compares '%s' with '%s' */ 4703 warning(162, op_name(op), "0", type_name(rn->tn_type)); 4704 } 4705 return; 4706 } 4707 } 4708 4709 /* 4710 * Return whether the expression can be used for static initialization. 4711 * 4712 * Constant initialization expressions must be constant or an address 4713 * of a static object with an optional offset. In the first case, 4714 * the result is returned in *offsp. In the second case, the static 4715 * object is returned in *symp and the offset in *offsp. 4716 * 4717 * The expression can consist of PLUS, MINUS, ADDR, NAME, STRING and 4718 * CON. Type conversions are allowed if they do not change binary 4719 * representation (including width). 4720 * 4721 * C99 6.6 "Constant expressions" 4722 * C99 6.7.8p4 restricts initializers for static storage duration 4723 */ 4724 bool 4725 constant_addr(const tnode_t *tn, const sym_t **symp, ptrdiff_t *offsp) 4726 { 4727 const sym_t *sym; 4728 ptrdiff_t offs1, offs2; 4729 tspec_t t, ot; 4730 4731 switch (tn->tn_op) { 4732 case MINUS: 4733 if (tn->tn_right->tn_op == CVT) 4734 return constant_addr(tn->tn_right, symp, offsp); 4735 else if (tn->tn_right->tn_op != CON) 4736 return false; 4737 /* FALLTHROUGH */ 4738 case PLUS: 4739 offs1 = offs2 = 0; 4740 if (tn->tn_left->tn_op == CON) { 4741 offs1 = (ptrdiff_t)tn->tn_left->tn_val->v_quad; 4742 if (!constant_addr(tn->tn_right, &sym, &offs2)) 4743 return false; 4744 } else if (tn->tn_right->tn_op == CON) { 4745 offs2 = (ptrdiff_t)tn->tn_right->tn_val->v_quad; 4746 if (tn->tn_op == MINUS) 4747 offs2 = -offs2; 4748 if (!constant_addr(tn->tn_left, &sym, &offs1)) 4749 return false; 4750 } else { 4751 return false; 4752 } 4753 *symp = sym; 4754 *offsp = offs1 + offs2; 4755 return true; 4756 case ADDR: 4757 if (tn->tn_left->tn_op == NAME) { 4758 *symp = tn->tn_left->tn_sym; 4759 *offsp = 0; 4760 return true; 4761 } else { 4762 /* 4763 * If this would be the front end of a compiler we 4764 * would return a label instead of 0, at least if 4765 * 'tn->tn_left->tn_op == STRING'. 4766 */ 4767 *symp = NULL; 4768 *offsp = 0; 4769 return true; 4770 } 4771 case CVT: 4772 t = tn->tn_type->t_tspec; 4773 ot = tn->tn_left->tn_type->t_tspec; 4774 if ((!is_integer(t) && t != PTR) || 4775 (!is_integer(ot) && ot != PTR)) { 4776 return false; 4777 } 4778 #if 0 4779 /* 4780 * consider: 4781 * struct foo { 4782 * unsigned char a; 4783 * } f = { 4784 * (unsigned char)(unsigned long) 4785 * (&(((struct foo *)0)->a)) 4786 * }; 4787 * since psize(unsigned long) != psize(unsigned char), 4788 * this fails. 4789 */ 4790 else if (psize(t) != psize(ot)) 4791 return -1; 4792 #endif 4793 return constant_addr(tn->tn_left, symp, offsp); 4794 default: 4795 return false; 4796 } 4797 } 4798 4799 /* Append s2 to s1, then free s2. */ 4800 strg_t * 4801 cat_strings(strg_t *s1, strg_t *s2) 4802 { 4803 4804 if (s1->st_char != s2->st_char) { 4805 /* cannot concatenate wide and regular string literals */ 4806 error(292); 4807 return s1; 4808 } 4809 4810 size_t len1 = s1->st_len; 4811 size_t len2 = s2->st_len; 4812 size_t chsize = s1->st_char ? sizeof(char) : sizeof(wchar_t); 4813 size_t size1 = len1 * chsize; 4814 size_t size2 = (len2 + 1) * chsize; 4815 s1->st_mem = xrealloc(s1->st_mem, size1 + size2); 4816 memcpy((char *)s1->st_mem + size1, s2->st_mem, size2); 4817 free(s2->st_mem); 4818 4819 s1->st_len = len1 + len2; 4820 free(s2); 4821 4822 return s1; 4823 } 4824 4825 static bool 4826 is_confusing_precedence(op_t op, op_t lop, bool lparen, op_t rop, bool rparen) 4827 { 4828 4829 if (op == SHL || op == SHR) { 4830 if (!lparen && (lop == PLUS || lop == MINUS)) 4831 return true; 4832 if (!rparen && (rop == PLUS || rop == MINUS)) 4833 return true; 4834 return false; 4835 } 4836 4837 if (op == LOGOR) { 4838 if (!lparen && lop == LOGAND) 4839 return true; 4840 if (!rparen && rop == LOGAND) 4841 return true; 4842 return false; 4843 } 4844 4845 lint_assert(op == BITAND || op == BITXOR || op == BITOR); 4846 if (!lparen && lop != op) { 4847 if (lop == PLUS || lop == MINUS) 4848 return true; 4849 if (lop == BITAND || lop == BITXOR) 4850 return true; 4851 } 4852 if (!rparen && rop != op) { 4853 if (rop == PLUS || rop == MINUS) 4854 return true; 4855 if (rop == BITAND || rop == BITXOR) 4856 return true; 4857 } 4858 return false; 4859 } 4860 4861 /* 4862 * Print a warning if the given node has operands which should be 4863 * parenthesized. 4864 * 4865 * XXX Does not work if an operand is a constant expression. Constant 4866 * expressions are already folded. 4867 */ 4868 static void 4869 check_precedence_confusion(tnode_t *tn) 4870 { 4871 tnode_t *ln, *rn; 4872 4873 if (!hflag) 4874 return; 4875 4876 debug_node(tn); 4877 4878 lint_assert(is_binary(tn)); 4879 for (ln = tn->tn_left; ln->tn_op == CVT; ln = ln->tn_left) 4880 continue; 4881 for (rn = tn->tn_right; rn->tn_op == CVT; rn = rn->tn_left) 4882 continue; 4883 4884 if (is_confusing_precedence(tn->tn_op, 4885 ln->tn_op, ln->tn_parenthesized, 4886 rn->tn_op, rn->tn_parenthesized)) { 4887 /* precedence confusion possible: parenthesize! */ 4888 warning(169); 4889 } 4890 } 4891 4892 typedef struct stmt_expr { 4893 struct memory_block *se_mem; 4894 sym_t *se_sym; 4895 struct stmt_expr *se_enclosing; 4896 } stmt_expr; 4897 4898 static stmt_expr *stmt_exprs; 4899 4900 void 4901 begin_statement_expr(void) 4902 { 4903 stmt_expr *se = xmalloc(sizeof(*se)); 4904 se->se_mem = expr_save_memory(); 4905 se->se_sym = NULL; 4906 se->se_enclosing = stmt_exprs; 4907 stmt_exprs = se; 4908 } 4909 4910 void 4911 do_statement_expr(tnode_t *tn) 4912 { 4913 block_level--; 4914 mem_block_level--; 4915 stmt_exprs->se_sym = tn != NULL 4916 ? mktempsym(block_dup_type(tn->tn_type)) 4917 : NULL; /* after a syntax error */ 4918 mem_block_level++; 4919 block_level++; 4920 /* ({ }) is a GCC extension */ 4921 gnuism(320); 4922 } 4923 4924 tnode_t * 4925 end_statement_expr(void) 4926 { 4927 stmt_expr *se = stmt_exprs; 4928 if (se->se_sym == NULL) 4929 return NULL; /* after a syntax error */ 4930 tnode_t *tn = build_name(se->se_sym, false); 4931 (void)expr_save_memory(); /* leak */ 4932 expr_restore_memory(se->se_mem); 4933 stmt_exprs = se->se_enclosing; 4934 free(se); 4935 return tn; 4936 } 4937