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