1 /* Diagnostic routines shared by all languages that are variants of C. 2 Copyright (C) 1992-2024 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify it under 7 the terms of the GNU General Public License as published by the Free 8 Software Foundation; either version 3, or (at your option) any later 9 version. 10 11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12 WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GCC; see the file COPYING3. If not see 18 <http://www.gnu.org/licenses/>. */ 19 20 #define INCLUDE_STRING 21 #include "config.h" 22 #include "system.h" 23 #include "coretypes.h" 24 #include "target.h" 25 #include "function.h" 26 #include "tree.h" 27 #include "c-common.h" 28 #include "memmodel.h" 29 #include "tm_p.h" 30 #include "diagnostic.h" 31 #include "intl.h" 32 #include "stringpool.h" 33 #include "attribs.h" 34 #include "asan.h" 35 #include "gcc-rich-location.h" 36 #include "gimplify.h" 37 #include "c-family/c-indentation.h" 38 #include "c-family/c-spellcheck.h" 39 #include "calls.h" 40 #include "stor-layout.h" 41 #include "tree-pretty-print.h" 42 #include "langhooks.h" 43 44 /* Print a warning if a constant expression had overflow in folding. 45 Invoke this function on every expression that the language 46 requires to be a constant expression. 47 Note the ANSI C standard says it is erroneous for a 48 constant expression to overflow. */ 49 50 void 51 constant_expression_warning (tree value) 52 { 53 if (warn_overflow && pedantic 54 && (TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST 55 || TREE_CODE (value) == FIXED_CST 56 || TREE_CODE (value) == VECTOR_CST 57 || TREE_CODE (value) == COMPLEX_CST) 58 && TREE_OVERFLOW (value)) 59 pedwarn (input_location, OPT_Woverflow, "overflow in constant expression"); 60 } 61 62 /* The same as above but print an unconditional error. */ 63 64 void 65 constant_expression_error (tree value) 66 { 67 if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST 68 || TREE_CODE (value) == FIXED_CST 69 || TREE_CODE (value) == VECTOR_CST 70 || TREE_CODE (value) == COMPLEX_CST) 71 && TREE_OVERFLOW (value)) 72 error ("overflow in constant expression"); 73 } 74 75 /* Print a warning if an expression result VALUE had an overflow 76 in folding and its operands hadn't. EXPR, which may be null, is 77 the operand of the expression. 78 79 Invoke this function on every expression that 80 (1) appears in the source code, and 81 (2) is a constant expression that overflowed, and 82 (3) is not already checked by convert_and_check; 83 however, do not invoke this function on operands of explicit casts 84 or when the expression is the result of an operator and any operand 85 already overflowed. */ 86 87 void 88 overflow_warning (location_t loc, tree value, tree expr) 89 { 90 if (c_inhibit_evaluation_warnings != 0) 91 return; 92 93 const char *warnfmt = NULL; 94 95 switch (TREE_CODE (value)) 96 { 97 case INTEGER_CST: 98 warnfmt = (expr 99 ? G_("integer overflow in expression %qE of type %qT " 100 "results in %qE") 101 : G_("integer overflow in expression of type %qT " 102 "results in %qE")); 103 break; 104 105 case REAL_CST: 106 warnfmt = (expr 107 ? G_("floating point overflow in expression %qE " 108 "of type %qT results in %qE") 109 : G_("floating point overflow in expression of type %qT " 110 "results in %qE")); 111 break; 112 113 case FIXED_CST: 114 warnfmt = (expr 115 ? G_("fixed-point overflow in expression %qE of type %qT " 116 "results in %qE") 117 : G_("fixed-point overflow in expression of type %qT " 118 "results in %qE")); 119 break; 120 121 case VECTOR_CST: 122 warnfmt = (expr 123 ? G_("vector overflow in expression %qE of type %qT " 124 "results in %qE") 125 : G_("vector overflow in expression of type %qT " 126 "results in %qE")); 127 break; 128 129 case COMPLEX_CST: 130 if (TREE_CODE (TREE_REALPART (value)) == INTEGER_CST) 131 warnfmt = (expr 132 ? G_("complex integer overflow in expression %qE " 133 "of type %qT results in %qE") 134 : G_("complex integer overflow in expression of type %qT " 135 "results in %qE")); 136 else if (TREE_CODE (TREE_REALPART (value)) == REAL_CST) 137 warnfmt = (expr 138 ? G_("complex floating point overflow in expression %qE " 139 "of type %qT results in %qE") 140 : G_("complex floating point overflow in expression " 141 "of type %qT results in %qE")); 142 else 143 return; 144 break; 145 146 default: 147 return; 148 } 149 150 bool warned; 151 if (expr) 152 warned = warning_at (loc, OPT_Woverflow, warnfmt, expr, TREE_TYPE (expr), 153 value); 154 else 155 warned = warning_at (loc, OPT_Woverflow, warnfmt, TREE_TYPE (value), 156 value); 157 158 if (warned) 159 suppress_warning (value, OPT_Woverflow); 160 } 161 162 /* Helper function for walk_tree. Unwrap C_MAYBE_CONST_EXPRs in an expression 163 pointed to by TP. */ 164 165 static tree 166 unwrap_c_maybe_const (tree *tp, int *walk_subtrees, void *) 167 { 168 if (TREE_CODE (*tp) == C_MAYBE_CONST_EXPR) 169 { 170 *tp = C_MAYBE_CONST_EXPR_EXPR (*tp); 171 /* C_MAYBE_CONST_EXPRs don't nest. */ 172 *walk_subtrees = false; 173 } 174 return NULL_TREE; 175 } 176 177 /* Warn about uses of logical || / && operator in a context where it 178 is likely that the bitwise equivalent was intended by the 179 programmer. We have seen an expression in which CODE is a binary 180 operator used to combine expressions OP_LEFT and OP_RIGHT, which before folding 181 had CODE_LEFT and CODE_RIGHT, into an expression of type TYPE. */ 182 183 void 184 warn_logical_operator (location_t location, enum tree_code code, tree type, 185 enum tree_code code_left, tree op_left, 186 enum tree_code ARG_UNUSED (code_right), tree op_right) 187 { 188 int or_op = (code == TRUTH_ORIF_EXPR || code == TRUTH_OR_EXPR); 189 int in0_p, in1_p, in_p; 190 tree low0, low1, low, high0, high1, high, lhs, rhs, tem; 191 bool strict_overflow_p = false; 192 193 if (!warn_logical_op) 194 return; 195 196 if (code != TRUTH_ANDIF_EXPR 197 && code != TRUTH_AND_EXPR 198 && code != TRUTH_ORIF_EXPR 199 && code != TRUTH_OR_EXPR) 200 return; 201 202 /* We don't want to warn if either operand comes from a macro 203 expansion. ??? This doesn't work with e.g. NEGATE_EXPR yet; 204 see PR61534. */ 205 if (from_macro_expansion_at (EXPR_LOCATION (op_left)) 206 || from_macro_expansion_at (EXPR_LOCATION (op_right))) 207 return; 208 209 /* Warn if &&/|| are being used in a context where it is 210 likely that the bitwise equivalent was intended by the 211 programmer. That is, an expression such as op && MASK 212 where op should not be any boolean expression, nor a 213 constant, and mask seems to be a non-boolean integer constant. */ 214 STRIP_ANY_LOCATION_WRAPPER (op_right); 215 if (TREE_CODE (op_right) == CONST_DECL) 216 /* An enumerator counts as a constant. */ 217 op_right = DECL_INITIAL (op_right); 218 tree stripped_op_left = tree_strip_any_location_wrapper (op_left); 219 if (!truth_value_p (code_left) 220 && INTEGRAL_TYPE_P (TREE_TYPE (op_left)) 221 && !CONSTANT_CLASS_P (stripped_op_left) 222 && TREE_CODE (stripped_op_left) != CONST_DECL 223 && !warning_suppressed_p (op_left, OPT_Wlogical_op) 224 && TREE_CODE (op_right) == INTEGER_CST 225 && !integer_zerop (op_right) 226 && !integer_onep (op_right)) 227 { 228 bool warned; 229 if (or_op) 230 warned 231 = warning_at (location, OPT_Wlogical_op, 232 "logical %<or%> applied to non-boolean constant"); 233 else 234 warned 235 = warning_at (location, OPT_Wlogical_op, 236 "logical %<and%> applied to non-boolean constant"); 237 if (warned) 238 suppress_warning (op_left, OPT_Wlogical_op); 239 return; 240 } 241 242 /* We do not warn for constants because they are typical of macro 243 expansions that test for features. */ 244 if (CONSTANT_CLASS_P (fold_for_warn (op_left)) 245 || CONSTANT_CLASS_P (fold_for_warn (op_right))) 246 return; 247 248 /* This warning only makes sense with logical operands. */ 249 if (!(truth_value_p (TREE_CODE (op_left)) 250 || INTEGRAL_TYPE_P (TREE_TYPE (op_left))) 251 || !(truth_value_p (TREE_CODE (op_right)) 252 || INTEGRAL_TYPE_P (TREE_TYPE (op_right)))) 253 return; 254 255 /* The range computations only work with scalars. */ 256 if (VECTOR_TYPE_P (TREE_TYPE (op_left)) 257 || VECTOR_TYPE_P (TREE_TYPE (op_right))) 258 return; 259 260 /* We first test whether either side separately is trivially true 261 (with OR) or trivially false (with AND). If so, do not warn. 262 This is a common idiom for testing ranges of data types in 263 portable code. */ 264 op_left = unshare_expr (op_left); 265 walk_tree_without_duplicates (&op_left, unwrap_c_maybe_const, NULL); 266 lhs = make_range (op_left, &in0_p, &low0, &high0, &strict_overflow_p); 267 if (!lhs) 268 return; 269 270 /* If this is an OR operation, invert both sides; now, the result 271 should be always false to get a warning. */ 272 if (or_op) 273 in0_p = !in0_p; 274 275 tem = build_range_check (UNKNOWN_LOCATION, type, lhs, in0_p, low0, high0); 276 if (tem && integer_zerop (tem)) 277 return; 278 279 op_right = unshare_expr (op_right); 280 walk_tree_without_duplicates (&op_right, unwrap_c_maybe_const, NULL); 281 rhs = make_range (op_right, &in1_p, &low1, &high1, &strict_overflow_p); 282 if (!rhs) 283 return; 284 285 /* If this is an OR operation, invert both sides; now, the result 286 should be always false to get a warning. */ 287 if (or_op) 288 in1_p = !in1_p; 289 290 tem = build_range_check (UNKNOWN_LOCATION, type, rhs, in1_p, low1, high1); 291 if (tem && integer_zerop (tem)) 292 return; 293 294 /* If both expressions have the same operand, if we can merge the 295 ranges, ... */ 296 if (operand_equal_p (lhs, rhs, 0) 297 && merge_ranges (&in_p, &low, &high, in0_p, low0, high0, 298 in1_p, low1, high1)) 299 { 300 tem = build_range_check (UNKNOWN_LOCATION, type, lhs, in_p, low, high); 301 /* ... and if the range test is always false, then warn. */ 302 if (tem && integer_zerop (tem)) 303 { 304 if (or_op) 305 warning_at (location, OPT_Wlogical_op, 306 "logical %<or%> of collectively exhaustive tests is " 307 "always true"); 308 else 309 warning_at (location, OPT_Wlogical_op, 310 "logical %<and%> of mutually exclusive tests is " 311 "always false"); 312 } 313 /* Or warn if the operands have exactly the same range, e.g. 314 A > 0 && A > 0. */ 315 else if (tree_int_cst_equal (low0, low1) 316 && tree_int_cst_equal (high0, high1)) 317 { 318 if (or_op) 319 warning_at (location, OPT_Wlogical_op, 320 "logical %<or%> of equal expressions"); 321 else 322 warning_at (location, OPT_Wlogical_op, 323 "logical %<and%> of equal expressions"); 324 } 325 } 326 } 327 328 /* Helper function for warn_tautological_cmp. Look for ARRAY_REFs 329 with constant indices. */ 330 331 static tree 332 find_array_ref_with_const_idx_r (tree *expr_p, int *, void *) 333 { 334 tree expr = *expr_p; 335 336 if ((TREE_CODE (expr) == ARRAY_REF 337 || TREE_CODE (expr) == ARRAY_RANGE_REF) 338 && (TREE_CODE (fold_for_warn (TREE_OPERAND (expr, 1))) 339 == INTEGER_CST)) 340 return integer_type_node; 341 342 return NULL_TREE; 343 } 344 345 /* Subroutine of warn_tautological_cmp. Warn about bitwise comparison 346 that always evaluate to true or false. LOC is the location of the 347 ==/!= comparison specified by CODE; LHS and RHS are the usual operands 348 of this comparison. */ 349 350 static void 351 warn_tautological_bitwise_comparison (const op_location_t &loc, tree_code code, 352 tree lhs, tree rhs) 353 { 354 if (code != EQ_EXPR && code != NE_EXPR) 355 return; 356 357 /* Extract the operands from e.g. (x & 8) == 4. */ 358 tree bitop; 359 tree cst; 360 tree stripped_lhs = tree_strip_any_location_wrapper (lhs); 361 tree stripped_rhs = tree_strip_any_location_wrapper (rhs); 362 if ((TREE_CODE (lhs) == BIT_AND_EXPR 363 || TREE_CODE (lhs) == BIT_IOR_EXPR) 364 && TREE_CODE (stripped_rhs) == INTEGER_CST) 365 bitop = lhs, cst = stripped_rhs; 366 else if ((TREE_CODE (rhs) == BIT_AND_EXPR 367 || TREE_CODE (rhs) == BIT_IOR_EXPR) 368 && TREE_CODE (stripped_lhs) == INTEGER_CST) 369 bitop = rhs, cst = stripped_lhs; 370 else 371 return; 372 373 tree bitopcst; 374 tree bitop_op0 = fold_for_warn (TREE_OPERAND (bitop, 0)); 375 if (TREE_CODE (bitop_op0) == INTEGER_CST) 376 bitopcst = bitop_op0; 377 else { 378 tree bitop_op1 = fold_for_warn (TREE_OPERAND (bitop, 1)); 379 if (TREE_CODE (bitop_op1) == INTEGER_CST) 380 bitopcst = bitop_op1; 381 else 382 return; 383 } 384 385 /* Note that the two operands are from before the usual integer 386 conversions, so their types might not be the same. 387 Use the larger of the two precisions and ignore bits outside 388 of that. */ 389 int prec = MAX (TYPE_PRECISION (TREE_TYPE (cst)), 390 TYPE_PRECISION (TREE_TYPE (bitopcst))); 391 392 wide_int bitopcstw = wi::to_wide (bitopcst, prec); 393 wide_int cstw = wi::to_wide (cst, prec); 394 395 wide_int res; 396 if (TREE_CODE (bitop) == BIT_AND_EXPR) 397 res = bitopcstw & cstw; 398 else 399 res = bitopcstw | cstw; 400 401 /* For BIT_AND only warn if (CST2 & CST1) != CST1, and 402 for BIT_OR only if (CST2 | CST1) != CST1. */ 403 if (res == cstw) 404 return; 405 406 binary_op_rich_location richloc (loc, lhs, rhs, false); 407 if (code == EQ_EXPR) 408 warning_at (&richloc, OPT_Wtautological_compare, 409 "bitwise comparison always evaluates to false"); 410 else 411 warning_at (&richloc, OPT_Wtautological_compare, 412 "bitwise comparison always evaluates to true"); 413 } 414 415 /* Given LOC from a macro expansion, return the map for the outermost 416 macro in the nest of expansions. */ 417 418 static const line_map_macro * 419 get_outermost_macro_expansion (location_t loc) 420 { 421 gcc_assert (from_macro_expansion_at (loc)); 422 423 const line_map *map = linemap_lookup (line_table, loc); 424 const line_map_macro *macro_map; 425 do 426 { 427 macro_map = linemap_check_macro (map); 428 loc = linemap_unwind_toward_expansion (line_table, loc, &map); 429 } while (linemap_macro_expansion_map_p (map)); 430 431 return macro_map; 432 } 433 434 /* Given LOC_A and LOC_B from macro expansions, return true if 435 they are "spelled the same" i.e. if they are both directly from 436 expansion of the same non-function-like macro. */ 437 438 static bool 439 spelled_the_same_p (location_t loc_a, location_t loc_b) 440 { 441 gcc_assert (from_macro_expansion_at (loc_a)); 442 gcc_assert (from_macro_expansion_at (loc_b)); 443 444 const line_map_macro *map_a = get_outermost_macro_expansion (loc_a); 445 const line_map_macro *map_b = get_outermost_macro_expansion (loc_b); 446 447 if (map_a->macro == map_b->macro) 448 if (!cpp_fun_like_macro_p (map_a->macro)) 449 return true; 450 451 return false; 452 } 453 454 /* Warn if a self-comparison always evaluates to true or false. LOC 455 is the location of the comparison with code CODE, LHS and RHS are 456 operands of the comparison. */ 457 458 void 459 warn_tautological_cmp (const op_location_t &loc, enum tree_code code, 460 tree lhs, tree rhs) 461 { 462 if (TREE_CODE_CLASS (code) != tcc_comparison) 463 return; 464 465 /* Don't warn for various macro expansions. */ 466 if (from_macro_expansion_at (loc)) 467 return; 468 bool lhs_in_macro = from_macro_expansion_at (EXPR_LOCATION (lhs)); 469 bool rhs_in_macro = from_macro_expansion_at (EXPR_LOCATION (rhs)); 470 if (lhs_in_macro || rhs_in_macro) 471 { 472 /* Don't warn if exactly one is from a macro. */ 473 if (!(lhs_in_macro && rhs_in_macro)) 474 return; 475 476 /* If both are in a macro, only warn if they're spelled the same. */ 477 if (!spelled_the_same_p (EXPR_LOCATION (lhs), EXPR_LOCATION (rhs))) 478 return; 479 } 480 481 warn_tautological_bitwise_comparison (loc, code, lhs, rhs); 482 483 /* We do not warn for constants because they are typical of macro 484 expansions that test for features, sizeof, and similar. */ 485 if (CONSTANT_CLASS_P (fold_for_warn (lhs)) 486 || CONSTANT_CLASS_P (fold_for_warn (rhs))) 487 return; 488 489 /* Don't warn for e.g. 490 HOST_WIDE_INT n; 491 ... 492 if (n == (long) n) ... 493 */ 494 if ((CONVERT_EXPR_P (lhs) || TREE_CODE (lhs) == NON_LVALUE_EXPR) 495 || (CONVERT_EXPR_P (rhs) || TREE_CODE (rhs) == NON_LVALUE_EXPR)) 496 return; 497 498 /* Don't warn if either LHS or RHS has an IEEE floating-point type. 499 It could be a NaN, and NaN never compares equal to anything, even 500 itself. */ 501 if (FLOAT_TYPE_P (TREE_TYPE (lhs)) || FLOAT_TYPE_P (TREE_TYPE (rhs))) 502 return; 503 504 if (operand_equal_p (lhs, rhs, 0)) 505 { 506 /* Don't warn about array references with constant indices; 507 these are likely to come from a macro. */ 508 if (walk_tree_without_duplicates (&lhs, find_array_ref_with_const_idx_r, 509 NULL)) 510 return; 511 const bool always_true = (code == EQ_EXPR || code == LE_EXPR 512 || code == GE_EXPR || code == UNLE_EXPR 513 || code == UNGE_EXPR || code == UNEQ_EXPR); 514 binary_op_rich_location richloc (loc, lhs, rhs, false); 515 if (always_true) 516 warning_at (&richloc, OPT_Wtautological_compare, 517 "self-comparison always evaluates to true"); 518 else 519 warning_at (&richloc, OPT_Wtautological_compare, 520 "self-comparison always evaluates to false"); 521 } 522 } 523 524 /* Return true iff EXPR only contains boolean operands, or comparisons. */ 525 526 static bool 527 expr_has_boolean_operands_p (tree expr) 528 { 529 STRIP_NOPS (expr); 530 531 if (CONVERT_EXPR_P (expr)) 532 return bool_promoted_to_int_p (expr); 533 else if (UNARY_CLASS_P (expr)) 534 return expr_has_boolean_operands_p (TREE_OPERAND (expr, 0)); 535 else if (BINARY_CLASS_P (expr)) 536 return (expr_has_boolean_operands_p (TREE_OPERAND (expr, 0)) 537 && expr_has_boolean_operands_p (TREE_OPERAND (expr, 1))); 538 else if (COMPARISON_CLASS_P (expr)) 539 return true; 540 else 541 return false; 542 } 543 544 /* Warn about logical not used on the left hand side operand of a comparison. 545 This function assumes that the LHS is inside of TRUTH_NOT_EXPR. 546 Do not warn if RHS is of a boolean type, a logical operator, or 547 a comparison. */ 548 549 void 550 warn_logical_not_parentheses (location_t location, enum tree_code code, 551 tree lhs, tree rhs) 552 { 553 if (TREE_CODE_CLASS (code) != tcc_comparison 554 || TREE_TYPE (rhs) == NULL_TREE 555 || TREE_CODE (TREE_TYPE (rhs)) == BOOLEAN_TYPE 556 || truth_value_p (TREE_CODE (rhs))) 557 return; 558 559 /* Don't warn for expression like !x == ~(bool1 | bool2). */ 560 if (expr_has_boolean_operands_p (rhs)) 561 return; 562 563 /* Don't warn for !x == 0 or !y != 0, those are equivalent to 564 !(x == 0) or !(y != 0). */ 565 if ((code == EQ_EXPR || code == NE_EXPR) 566 && integer_zerop (rhs)) 567 return; 568 569 auto_diagnostic_group d; 570 if (warning_at (location, OPT_Wlogical_not_parentheses, 571 "logical not is only applied to the left hand side of " 572 "comparison") 573 && EXPR_HAS_LOCATION (lhs)) 574 { 575 location_t lhs_loc = EXPR_LOCATION (lhs); 576 rich_location richloc (line_table, lhs_loc); 577 richloc.add_fixit_insert_before (lhs_loc, "("); 578 richloc.add_fixit_insert_after (lhs_loc, ")"); 579 inform (&richloc, "add parentheses around left hand side " 580 "expression to silence this warning"); 581 } 582 } 583 584 /* Warn if EXP contains any computations whose results are not used. 585 Return true if a warning is printed; false otherwise. LOCUS is the 586 (potential) location of the expression. */ 587 588 bool 589 warn_if_unused_value (const_tree exp, location_t locus, bool quiet) 590 { 591 restart: 592 if (TREE_USED (exp) || warning_suppressed_p (exp, OPT_Wunused_value)) 593 return false; 594 595 /* Don't warn about void constructs. This includes casting to void, 596 void function calls, and statement expressions with a final cast 597 to void. */ 598 if (VOID_TYPE_P (TREE_TYPE (exp))) 599 return false; 600 601 if (EXPR_HAS_LOCATION (exp)) 602 locus = EXPR_LOCATION (exp); 603 604 switch (TREE_CODE (exp)) 605 { 606 case PREINCREMENT_EXPR: 607 case POSTINCREMENT_EXPR: 608 case PREDECREMENT_EXPR: 609 case POSTDECREMENT_EXPR: 610 case MODIFY_EXPR: 611 case INIT_EXPR: 612 case TARGET_EXPR: 613 case CALL_EXPR: 614 case TRY_CATCH_EXPR: 615 case EXIT_EXPR: 616 case VA_ARG_EXPR: 617 return false; 618 619 case BIND_EXPR: 620 /* For a binding, warn if no side effect within it. */ 621 exp = BIND_EXPR_BODY (exp); 622 goto restart; 623 624 case SAVE_EXPR: 625 case NON_LVALUE_EXPR: 626 case NOP_EXPR: 627 exp = TREE_OPERAND (exp, 0); 628 goto restart; 629 630 case TRUTH_ORIF_EXPR: 631 case TRUTH_ANDIF_EXPR: 632 /* In && or ||, warn if 2nd operand has no side effect. */ 633 exp = TREE_OPERAND (exp, 1); 634 goto restart; 635 636 case COMPOUND_EXPR: 637 if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus, quiet)) 638 return true; 639 /* Let people do `(foo (), 0)' without a warning. */ 640 if (TREE_CONSTANT (TREE_OPERAND (exp, 1))) 641 return false; 642 exp = TREE_OPERAND (exp, 1); 643 goto restart; 644 645 case COND_EXPR: 646 /* If this is an expression with side effects, don't warn; this 647 case commonly appears in macro expansions. */ 648 if (TREE_SIDE_EFFECTS (exp)) 649 return false; 650 goto warn; 651 652 case COMPLEX_EXPR: 653 /* Warn only if both operands are unused. */ 654 if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus, true) 655 && warn_if_unused_value (TREE_OPERAND (exp, 1), locus, true)) 656 goto warn; 657 return false; 658 659 case INDIRECT_REF: 660 /* Don't warn about automatic dereferencing of references, since 661 the user cannot control it. */ 662 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE) 663 { 664 exp = TREE_OPERAND (exp, 0); 665 goto restart; 666 } 667 /* Fall through. */ 668 669 default: 670 /* Referencing a volatile value is a side effect, so don't warn. */ 671 if ((DECL_P (exp) || REFERENCE_CLASS_P (exp)) 672 && TREE_THIS_VOLATILE (exp)) 673 return false; 674 675 /* If this is an expression which has no operands, there is no value 676 to be unused. There are no such language-independent codes, 677 but front ends may define such. */ 678 if (EXPRESSION_CLASS_P (exp) && TREE_OPERAND_LENGTH (exp) == 0) 679 return false; 680 681 warn: 682 if (quiet) 683 return true; 684 return warning_at (locus, OPT_Wunused_value, "value computed is not used"); 685 } 686 } 687 688 /* Print a warning about casts that might indicate violation of strict 689 aliasing rules if -Wstrict-aliasing is used and strict aliasing 690 mode is in effect. LOC is the location of the expression being 691 cast, EXPR might be from inside it. TYPE is the type we're casting 692 to. */ 693 694 bool 695 strict_aliasing_warning (location_t loc, tree type, tree expr) 696 { 697 if (loc == UNKNOWN_LOCATION) 698 loc = input_location; 699 700 /* Strip pointer conversion chains and get to the correct original type. */ 701 STRIP_NOPS (expr); 702 tree otype = TREE_TYPE (expr); 703 704 if (!(flag_strict_aliasing 705 && POINTER_TYPE_P (type) 706 && POINTER_TYPE_P (otype) 707 && !VOID_TYPE_P (TREE_TYPE (type))) 708 /* If the type we are casting to is a ref-all pointer 709 dereferencing it is always valid. */ 710 || TYPE_REF_CAN_ALIAS_ALL (type)) 711 return false; 712 713 if ((warn_strict_aliasing > 1) && TREE_CODE (expr) == ADDR_EXPR 714 && (DECL_P (TREE_OPERAND (expr, 0)) 715 || handled_component_p (TREE_OPERAND (expr, 0)))) 716 { 717 /* Casting the address of an object to non void pointer. Warn 718 if the cast breaks type based aliasing. */ 719 if (!COMPLETE_TYPE_P (TREE_TYPE (type)) && warn_strict_aliasing == 2) 720 { 721 warning_at (loc, OPT_Wstrict_aliasing, 722 "type-punning to incomplete type " 723 "might break strict-aliasing rules"); 724 return true; 725 } 726 else 727 { 728 /* warn_strict_aliasing >= 3. This includes the default (3). 729 Only warn if the cast is dereferenced immediately. */ 730 alias_set_type set1 731 = get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0))); 732 alias_set_type set2 = get_alias_set (TREE_TYPE (type)); 733 734 if (set2 != 0 735 && set1 != set2 736 && !alias_set_subset_of (set2, set1) 737 && !alias_sets_conflict_p (set1, set2)) 738 { 739 warning_at (loc, OPT_Wstrict_aliasing, 740 "dereferencing type-punned " 741 "pointer will break strict-aliasing rules"); 742 return true; 743 } 744 else if (warn_strict_aliasing == 2 745 && !alias_sets_must_conflict_p (set1, set2)) 746 { 747 warning_at (loc, OPT_Wstrict_aliasing, 748 "dereferencing type-punned " 749 "pointer might break strict-aliasing rules"); 750 return true; 751 } 752 } 753 } 754 else if ((warn_strict_aliasing == 1) && !VOID_TYPE_P (TREE_TYPE (otype))) 755 { 756 /* At this level, warn for any conversions, even if an address is 757 not taken in the same statement. This will likely produce many 758 false positives, but could be useful to pinpoint problems that 759 are not revealed at higher levels. */ 760 alias_set_type set1 = get_alias_set (TREE_TYPE (otype)); 761 alias_set_type set2 = get_alias_set (TREE_TYPE (type)); 762 if (!COMPLETE_TYPE_P (TREE_TYPE (type)) 763 || !alias_sets_must_conflict_p (set1, set2)) 764 { 765 warning_at (loc, OPT_Wstrict_aliasing, 766 "dereferencing type-punned " 767 "pointer might break strict-aliasing rules"); 768 return true; 769 } 770 } 771 772 return false; 773 } 774 775 /* Warn about memset (&a, 0, sizeof (&a)); and similar mistakes with 776 sizeof as last operand of certain builtins. */ 777 778 void 779 sizeof_pointer_memaccess_warning (location_t *sizeof_arg_loc, tree callee, 780 vec<tree, va_gc> *params, tree *sizeof_arg, 781 bool (*comp_types) (tree, tree)) 782 { 783 tree type, dest = NULL_TREE, src = NULL_TREE, tem; 784 bool strop = false, cmp = false; 785 unsigned int idx = ~0; 786 location_t loc; 787 788 if (TREE_CODE (callee) != FUNCTION_DECL 789 || !fndecl_built_in_p (callee, BUILT_IN_NORMAL) 790 || vec_safe_length (params) <= 1) 791 return; 792 793 enum built_in_function fncode = DECL_FUNCTION_CODE (callee); 794 switch (fncode) 795 { 796 case BUILT_IN_STRNCMP: 797 case BUILT_IN_STRNCASECMP: 798 cmp = true; 799 /* FALLTHRU */ 800 case BUILT_IN_STRNCPY: 801 case BUILT_IN_STRNCPY_CHK: 802 case BUILT_IN_STRNCAT: 803 case BUILT_IN_STRNCAT_CHK: 804 case BUILT_IN_STPNCPY: 805 case BUILT_IN_STPNCPY_CHK: 806 strop = true; 807 /* FALLTHRU */ 808 case BUILT_IN_MEMCPY: 809 case BUILT_IN_MEMCPY_CHK: 810 case BUILT_IN_MEMMOVE: 811 case BUILT_IN_MEMMOVE_CHK: 812 if (params->length () < 3) 813 return; 814 src = (*params)[1]; 815 dest = (*params)[0]; 816 idx = 2; 817 break; 818 case BUILT_IN_BCOPY: 819 if (params->length () < 3) 820 return; 821 src = (*params)[0]; 822 dest = (*params)[1]; 823 idx = 2; 824 break; 825 case BUILT_IN_MEMCMP: 826 case BUILT_IN_BCMP: 827 if (params->length () < 3) 828 return; 829 src = (*params)[1]; 830 dest = (*params)[0]; 831 idx = 2; 832 cmp = true; 833 break; 834 case BUILT_IN_MEMSET: 835 case BUILT_IN_MEMSET_CHK: 836 if (params->length () < 3) 837 return; 838 dest = (*params)[0]; 839 idx = 2; 840 break; 841 case BUILT_IN_BZERO: 842 dest = (*params)[0]; 843 idx = 1; 844 break; 845 case BUILT_IN_STRNDUP: 846 src = (*params)[0]; 847 strop = true; 848 idx = 1; 849 break; 850 case BUILT_IN_MEMCHR: 851 if (params->length () < 3) 852 return; 853 src = (*params)[0]; 854 idx = 2; 855 break; 856 case BUILT_IN_SNPRINTF: 857 case BUILT_IN_SNPRINTF_CHK: 858 case BUILT_IN_VSNPRINTF: 859 case BUILT_IN_VSNPRINTF_CHK: 860 dest = (*params)[0]; 861 idx = 1; 862 strop = true; 863 break; 864 default: 865 break; 866 } 867 868 if (idx >= 3) 869 return; 870 871 /* Use error_operand_p to detect non-error arguments with an error 872 type that the C++ front-end constructs. */ 873 if (error_operand_p (src) 874 || error_operand_p (dest) 875 || !sizeof_arg[idx] 876 || error_operand_p (sizeof_arg[idx])) 877 return; 878 879 type = TYPE_P (sizeof_arg[idx]) 880 ? sizeof_arg[idx] : TREE_TYPE (sizeof_arg[idx]); 881 882 if (!POINTER_TYPE_P (type)) 883 { 884 /* The argument type may be an array. Diagnose bounded string 885 copy functions that specify the bound in terms of the source 886 argument rather than the destination unless they are equal 887 to one another. Handle constant sizes and also try to handle 888 sizeof expressions involving VLAs. */ 889 if (strop && !cmp && fncode != BUILT_IN_STRNDUP && src) 890 { 891 tem = tree_strip_nop_conversions (src); 892 if (TREE_CODE (tem) == ADDR_EXPR) 893 tem = TREE_OPERAND (tem, 0); 894 895 /* Avoid diagnosing sizeof SRC when SRC is declared with 896 attribute nonstring. */ 897 tree dummy; 898 if (get_attr_nonstring_decl (tem, &dummy)) 899 return; 900 901 tree d = tree_strip_nop_conversions (dest); 902 if (TREE_CODE (d) == ADDR_EXPR) 903 d = TREE_OPERAND (d, 0); 904 905 tree dstsz = TYPE_SIZE_UNIT (TREE_TYPE (d)); 906 tree srcsz = TYPE_SIZE_UNIT (TREE_TYPE (tem)); 907 908 if ((!dstsz 909 || !srcsz 910 || !operand_equal_p (dstsz, srcsz, OEP_LEXICOGRAPHIC)) 911 && operand_equal_p (tem, sizeof_arg[idx], OEP_ADDRESS_OF)) 912 warning_at (sizeof_arg_loc[idx], OPT_Wsizeof_pointer_memaccess, 913 "argument to %<sizeof%> in %qD call is the same " 914 "expression as the source; did you mean to use " 915 "the size of the destination?", 916 callee); 917 } 918 919 return; 920 } 921 922 if (dest 923 && (tem = tree_strip_nop_conversions (dest)) 924 && POINTER_TYPE_P (TREE_TYPE (tem)) 925 && comp_types (TREE_TYPE (TREE_TYPE (tem)), type)) 926 return; 927 928 if (src 929 && (tem = tree_strip_nop_conversions (src)) 930 && POINTER_TYPE_P (TREE_TYPE (tem)) 931 && comp_types (TREE_TYPE (TREE_TYPE (tem)), type)) 932 return; 933 934 loc = sizeof_arg_loc[idx]; 935 936 if (dest && !cmp) 937 { 938 if (!TYPE_P (sizeof_arg[idx]) 939 && operand_equal_p (dest, sizeof_arg[idx], 0) 940 && comp_types (TREE_TYPE (dest), type)) 941 { 942 if (TREE_CODE (sizeof_arg[idx]) == ADDR_EXPR && !strop) 943 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 944 "argument to %<sizeof%> in %qD call is the same " 945 "expression as the destination; did you mean to " 946 "remove the addressof?", callee); 947 else if ((INTEGRAL_TYPE_P (TREE_TYPE (type)) 948 && (TYPE_PRECISION (TREE_TYPE (type)) 949 == TYPE_PRECISION (char_type_node))) 950 || strop) 951 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 952 "argument to %<sizeof%> in %qD call is the same " 953 "expression as the destination; did you mean to " 954 "provide an explicit length?", callee); 955 else 956 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 957 "argument to %<sizeof%> in %qD call is the same " 958 "expression as the destination; did you mean to " 959 "dereference it?", callee); 960 return; 961 } 962 963 if (POINTER_TYPE_P (TREE_TYPE (dest)) 964 && !strop 965 && comp_types (TREE_TYPE (dest), type) 966 && !VOID_TYPE_P (TREE_TYPE (type))) 967 { 968 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 969 "argument to %<sizeof%> in %qD call is the same " 970 "pointer type %qT as the destination; expected %qT " 971 "or an explicit length", callee, TREE_TYPE (dest), 972 TREE_TYPE (TREE_TYPE (dest))); 973 return; 974 } 975 } 976 977 if (src && !cmp) 978 { 979 if (!TYPE_P (sizeof_arg[idx]) 980 && operand_equal_p (src, sizeof_arg[idx], 0) 981 && comp_types (TREE_TYPE (src), type)) 982 { 983 if (TREE_CODE (sizeof_arg[idx]) == ADDR_EXPR && !strop) 984 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 985 "argument to %<sizeof%> in %qD call is the same " 986 "expression as the source; did you mean to " 987 "remove the addressof?", callee); 988 else if ((INTEGRAL_TYPE_P (TREE_TYPE (type)) 989 && (TYPE_PRECISION (TREE_TYPE (type)) 990 == TYPE_PRECISION (char_type_node))) 991 || strop) 992 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 993 "argument to %<sizeof%> in %qD call is the same " 994 "expression as the source; did you mean to " 995 "provide an explicit length?", callee); 996 else 997 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 998 "argument to %<sizeof%> in %qD call is the same " 999 "expression as the source; did you mean to " 1000 "dereference it?", callee); 1001 return; 1002 } 1003 1004 if (POINTER_TYPE_P (TREE_TYPE (src)) 1005 && !strop 1006 && comp_types (TREE_TYPE (src), type) 1007 && !VOID_TYPE_P (TREE_TYPE (type))) 1008 { 1009 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 1010 "argument to %<sizeof%> in %qD call is the same " 1011 "pointer type %qT as the source; expected %qT " 1012 "or an explicit length", callee, TREE_TYPE (src), 1013 TREE_TYPE (TREE_TYPE (src))); 1014 return; 1015 } 1016 } 1017 1018 if (dest) 1019 { 1020 if (!TYPE_P (sizeof_arg[idx]) 1021 && operand_equal_p (dest, sizeof_arg[idx], 0) 1022 && comp_types (TREE_TYPE (dest), type)) 1023 { 1024 if (TREE_CODE (sizeof_arg[idx]) == ADDR_EXPR && !strop) 1025 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 1026 "argument to %<sizeof%> in %qD call is the same " 1027 "expression as the first source; did you mean to " 1028 "remove the addressof?", callee); 1029 else if ((INTEGRAL_TYPE_P (TREE_TYPE (type)) 1030 && (TYPE_PRECISION (TREE_TYPE (type)) 1031 == TYPE_PRECISION (char_type_node))) 1032 || strop) 1033 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 1034 "argument to %<sizeof%> in %qD call is the same " 1035 "expression as the first source; did you mean to " 1036 "provide an explicit length?", callee); 1037 else 1038 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 1039 "argument to %<sizeof%> in %qD call is the same " 1040 "expression as the first source; did you mean to " 1041 "dereference it?", callee); 1042 return; 1043 } 1044 1045 if (POINTER_TYPE_P (TREE_TYPE (dest)) 1046 && !strop 1047 && comp_types (TREE_TYPE (dest), type) 1048 && !VOID_TYPE_P (TREE_TYPE (type))) 1049 { 1050 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 1051 "argument to %<sizeof%> in %qD call is the same " 1052 "pointer type %qT as the first source; expected %qT " 1053 "or an explicit length", callee, TREE_TYPE (dest), 1054 TREE_TYPE (TREE_TYPE (dest))); 1055 return; 1056 } 1057 } 1058 1059 if (src) 1060 { 1061 if (!TYPE_P (sizeof_arg[idx]) 1062 && operand_equal_p (src, sizeof_arg[idx], 0) 1063 && comp_types (TREE_TYPE (src), type)) 1064 { 1065 if (TREE_CODE (sizeof_arg[idx]) == ADDR_EXPR && !strop) 1066 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 1067 "argument to %<sizeof%> in %qD call is the same " 1068 "expression as the second source; did you mean to " 1069 "remove the addressof?", callee); 1070 else if ((INTEGRAL_TYPE_P (TREE_TYPE (type)) 1071 && (TYPE_PRECISION (TREE_TYPE (type)) 1072 == TYPE_PRECISION (char_type_node))) 1073 || strop) 1074 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 1075 "argument to %<sizeof%> in %qD call is the same " 1076 "expression as the second source; did you mean to " 1077 "provide an explicit length?", callee); 1078 else 1079 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 1080 "argument to %<sizeof%> in %qD call is the same " 1081 "expression as the second source; did you mean to " 1082 "dereference it?", callee); 1083 return; 1084 } 1085 1086 if (POINTER_TYPE_P (TREE_TYPE (src)) 1087 && !strop 1088 && comp_types (TREE_TYPE (src), type) 1089 && !VOID_TYPE_P (TREE_TYPE (type))) 1090 { 1091 warning_at (loc, OPT_Wsizeof_pointer_memaccess, 1092 "argument to %<sizeof%> in %qD call is the same " 1093 "pointer type %qT as the second source; expected %qT " 1094 "or an explicit length", callee, TREE_TYPE (src), 1095 TREE_TYPE (TREE_TYPE (src))); 1096 return; 1097 } 1098 } 1099 1100 } 1101 1102 /* Warn for unlikely, improbable, or stupid DECL declarations 1103 of `main'. */ 1104 1105 void 1106 check_main_parameter_types (tree decl) 1107 { 1108 function_args_iterator iter; 1109 tree type; 1110 int argct = 0; 1111 1112 FOREACH_FUNCTION_ARGS (TREE_TYPE (decl), type, iter) 1113 { 1114 /* XXX void_type_node belies the abstraction. */ 1115 if (type == void_type_node || type == error_mark_node) 1116 break; 1117 1118 tree t = type; 1119 if (TYPE_ATOMIC (t)) 1120 pedwarn (input_location, OPT_Wmain, 1121 "%<_Atomic%>-qualified parameter type %qT of %q+D", 1122 type, decl); 1123 while (POINTER_TYPE_P (t)) 1124 { 1125 t = TREE_TYPE (t); 1126 if (TYPE_ATOMIC (t)) 1127 pedwarn (input_location, OPT_Wmain, 1128 "%<_Atomic%>-qualified parameter type %qT of %q+D", 1129 type, decl); 1130 } 1131 1132 ++argct; 1133 switch (argct) 1134 { 1135 case 1: 1136 if (TYPE_MAIN_VARIANT (type) != integer_type_node) 1137 pedwarn (input_location, OPT_Wmain, 1138 "first argument of %q+D should be %<int%>", decl); 1139 break; 1140 1141 case 2: 1142 if (TREE_CODE (type) != POINTER_TYPE 1143 || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE 1144 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type))) 1145 != char_type_node)) 1146 pedwarn (input_location, OPT_Wmain, 1147 "second argument of %q+D should be %<char **%>", decl); 1148 break; 1149 1150 case 3: 1151 if (TREE_CODE (type) != POINTER_TYPE 1152 || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE 1153 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type))) 1154 != char_type_node)) 1155 pedwarn (input_location, OPT_Wmain, 1156 "third argument of %q+D should probably be " 1157 "%<char **%>", decl); 1158 break; 1159 } 1160 } 1161 1162 /* It is intentional that this message does not mention the third 1163 argument because it's only mentioned in an appendix of the 1164 standard. */ 1165 if (argct > 0 && (argct < 2 || argct > 3)) 1166 pedwarn (input_location, OPT_Wmain, 1167 "%q+D takes only zero or two arguments", decl); 1168 1169 if (stdarg_p (TREE_TYPE (decl))) 1170 pedwarn (input_location, OPT_Wmain, 1171 "%q+D declared as variadic function", decl); 1172 } 1173 1174 /* Warns and returns true if the conversion of EXPR to TYPE may alter a value. 1175 This is a helper function for warnings_for_convert_and_check. */ 1176 1177 static bool 1178 conversion_warning (location_t loc, tree type, tree expr, tree result) 1179 { 1180 tree expr_type = TREE_TYPE (expr); 1181 enum conversion_safety conversion_kind; 1182 int arith_ops = 0; 1183 1184 if (!warn_conversion && !warn_sign_conversion && !warn_float_conversion) 1185 return false; 1186 1187 /* This may happen, because for LHS op= RHS we preevaluate 1188 RHS and create C_MAYBE_CONST_EXPR <SAVE_EXPR <RHS>>, which 1189 means we could no longer see the code of the EXPR. */ 1190 if (TREE_CODE (expr) == C_MAYBE_CONST_EXPR) 1191 expr = C_MAYBE_CONST_EXPR_EXPR (expr); 1192 if (TREE_CODE (expr) == SAVE_EXPR) 1193 expr = TREE_OPERAND (expr, 0); 1194 1195 switch (TREE_CODE (expr)) 1196 { 1197 case EQ_EXPR: 1198 case NE_EXPR: 1199 case LE_EXPR: 1200 case GE_EXPR: 1201 case LT_EXPR: 1202 case GT_EXPR: 1203 case TRUTH_ANDIF_EXPR: 1204 case TRUTH_ORIF_EXPR: 1205 case TRUTH_AND_EXPR: 1206 case TRUTH_OR_EXPR: 1207 case TRUTH_XOR_EXPR: 1208 case TRUTH_NOT_EXPR: 1209 /* Conversion from boolean to a signed:1 bit-field (which only 1210 can hold the values 0 and -1) doesn't lose information - but 1211 it does change the value. */ 1212 if (TYPE_PRECISION (type) == 1 && !TYPE_UNSIGNED (type)) 1213 warning_at (loc, OPT_Wconversion, 1214 "conversion to %qT from boolean expression", type); 1215 return true; 1216 1217 case REAL_CST: 1218 case INTEGER_CST: 1219 case COMPLEX_CST: 1220 { 1221 conversion_kind = unsafe_conversion_p (type, expr, result, true); 1222 int warnopt; 1223 if (conversion_kind == UNSAFE_REAL) 1224 warnopt = OPT_Wfloat_conversion; 1225 else if (conversion_kind) 1226 warnopt = OPT_Wconversion; 1227 else 1228 break; 1229 1230 if (conversion_kind == UNSAFE_SIGN) 1231 { 1232 bool cstresult 1233 = (result 1234 && CONSTANT_CLASS_P (result)); 1235 if (TYPE_UNSIGNED (type)) 1236 { 1237 if (cstresult) 1238 warning_at (loc, OPT_Wsign_conversion, 1239 "unsigned conversion from %qT to %qT " 1240 "changes value from %qE to %qE", 1241 expr_type, type, expr, result); 1242 else 1243 warning_at (loc, OPT_Wsign_conversion, 1244 "unsigned conversion from %qT to %qT " 1245 "changes the value of %qE", 1246 expr_type, type, expr); 1247 } 1248 else 1249 { 1250 if (cstresult) 1251 warning_at (loc, OPT_Wsign_conversion, 1252 "signed conversion from %qT to %qT changes " 1253 "value from %qE to %qE", 1254 expr_type, type, expr, result); 1255 else 1256 warning_at (loc, OPT_Wsign_conversion, 1257 "signed conversion from %qT to %qT changes " 1258 "the value of %qE", 1259 expr_type, type, expr); 1260 } 1261 } 1262 else if (CONSTANT_CLASS_P (result)) 1263 warning_at (loc, warnopt, 1264 "conversion from %qT to %qT changes value from %qE to %qE", 1265 expr_type, type, expr, result); 1266 else 1267 warning_at (loc, warnopt, 1268 "conversion from %qT to %qT changes the value of %qE", 1269 expr_type, type, expr); 1270 return true; 1271 } 1272 1273 case PLUS_EXPR: 1274 case MINUS_EXPR: 1275 case MULT_EXPR: 1276 case MAX_EXPR: 1277 case MIN_EXPR: 1278 case TRUNC_MOD_EXPR: 1279 case FLOOR_MOD_EXPR: 1280 case TRUNC_DIV_EXPR: 1281 case FLOOR_DIV_EXPR: 1282 case CEIL_DIV_EXPR: 1283 case EXACT_DIV_EXPR: 1284 case RDIV_EXPR: 1285 arith_ops = 2; 1286 goto default_; 1287 1288 case PREDECREMENT_EXPR: 1289 case PREINCREMENT_EXPR: 1290 case POSTDECREMENT_EXPR: 1291 case POSTINCREMENT_EXPR: 1292 case LSHIFT_EXPR: 1293 case RSHIFT_EXPR: 1294 case FIX_TRUNC_EXPR: 1295 case NON_LVALUE_EXPR: 1296 case NEGATE_EXPR: 1297 case BIT_NOT_EXPR: 1298 arith_ops = 1; 1299 goto default_; 1300 1301 case COND_EXPR: 1302 { 1303 /* In case of COND_EXPR, we do not care about the type of 1304 COND_EXPR, only about the conversion of each operand. */ 1305 tree op1 = TREE_OPERAND (expr, 1); 1306 tree op2 = TREE_OPERAND (expr, 2); 1307 1308 return ((op1 && conversion_warning (loc, type, op1, result)) 1309 || conversion_warning (loc, type, op2, result)); 1310 } 1311 1312 case BIT_AND_EXPR: 1313 if ((TREE_CODE (expr_type) == INTEGER_TYPE 1314 || TREE_CODE (expr_type) == BITINT_TYPE) 1315 && (TREE_CODE (type) == INTEGER_TYPE 1316 || TREE_CODE (type) == BITINT_TYPE)) 1317 for (int i = 0; i < 2; ++i) 1318 { 1319 tree op = TREE_OPERAND (expr, i); 1320 if (TREE_CODE (op) != INTEGER_CST) 1321 continue; 1322 1323 /* If one of the operands is a non-negative constant 1324 that fits in the target type, then the type of the 1325 other operand does not matter. */ 1326 if (int_fits_type_p (op, c_common_signed_type (type)) 1327 && int_fits_type_p (op, c_common_unsigned_type (type))) 1328 return false; 1329 1330 /* If constant is unsigned and fits in the target 1331 type, then the result will also fit. */ 1332 if (TYPE_UNSIGNED (TREE_TYPE (op)) && int_fits_type_p (op, type)) 1333 return false; 1334 } 1335 /* FALLTHRU */ 1336 case BIT_IOR_EXPR: 1337 case BIT_XOR_EXPR: 1338 return (conversion_warning (loc, type, TREE_OPERAND (expr, 0), result) 1339 || conversion_warning (loc, type, TREE_OPERAND (expr, 1), 1340 result)); 1341 1342 default_: 1343 default: 1344 conversion_kind = unsafe_conversion_p (type, expr, result, true); 1345 { 1346 int warnopt; 1347 if (conversion_kind == UNSAFE_REAL) 1348 warnopt = OPT_Wfloat_conversion; 1349 else if (conversion_kind == UNSAFE_SIGN) 1350 warnopt = OPT_Wsign_conversion; 1351 else if (conversion_kind) 1352 warnopt = OPT_Wconversion; 1353 else 1354 break; 1355 1356 if (arith_ops 1357 && global_dc->option_enabled_p (warnopt)) 1358 { 1359 for (int i = 0; i < arith_ops; ++i) 1360 { 1361 tree op = TREE_OPERAND (expr, i); 1362 /* Avoid -Wsign-conversion for (unsigned)(x + (-1)). */ 1363 if (TREE_CODE (expr) == PLUS_EXPR && i == 1 1364 && INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type) 1365 && TREE_CODE (op) == INTEGER_CST 1366 && tree_int_cst_sgn (op) < 0) 1367 op = fold_build1 (NEGATE_EXPR, TREE_TYPE (op), op); 1368 tree opr = convert (type, op); 1369 if (unsafe_conversion_p (type, op, opr, true)) 1370 goto op_unsafe; 1371 } 1372 /* The operands seem safe, we might still want to warn if 1373 -Warith-conversion. */ 1374 warnopt = OPT_Warith_conversion; 1375 op_unsafe:; 1376 } 1377 1378 if (conversion_kind == UNSAFE_SIGN) 1379 warning_at (loc, warnopt, "conversion to %qT from %qT " 1380 "may change the sign of the result", 1381 type, expr_type); 1382 else if (conversion_kind == UNSAFE_IMAGINARY) 1383 warning_at (loc, warnopt, 1384 "conversion from %qT to %qT discards imaginary component", 1385 expr_type, type); 1386 else 1387 warning_at (loc, warnopt, 1388 "conversion from %qT to %qT may change value", 1389 expr_type, type); 1390 return true; 1391 } 1392 } 1393 return false; 1394 } 1395 1396 /* Produce warnings after a conversion. RESULT is the result of 1397 converting EXPR to TYPE. This is a helper function for 1398 convert_and_check and cp_convert_and_check. */ 1399 1400 void 1401 warnings_for_convert_and_check (location_t loc, tree type, tree expr, 1402 tree result) 1403 { 1404 loc = expansion_point_location_if_in_system_header (loc); 1405 1406 while (TREE_CODE (expr) == COMPOUND_EXPR) 1407 expr = TREE_OPERAND (expr, 1); 1408 while (TREE_CODE (result) == COMPOUND_EXPR) 1409 result = TREE_OPERAND (result, 1); 1410 1411 bool cst = CONSTANT_CLASS_P (result); 1412 tree exprtype = TREE_TYPE (expr); 1413 tree result_diag; 1414 /* We're interested in the actual numerical value here, not its ASCII 1415 representation. */ 1416 if (cst && TYPE_MAIN_VARIANT (TREE_TYPE (result)) == char_type_node) 1417 result_diag = fold_convert (integer_type_node, result); 1418 else 1419 result_diag = result; 1420 1421 if (TREE_CODE (expr) == INTEGER_CST 1422 && (TREE_CODE (type) == INTEGER_TYPE 1423 || TREE_CODE (type) == BITINT_TYPE 1424 || (TREE_CODE (type) == ENUMERAL_TYPE 1425 && TREE_CODE (ENUM_UNDERLYING_TYPE (type)) != BOOLEAN_TYPE)) 1426 && !int_fits_type_p (expr, type)) 1427 { 1428 /* Do not diagnose overflow in a constant expression merely 1429 because a conversion overflowed. */ 1430 if (TREE_OVERFLOW (result)) 1431 TREE_OVERFLOW (result) = TREE_OVERFLOW (expr); 1432 1433 if (TYPE_UNSIGNED (type)) 1434 { 1435 /* This detects cases like converting -129 or 256 to 1436 unsigned char. */ 1437 if (!int_fits_type_p (expr, c_common_signed_type (type))) 1438 { 1439 if (cst) 1440 warning_at (loc, OPT_Woverflow, 1441 (TYPE_UNSIGNED (exprtype) 1442 ? G_("conversion from %qT to %qT " 1443 "changes value from %qE to %qE") 1444 : G_("unsigned conversion from %qT to %qT " 1445 "changes value from %qE to %qE")), 1446 exprtype, type, expr, result_diag); 1447 else 1448 warning_at (loc, OPT_Woverflow, 1449 (TYPE_UNSIGNED (exprtype) 1450 ? G_("conversion from %qT to %qT " 1451 "changes the value of %qE") 1452 : G_("unsigned conversion from %qT to %qT " 1453 "changes the value of %qE")), 1454 exprtype, type, expr); 1455 } 1456 else 1457 conversion_warning (loc, type, expr, result); 1458 } 1459 else if (!int_fits_type_p (expr, c_common_unsigned_type (type))) 1460 { 1461 if (cst) 1462 warning_at (loc, OPT_Woverflow, 1463 "overflow in conversion from %qT to %qT " 1464 "changes value from %qE to %qE", 1465 exprtype, type, expr, result_diag); 1466 else 1467 warning_at (loc, OPT_Woverflow, 1468 "overflow in conversion from %qT to %qT " 1469 "changes the value of %qE", 1470 exprtype, type, expr); 1471 } 1472 /* No warning for converting 0x80000000 to int. */ 1473 else if (pedantic 1474 && ((TREE_CODE (exprtype) != INTEGER_TYPE 1475 && TREE_CODE (exprtype) != BITINT_TYPE) 1476 || (TYPE_PRECISION (exprtype) 1477 != TYPE_PRECISION (type)))) 1478 { 1479 if (cst) 1480 warning_at (loc, OPT_Woverflow, 1481 "overflow in conversion from %qT to %qT " 1482 "changes value from %qE to %qE", 1483 exprtype, type, expr, result_diag); 1484 else 1485 warning_at (loc, OPT_Woverflow, 1486 "overflow in conversion from %qT to %qT " 1487 "changes the value of %qE", 1488 exprtype, type, expr); 1489 } 1490 else 1491 conversion_warning (loc, type, expr, result); 1492 } 1493 else if ((TREE_CODE (result) == INTEGER_CST 1494 || TREE_CODE (result) == FIXED_CST) && TREE_OVERFLOW (result)) 1495 { 1496 if (cst) 1497 warning_at (loc, OPT_Woverflow, 1498 "overflow in conversion from %qT to %qT " 1499 "changes value from %qE to %qE", 1500 exprtype, type, expr, result_diag); 1501 else 1502 warning_at (loc, OPT_Woverflow, 1503 "overflow in conversion from %qT to %qT " 1504 "changes the value of %qE", 1505 exprtype, type, expr); 1506 } 1507 else 1508 conversion_warning (loc, type, expr, result); 1509 } 1510 1511 /* Subroutines of c_do_switch_warnings, called via splay_tree_foreach. 1512 Used to verify that case values match up with enumerator values. */ 1513 1514 static void 1515 match_case_to_enum_1 (tree key, tree type, tree label) 1516 { 1517 /* Avoid warning about enums that have no enumerators. */ 1518 if (TYPE_VALUES (type) == NULL_TREE) 1519 return; 1520 1521 char buf[WIDE_INT_PRINT_BUFFER_SIZE]; 1522 wide_int w = wi::to_wide (key); 1523 1524 gcc_assert (w.get_precision () <= WIDE_INT_MAX_INL_PRECISION); 1525 if (tree_fits_uhwi_p (key)) 1526 print_dec (w, buf, UNSIGNED); 1527 else if (tree_fits_shwi_p (key)) 1528 print_dec (w, buf, SIGNED); 1529 else 1530 print_hex (w, buf); 1531 1532 if (TYPE_NAME (type) == NULL_TREE) 1533 warning_at (DECL_SOURCE_LOCATION (CASE_LABEL (label)), 1534 warn_switch ? OPT_Wswitch : OPT_Wswitch_enum, 1535 "case value %qs not in enumerated type", 1536 buf); 1537 else 1538 warning_at (DECL_SOURCE_LOCATION (CASE_LABEL (label)), 1539 warn_switch ? OPT_Wswitch : OPT_Wswitch_enum, 1540 "case value %qs not in enumerated type %qT", 1541 buf, type); 1542 } 1543 1544 /* Subroutine of c_do_switch_warnings, called via splay_tree_foreach. 1545 Used to verify that case values match up with enumerator values. */ 1546 1547 static int 1548 match_case_to_enum (splay_tree_node node, void *data) 1549 { 1550 tree label = (tree) node->value; 1551 tree type = (tree) data; 1552 1553 /* Skip default case. */ 1554 if (!CASE_LOW (label)) 1555 return 0; 1556 1557 /* If CASE_LOW_SEEN is not set, that means CASE_LOW did not appear 1558 when we did our enum->case scan. Reset our scratch bit after. */ 1559 if (!CASE_LOW_SEEN (label)) 1560 match_case_to_enum_1 (CASE_LOW (label), type, label); 1561 else 1562 CASE_LOW_SEEN (label) = 0; 1563 1564 /* If CASE_HIGH is non-null, we have a range. If CASE_HIGH_SEEN is 1565 not set, that means that CASE_HIGH did not appear when we did our 1566 enum->case scan. Reset our scratch bit after. */ 1567 if (CASE_HIGH (label)) 1568 { 1569 if (!CASE_HIGH_SEEN (label)) 1570 match_case_to_enum_1 (CASE_HIGH (label), type, label); 1571 else 1572 CASE_HIGH_SEEN (label) = 0; 1573 } 1574 1575 return 0; 1576 } 1577 1578 /* Handle -Wswitch*. Called from the front end after parsing the 1579 switch construct. */ 1580 /* ??? Should probably be somewhere generic, since other languages 1581 besides C and C++ would want this. At the moment, however, C/C++ 1582 are the only tree-ssa languages that support enumerations at all, 1583 so the point is moot. */ 1584 1585 void 1586 c_do_switch_warnings (splay_tree cases, location_t switch_location, 1587 tree type, tree cond, bool bool_cond_p) 1588 { 1589 splay_tree_node default_node; 1590 splay_tree_node node; 1591 tree chain; 1592 bool outside_range_p = false; 1593 1594 if (type != error_mark_node 1595 && type != TREE_TYPE (cond) 1596 && INTEGRAL_TYPE_P (type) 1597 && INTEGRAL_TYPE_P (TREE_TYPE (cond)) 1598 && (!tree_int_cst_equal (TYPE_MIN_VALUE (type), 1599 TYPE_MIN_VALUE (TREE_TYPE (cond))) 1600 || !tree_int_cst_equal (TYPE_MAX_VALUE (type), 1601 TYPE_MAX_VALUE (TREE_TYPE (cond))))) 1602 { 1603 tree min_value = TYPE_MIN_VALUE (type); 1604 tree max_value = TYPE_MAX_VALUE (type); 1605 1606 node = splay_tree_predecessor (cases, (splay_tree_key) min_value); 1607 if (node && node->key) 1608 { 1609 outside_range_p = true; 1610 /* There is at least one case smaller than TYPE's minimum value. 1611 NODE itself could be still a range overlapping the valid values, 1612 but any predecessors thereof except the default case will be 1613 completely outside of range. */ 1614 if (CASE_HIGH ((tree) node->value) 1615 && tree_int_cst_compare (CASE_HIGH ((tree) node->value), 1616 min_value) >= 0) 1617 { 1618 location_t loc = EXPR_LOCATION ((tree) node->value); 1619 warning_at (loc, OPT_Wswitch_outside_range, 1620 "lower value in case label range less than minimum" 1621 " value for type"); 1622 CASE_LOW ((tree) node->value) = convert (TREE_TYPE (cond), 1623 min_value); 1624 node->key = (splay_tree_key) CASE_LOW ((tree) node->value); 1625 } 1626 /* All the following ones are completely outside of range. */ 1627 do 1628 { 1629 node = splay_tree_predecessor (cases, 1630 (splay_tree_key) min_value); 1631 if (node == NULL || !node->key) 1632 break; 1633 location_t loc = EXPR_LOCATION ((tree) node->value); 1634 warning_at (loc, OPT_Wswitch_outside_range, "case label value is" 1635 " less than minimum value for type"); 1636 splay_tree_remove (cases, node->key); 1637 } 1638 while (1); 1639 } 1640 node = splay_tree_lookup (cases, (splay_tree_key) max_value); 1641 if (node == NULL) 1642 node = splay_tree_predecessor (cases, (splay_tree_key) max_value); 1643 /* Handle a single node that might partially overlap the range. */ 1644 if (node 1645 && node->key 1646 && CASE_HIGH ((tree) node->value) 1647 && tree_int_cst_compare (CASE_HIGH ((tree) node->value), 1648 max_value) > 0) 1649 { 1650 location_t loc = EXPR_LOCATION ((tree) node->value); 1651 warning_at (loc, OPT_Wswitch_outside_range, "upper value in case" 1652 " label range exceeds maximum value for type"); 1653 CASE_HIGH ((tree) node->value) 1654 = convert (TREE_TYPE (cond), max_value); 1655 outside_range_p = true; 1656 } 1657 /* And any nodes that are completely outside of the range. */ 1658 while ((node = splay_tree_successor (cases, 1659 (splay_tree_key) max_value)) 1660 != NULL) 1661 { 1662 location_t loc = EXPR_LOCATION ((tree) node->value); 1663 warning_at (loc, OPT_Wswitch_outside_range, 1664 "case label value exceeds maximum value for type"); 1665 splay_tree_remove (cases, node->key); 1666 outside_range_p = true; 1667 } 1668 } 1669 1670 if (!warn_switch && !warn_switch_enum && !warn_switch_default 1671 && !warn_switch_bool) 1672 return; 1673 1674 default_node = splay_tree_lookup (cases, (splay_tree_key) NULL); 1675 if (!default_node) 1676 warning_at (switch_location, OPT_Wswitch_default, 1677 "switch missing default case"); 1678 1679 /* There are certain cases where -Wswitch-bool warnings aren't 1680 desirable, such as 1681 switch (boolean) 1682 { 1683 case true: ... 1684 case false: ... 1685 } 1686 so be careful here. */ 1687 if (warn_switch_bool && bool_cond_p) 1688 { 1689 splay_tree_node min_node; 1690 /* If there's a default node, it's also the value with the minimal 1691 key. So look at the penultimate key (if any). */ 1692 if (default_node) 1693 min_node = splay_tree_successor (cases, (splay_tree_key) NULL); 1694 else 1695 min_node = splay_tree_min (cases); 1696 tree min = min_node ? (tree) min_node->key : NULL_TREE; 1697 1698 splay_tree_node max_node = splay_tree_max (cases); 1699 /* This might be a case range, so look at the value with the 1700 maximal key and then check CASE_HIGH. */ 1701 tree max = max_node ? (tree) max_node->value : NULL_TREE; 1702 if (max) 1703 max = CASE_HIGH (max) ? CASE_HIGH (max) : CASE_LOW (max); 1704 1705 /* If there's a case value > 1 or < 0, that is outside bool 1706 range, warn. */ 1707 if (outside_range_p 1708 || (max && wi::gts_p (wi::to_wide (max), 1)) 1709 || (min && wi::lts_p (wi::to_wide (min), 0)) 1710 /* And handle the 1711 switch (boolean) 1712 { 1713 case true: ... 1714 case false: ... 1715 default: ... 1716 } 1717 case, where we want to warn. */ 1718 || (default_node 1719 && max && wi::to_wide (max) == 1 1720 && min && wi::to_wide (min) == 0)) 1721 warning_at (switch_location, OPT_Wswitch_bool, 1722 "switch condition has boolean value"); 1723 } 1724 1725 /* From here on, we only care about enumerated types. */ 1726 if (!type || TREE_CODE (type) != ENUMERAL_TYPE) 1727 return; 1728 1729 /* From here on, we only care about -Wswitch and -Wswitch-enum. */ 1730 if (!warn_switch_enum && !warn_switch) 1731 return; 1732 1733 /* Check the cases. Warn about case values which are not members of 1734 the enumerated type. For -Wswitch-enum, or for -Wswitch when 1735 there is no default case, check that exactly all enumeration 1736 literals are covered by the cases. */ 1737 1738 /* Clearing COND if it is not an integer constant simplifies 1739 the tests inside the loop below. */ 1740 if (TREE_CODE (cond) != INTEGER_CST) 1741 cond = NULL_TREE; 1742 1743 /* The time complexity here is O(N*lg(N)) worst case, but for the 1744 common case of monotonically increasing enumerators, it is 1745 O(N), since the nature of the splay tree will keep the next 1746 element adjacent to the root at all times. */ 1747 1748 for (chain = TYPE_VALUES (type); chain; chain = TREE_CHAIN (chain)) 1749 { 1750 tree value = TREE_VALUE (chain); 1751 tree attrs = DECL_ATTRIBUTES (value); 1752 value = DECL_INITIAL (value); 1753 node = splay_tree_lookup (cases, (splay_tree_key) value); 1754 if (node) 1755 { 1756 /* Mark the CASE_LOW part of the case entry as seen. */ 1757 tree label = (tree) node->value; 1758 CASE_LOW_SEEN (label) = 1; 1759 continue; 1760 } 1761 1762 /* Even though there wasn't an exact match, there might be a 1763 case range which includes the enumerator's value. */ 1764 node = splay_tree_predecessor (cases, (splay_tree_key) value); 1765 if (node && CASE_HIGH ((tree) node->value)) 1766 { 1767 tree label = (tree) node->value; 1768 int cmp = tree_int_cst_compare (CASE_HIGH (label), value); 1769 if (cmp >= 0) 1770 { 1771 /* If we match the upper bound exactly, mark the CASE_HIGH 1772 part of the case entry as seen. */ 1773 if (cmp == 0) 1774 CASE_HIGH_SEEN (label) = 1; 1775 continue; 1776 } 1777 } 1778 1779 /* We've now determined that this enumerated literal isn't 1780 handled by the case labels of the switch statement. */ 1781 1782 /* Don't warn if the enumerator was marked as unused. We can't use 1783 TREE_USED here: it could have been set on the enumerator if the 1784 enumerator was used earlier. */ 1785 if (lookup_attribute ("unused", attrs) 1786 || lookup_attribute ("maybe_unused", attrs)) 1787 continue; 1788 1789 /* If the switch expression is a constant, we only really care 1790 about whether that constant is handled by the switch. */ 1791 if (cond && tree_int_cst_compare (cond, value)) 1792 continue; 1793 1794 /* If the enumerator is defined in a system header and uses a reserved 1795 name, then we continue to avoid throwing a warning. */ 1796 location_t loc = DECL_SOURCE_LOCATION 1797 (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (type))); 1798 if (in_system_header_at (loc) 1799 && name_reserved_for_implementation_p 1800 (IDENTIFIER_POINTER (TREE_PURPOSE (chain)))) 1801 continue; 1802 1803 /* If there is a default_node, the only relevant option is 1804 Wswitch-enum. Otherwise, if both are enabled then we prefer 1805 to warn using -Wswitch because -Wswitch is enabled by -Wall 1806 while -Wswitch-enum is explicit. */ 1807 warning_at (switch_location, 1808 (default_node || !warn_switch 1809 ? OPT_Wswitch_enum 1810 : OPT_Wswitch), 1811 "enumeration value %qE not handled in switch", 1812 TREE_PURPOSE (chain)); 1813 } 1814 1815 /* Warn if there are case expressions that don't correspond to 1816 enumerators. This can occur since C and C++ don't enforce 1817 type-checking of assignments to enumeration variables. 1818 1819 The time complexity here is now always O(N) worst case, since 1820 we should have marked both the lower bound and upper bound of 1821 every disjoint case label, with CASE_LOW_SEEN and CASE_HIGH_SEEN 1822 above. This scan also resets those fields. */ 1823 1824 splay_tree_foreach (cases, match_case_to_enum, type); 1825 } 1826 1827 /* Warn for A ?: C expressions (with B omitted) where A is a boolean 1828 expression, because B will always be true. */ 1829 1830 void 1831 warn_for_omitted_condop (location_t location, tree cond) 1832 { 1833 /* In C++ template declarations it can happen that the type is dependent 1834 and not yet known, thus TREE_TYPE (cond) == NULL_TREE. */ 1835 if (truth_value_p (TREE_CODE (cond)) 1836 || (TREE_TYPE (cond) != NULL_TREE 1837 && TREE_CODE (TREE_TYPE (cond)) == BOOLEAN_TYPE)) 1838 warning_at (location, OPT_Wparentheses, 1839 "the omitted middle operand in %<?:%> will always be %<true%>, " 1840 "suggest explicit middle operand"); 1841 } 1842 1843 /* Give an error for storing into ARG, which is 'const'. USE indicates 1844 how ARG was being used. */ 1845 1846 void 1847 readonly_error (location_t loc, tree arg, enum lvalue_use use) 1848 { 1849 gcc_assert (use == lv_assign || use == lv_increment || use == lv_decrement 1850 || use == lv_asm); 1851 STRIP_ANY_LOCATION_WRAPPER (arg); 1852 /* Using this macro rather than (for example) arrays of messages 1853 ensures that all the format strings are checked at compile 1854 time. */ 1855 #define READONLY_MSG(A, I, D, AS) (use == lv_assign ? (A) \ 1856 : (use == lv_increment ? (I) \ 1857 : (use == lv_decrement ? (D) : (AS)))) 1858 if (TREE_CODE (arg) == COMPONENT_REF) 1859 { 1860 if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0)))) 1861 error_at (loc, READONLY_MSG (G_("assignment of member " 1862 "%qD in read-only object"), 1863 G_("increment of member " 1864 "%qD in read-only object"), 1865 G_("decrement of member " 1866 "%qD in read-only object"), 1867 G_("member %qD in read-only object " 1868 "used as %<asm%> output")), 1869 TREE_OPERAND (arg, 1)); 1870 else 1871 error_at (loc, READONLY_MSG (G_("assignment of read-only member %qD"), 1872 G_("increment of read-only member %qD"), 1873 G_("decrement of read-only member %qD"), 1874 G_("read-only member %qD used as %<asm%> output")), 1875 TREE_OPERAND (arg, 1)); 1876 } 1877 else if (VAR_P (arg)) 1878 error_at (loc, READONLY_MSG (G_("assignment of read-only variable %qD"), 1879 G_("increment of read-only variable %qD"), 1880 G_("decrement of read-only variable %qD"), 1881 G_("read-only variable %qD used as %<asm%> output")), 1882 arg); 1883 else if (TREE_CODE (arg) == PARM_DECL) 1884 error_at (loc, READONLY_MSG (G_("assignment of read-only parameter %qD"), 1885 G_("increment of read-only parameter %qD"), 1886 G_("decrement of read-only parameter %qD"), 1887 G_("read-only parameter %qD use as %<asm%> output")), 1888 arg); 1889 else if (TREE_CODE (arg) == RESULT_DECL) 1890 { 1891 gcc_assert (c_dialect_cxx ()); 1892 error_at (loc, READONLY_MSG (G_("assignment of " 1893 "read-only named return value %qD"), 1894 G_("increment of " 1895 "read-only named return value %qD"), 1896 G_("decrement of " 1897 "read-only named return value %qD"), 1898 G_("read-only named return value %qD " 1899 "used as %<asm%>output")), 1900 arg); 1901 } 1902 else if (TREE_CODE (arg) == FUNCTION_DECL) 1903 error_at (loc, READONLY_MSG (G_("assignment of function %qD"), 1904 G_("increment of function %qD"), 1905 G_("decrement of function %qD"), 1906 G_("function %qD used as %<asm%> output")), 1907 arg); 1908 else 1909 error_at (loc, READONLY_MSG (G_("assignment of read-only location %qE"), 1910 G_("increment of read-only location %qE"), 1911 G_("decrement of read-only location %qE"), 1912 G_("read-only location %qE used as %<asm%> output")), 1913 arg); 1914 } 1915 1916 /* Print an error message for an invalid lvalue. USE says 1917 how the lvalue is being used and so selects the error message. LOC 1918 is the location for the error. */ 1919 1920 void 1921 lvalue_error (location_t loc, enum lvalue_use use) 1922 { 1923 switch (use) 1924 { 1925 case lv_assign: 1926 error_at (loc, "lvalue required as left operand of assignment"); 1927 break; 1928 case lv_increment: 1929 error_at (loc, "lvalue required as increment operand"); 1930 break; 1931 case lv_decrement: 1932 error_at (loc, "lvalue required as decrement operand"); 1933 break; 1934 case lv_addressof: 1935 error_at (loc, "lvalue required as unary %<&%> operand"); 1936 break; 1937 case lv_asm: 1938 error_at (loc, "lvalue required in %<asm%> statement"); 1939 break; 1940 default: 1941 gcc_unreachable (); 1942 } 1943 } 1944 1945 /* Print an error message for an invalid indirection of type TYPE. 1946 ERRSTRING is the name of the operator for the indirection. */ 1947 1948 void 1949 invalid_indirection_error (location_t loc, tree type, ref_operator errstring) 1950 { 1951 switch (errstring) 1952 { 1953 case RO_NULL: 1954 gcc_assert (c_dialect_cxx ()); 1955 error_at (loc, "invalid type argument (have %qT)", type); 1956 break; 1957 case RO_ARRAY_INDEXING: 1958 error_at (loc, 1959 "invalid type argument of array indexing (have %qT)", 1960 type); 1961 break; 1962 case RO_UNARY_STAR: 1963 error_at (loc, 1964 "invalid type argument of unary %<*%> (have %qT)", 1965 type); 1966 break; 1967 case RO_ARROW: 1968 error_at (loc, 1969 "invalid type argument of %<->%> (have %qT)", 1970 type); 1971 break; 1972 case RO_ARROW_STAR: 1973 error_at (loc, 1974 "invalid type argument of %<->*%> (have %qT)", 1975 type); 1976 break; 1977 case RO_IMPLICIT_CONVERSION: 1978 error_at (loc, 1979 "invalid type argument of implicit conversion (have %qT)", 1980 type); 1981 break; 1982 default: 1983 gcc_unreachable (); 1984 } 1985 } 1986 1987 /* Subscripting with type char is likely to lose on a machine where 1988 chars are signed. So warn on any machine, but optionally. Don't 1989 warn for unsigned char since that type is safe. Don't warn for 1990 signed char because anyone who uses that must have done so 1991 deliberately. Furthermore, we reduce the false positive load by 1992 warning only for non-constant value of type char. 1993 LOC is the location of the subscripting expression. */ 1994 1995 void 1996 warn_array_subscript_with_type_char (location_t loc, tree index) 1997 { 1998 if (TYPE_MAIN_VARIANT (TREE_TYPE (index)) == char_type_node) 1999 { 2000 /* If INDEX has a location, use it; otherwise use LOC (the location 2001 of the subscripting expression as a whole). */ 2002 loc = EXPR_LOC_OR_LOC (index, loc); 2003 STRIP_ANY_LOCATION_WRAPPER (index); 2004 if (TREE_CODE (index) != INTEGER_CST) 2005 warning_at (loc, OPT_Wchar_subscripts, 2006 "array subscript has type %<char%>"); 2007 } 2008 } 2009 2010 /* Implement -Wparentheses for the unexpected C precedence rules, to 2011 cover cases like x + y << z which readers are likely to 2012 misinterpret. We have seen an expression in which CODE is a binary 2013 operator used to combine expressions ARG_LEFT and ARG_RIGHT, which 2014 before folding had CODE_LEFT and CODE_RIGHT. CODE_LEFT and 2015 CODE_RIGHT may be ERROR_MARK, which means that that side of the 2016 expression was not formed using a binary or unary operator, or it 2017 was enclosed in parentheses. */ 2018 2019 void 2020 warn_about_parentheses (location_t loc, enum tree_code code, 2021 enum tree_code code_left, tree arg_left, 2022 enum tree_code code_right, tree arg_right) 2023 { 2024 if (!warn_parentheses) 2025 return; 2026 2027 /* This macro tests that the expression ARG with original tree code 2028 CODE appears to be a boolean expression. or the result of folding a 2029 boolean expression. */ 2030 #define APPEARS_TO_BE_BOOLEAN_EXPR_P(CODE, ARG) \ 2031 (truth_value_p (TREE_CODE (ARG)) \ 2032 || TREE_CODE (TREE_TYPE (ARG)) == BOOLEAN_TYPE \ 2033 /* Folding may create 0 or 1 integers from other expressions. */ \ 2034 || ((CODE) != INTEGER_CST \ 2035 && (integer_onep (ARG) || integer_zerop (ARG)))) 2036 2037 switch (code) 2038 { 2039 case LSHIFT_EXPR: 2040 if (code_left == PLUS_EXPR) 2041 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2042 "suggest parentheses around %<+%> inside %<<<%>"); 2043 else if (code_right == PLUS_EXPR) 2044 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2045 "suggest parentheses around %<+%> inside %<<<%>"); 2046 else if (code_left == MINUS_EXPR) 2047 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2048 "suggest parentheses around %<-%> inside %<<<%>"); 2049 else if (code_right == MINUS_EXPR) 2050 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2051 "suggest parentheses around %<-%> inside %<<<%>"); 2052 return; 2053 2054 case RSHIFT_EXPR: 2055 if (code_left == PLUS_EXPR) 2056 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2057 "suggest parentheses around %<+%> inside %<>>%>"); 2058 else if (code_right == PLUS_EXPR) 2059 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2060 "suggest parentheses around %<+%> inside %<>>%>"); 2061 else if (code_left == MINUS_EXPR) 2062 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2063 "suggest parentheses around %<-%> inside %<>>%>"); 2064 else if (code_right == MINUS_EXPR) 2065 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2066 "suggest parentheses around %<-%> inside %<>>%>"); 2067 return; 2068 2069 case TRUTH_ORIF_EXPR: 2070 if (code_left == TRUTH_ANDIF_EXPR) 2071 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2072 "suggest parentheses around %<&&%> within %<||%>"); 2073 else if (code_right == TRUTH_ANDIF_EXPR) 2074 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2075 "suggest parentheses around %<&&%> within %<||%>"); 2076 return; 2077 2078 case BIT_IOR_EXPR: 2079 if (code_left == BIT_AND_EXPR || code_left == BIT_XOR_EXPR 2080 || code_left == PLUS_EXPR || code_left == MINUS_EXPR) 2081 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2082 "suggest parentheses around arithmetic in operand of %<|%>"); 2083 else if (code_right == BIT_AND_EXPR || code_right == BIT_XOR_EXPR 2084 || code_right == PLUS_EXPR || code_right == MINUS_EXPR) 2085 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2086 "suggest parentheses around arithmetic in operand of %<|%>"); 2087 /* Check cases like x|y==z */ 2088 else if (TREE_CODE_CLASS (code_left) == tcc_comparison) 2089 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2090 "suggest parentheses around comparison in operand of %<|%>"); 2091 else if (TREE_CODE_CLASS (code_right) == tcc_comparison) 2092 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2093 "suggest parentheses around comparison in operand of %<|%>"); 2094 /* Check cases like !x | y */ 2095 else if (code_left == TRUTH_NOT_EXPR 2096 && !APPEARS_TO_BE_BOOLEAN_EXPR_P (code_right, arg_right)) 2097 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2098 "suggest parentheses around operand of " 2099 "%<!%> or change %<|%> to %<||%> or %<!%> to %<~%>"); 2100 return; 2101 2102 case BIT_XOR_EXPR: 2103 if (code_left == BIT_AND_EXPR 2104 || code_left == PLUS_EXPR || code_left == MINUS_EXPR) 2105 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2106 "suggest parentheses around arithmetic in operand of %<^%>"); 2107 else if (code_right == BIT_AND_EXPR 2108 || code_right == PLUS_EXPR || code_right == MINUS_EXPR) 2109 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2110 "suggest parentheses around arithmetic in operand of %<^%>"); 2111 /* Check cases like x^y==z */ 2112 else if (TREE_CODE_CLASS (code_left) == tcc_comparison) 2113 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2114 "suggest parentheses around comparison in operand of %<^%>"); 2115 else if (TREE_CODE_CLASS (code_right) == tcc_comparison) 2116 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2117 "suggest parentheses around comparison in operand of %<^%>"); 2118 return; 2119 2120 case BIT_AND_EXPR: 2121 if (code_left == PLUS_EXPR) 2122 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2123 "suggest parentheses around %<+%> in operand of %<&%>"); 2124 else if (code_right == PLUS_EXPR) 2125 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2126 "suggest parentheses around %<+%> in operand of %<&%>"); 2127 else if (code_left == MINUS_EXPR) 2128 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2129 "suggest parentheses around %<-%> in operand of %<&%>"); 2130 else if (code_right == MINUS_EXPR) 2131 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2132 "suggest parentheses around %<-%> in operand of %<&%>"); 2133 /* Check cases like x&y==z */ 2134 else if (TREE_CODE_CLASS (code_left) == tcc_comparison) 2135 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2136 "suggest parentheses around comparison in operand of %<&%>"); 2137 else if (TREE_CODE_CLASS (code_right) == tcc_comparison) 2138 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2139 "suggest parentheses around comparison in operand of %<&%>"); 2140 /* Check cases like !x & y */ 2141 else if (code_left == TRUTH_NOT_EXPR 2142 && !APPEARS_TO_BE_BOOLEAN_EXPR_P (code_right, arg_right)) 2143 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2144 "suggest parentheses around operand of " 2145 "%<!%> or change %<&%> to %<&&%> or %<!%> to %<~%>"); 2146 return; 2147 2148 case EQ_EXPR: 2149 if (TREE_CODE_CLASS (code_left) == tcc_comparison) 2150 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2151 "suggest parentheses around comparison in operand of %<==%>"); 2152 else if (TREE_CODE_CLASS (code_right) == tcc_comparison) 2153 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2154 "suggest parentheses around comparison in operand of %<==%>"); 2155 return; 2156 case NE_EXPR: 2157 if (TREE_CODE_CLASS (code_left) == tcc_comparison) 2158 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2159 "suggest parentheses around comparison in operand of %<!=%>"); 2160 else if (TREE_CODE_CLASS (code_right) == tcc_comparison) 2161 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2162 "suggest parentheses around comparison in operand of %<!=%>"); 2163 return; 2164 2165 default: 2166 if (TREE_CODE_CLASS (code) == tcc_comparison) 2167 { 2168 if (TREE_CODE_CLASS (code_left) == tcc_comparison 2169 && code_left != NE_EXPR && code_left != EQ_EXPR 2170 && INTEGRAL_TYPE_P (TREE_TYPE (arg_left))) 2171 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses, 2172 "comparisons like %<X<=Y<=Z%> do not " 2173 "have their mathematical meaning"); 2174 else if (TREE_CODE_CLASS (code_right) == tcc_comparison 2175 && code_right != NE_EXPR && code_right != EQ_EXPR 2176 && INTEGRAL_TYPE_P (TREE_TYPE (arg_right))) 2177 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses, 2178 "comparisons like %<X<=Y<=Z%> do not " 2179 "have their mathematical meaning"); 2180 } 2181 return; 2182 } 2183 } 2184 2185 /* If LABEL (a LABEL_DECL) has not been used, issue a warning. */ 2186 2187 void 2188 warn_for_unused_label (tree label) 2189 { 2190 if (!TREE_USED (label)) 2191 { 2192 if (DECL_INITIAL (label)) 2193 warning (OPT_Wunused_label, "label %q+D defined but not used", label); 2194 else 2195 warning (OPT_Wunused_label, "label %q+D declared but not defined", label); 2196 } 2197 else if (asan_sanitize_use_after_scope ()) 2198 { 2199 if (asan_used_labels == NULL) 2200 asan_used_labels = new hash_set<tree> (16); 2201 2202 asan_used_labels->add (label); 2203 } 2204 } 2205 2206 /* Warn for division by zero according to the value of DIVISOR. LOC 2207 is the location of the division operator. */ 2208 2209 void 2210 warn_for_div_by_zero (location_t loc, tree divisor) 2211 { 2212 /* If DIVISOR is zero, and has integral or fixed-point type, issue a warning 2213 about division by zero. Do not issue a warning if DIVISOR has a 2214 floating-point type, since we consider 0.0/0.0 a valid way of 2215 generating a NaN. */ 2216 if (c_inhibit_evaluation_warnings == 0 2217 && (integer_zerop (divisor) || fixed_zerop (divisor))) 2218 warning_at (loc, OPT_Wdiv_by_zero, "division by zero"); 2219 } 2220 2221 /* Warn for patterns where memset appears to be used incorrectly. The 2222 warning location should be LOC. ARG0, and ARG2 are the first and 2223 last arguments to the call, while LITERAL_ZERO_MASK has a 1 bit for 2224 each argument that was a literal zero. */ 2225 2226 void 2227 warn_for_memset (location_t loc, tree arg0, tree arg2, 2228 int literal_zero_mask) 2229 { 2230 arg0 = fold_for_warn (arg0); 2231 arg2 = fold_for_warn (arg2); 2232 2233 if (warn_memset_transposed_args 2234 && integer_zerop (arg2) 2235 && (literal_zero_mask & (1 << 2)) != 0 2236 && (literal_zero_mask & (1 << 1)) == 0) 2237 warning_at (loc, OPT_Wmemset_transposed_args, 2238 "%<memset%> used with constant zero length " 2239 "parameter; this could be due to transposed " 2240 "parameters"); 2241 2242 if (warn_memset_elt_size && TREE_CODE (arg2) == INTEGER_CST) 2243 { 2244 STRIP_NOPS (arg0); 2245 if (TREE_CODE (arg0) == ADDR_EXPR) 2246 arg0 = TREE_OPERAND (arg0, 0); 2247 tree type = TREE_TYPE (arg0); 2248 if (type != NULL_TREE && TREE_CODE (type) == ARRAY_TYPE) 2249 { 2250 tree elt_type = TREE_TYPE (type); 2251 tree domain = TYPE_DOMAIN (type); 2252 if (COMPLETE_TYPE_P (elt_type) 2253 && !integer_onep (TYPE_SIZE_UNIT (elt_type)) 2254 && domain != NULL_TREE 2255 && TYPE_MAX_VALUE (domain) 2256 && TYPE_MIN_VALUE (domain) 2257 && integer_zerop (TYPE_MIN_VALUE (domain)) 2258 && integer_onep (fold_build2 (MINUS_EXPR, domain, 2259 arg2, 2260 TYPE_MAX_VALUE (domain)))) 2261 warning_at (loc, OPT_Wmemset_elt_size, 2262 "%<memset%> used with length equal to " 2263 "number of elements without multiplication " 2264 "by element size"); 2265 } 2266 } 2267 } 2268 2269 /* Warn for calloc (sizeof (X), n). */ 2270 2271 void 2272 warn_for_calloc (location_t *sizeof_arg_loc, tree callee, 2273 vec<tree, va_gc> *params, tree *sizeof_arg, tree attr) 2274 { 2275 if (!TREE_VALUE (attr) || !TREE_CHAIN (TREE_VALUE (attr))) 2276 return; 2277 2278 int arg1 = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr))) - 1; 2279 int arg2 2280 = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (TREE_VALUE (attr)))) - 1; 2281 if (arg1 < 0 2282 || (unsigned) arg1 >= vec_safe_length (params) 2283 || arg1 >= 6 2284 || arg2 < 0 2285 || (unsigned) arg2 >= vec_safe_length (params) 2286 || arg2 >= 6 2287 || arg1 >= arg2) 2288 return; 2289 2290 if (sizeof_arg[arg1] == NULL_TREE || sizeof_arg[arg2] != NULL_TREE) 2291 return; 2292 2293 if (warning_at (sizeof_arg_loc[arg1], OPT_Wcalloc_transposed_args, 2294 "%qD sizes specified with %<sizeof%> in the earlier " 2295 "argument and not in the later argument", callee)) 2296 inform (sizeof_arg_loc[arg1], "earlier argument should specify number " 2297 "of elements, later size of each element"); 2298 } 2299 2300 /* Warn for allocator calls where the constant allocated size is smaller 2301 than sizeof (TYPE). */ 2302 2303 void 2304 warn_for_alloc_size (location_t loc, tree type, tree call, tree alloc_size) 2305 { 2306 if (!TREE_VALUE (alloc_size)) 2307 return; 2308 2309 tree arg1 = TREE_VALUE (TREE_VALUE (alloc_size)); 2310 int idx1 = TREE_INT_CST_LOW (arg1) - 1; 2311 if (idx1 < 0 || idx1 >= call_expr_nargs (call)) 2312 return; 2313 arg1 = CALL_EXPR_ARG (call, idx1); 2314 if (TREE_CODE (arg1) != INTEGER_CST) 2315 return; 2316 if (TREE_CHAIN (TREE_VALUE (alloc_size))) 2317 { 2318 tree arg2 = TREE_VALUE (TREE_CHAIN (TREE_VALUE (alloc_size))); 2319 int idx2 = TREE_INT_CST_LOW (arg2) - 1; 2320 if (idx2 < 0 || idx2 >= call_expr_nargs (call)) 2321 return; 2322 arg2 = CALL_EXPR_ARG (call, idx2); 2323 if (TREE_CODE (arg2) != INTEGER_CST) 2324 return; 2325 arg1 = int_const_binop (MULT_EXPR, fold_convert (sizetype, arg1), 2326 fold_convert (sizetype, arg2)); 2327 if (TREE_CODE (arg1) != INTEGER_CST) 2328 return; 2329 } 2330 if (!VOID_TYPE_P (type) 2331 && TYPE_SIZE_UNIT (type) 2332 && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST 2333 && tree_int_cst_lt (arg1, TYPE_SIZE_UNIT (type))) 2334 warning_at (loc, OPT_Walloc_size, 2335 "allocation of insufficient size %qE for type %qT with " 2336 "size %qE", arg1, type, TYPE_SIZE_UNIT (type)); 2337 } 2338 2339 /* Subroutine of build_binary_op. Give warnings for comparisons 2340 between signed and unsigned quantities that may fail. Do the 2341 checking based on the original operand trees ORIG_OP0 and ORIG_OP1, 2342 so that casts will be considered, but default promotions won't 2343 be. 2344 2345 LOCATION is the location of the comparison operator. 2346 2347 The arguments of this function map directly to local variables 2348 of build_binary_op. */ 2349 2350 void 2351 warn_for_sign_compare (location_t location, 2352 tree orig_op0, tree orig_op1, 2353 tree op0, tree op1, 2354 tree result_type, enum tree_code resultcode) 2355 { 2356 if (error_operand_p (orig_op0) || error_operand_p (orig_op1)) 2357 return; 2358 2359 int op0_signed = !TYPE_UNSIGNED (TREE_TYPE (orig_op0)); 2360 int op1_signed = !TYPE_UNSIGNED (TREE_TYPE (orig_op1)); 2361 int unsignedp0, unsignedp1; 2362 2363 /* Do not warn if the comparison is being done in a signed type, 2364 since the signed type will only be chosen if it can represent 2365 all the values of the unsigned type. */ 2366 if (!TYPE_UNSIGNED (result_type)) 2367 /* OK */; 2368 /* Do not warn if both operands are unsigned. */ 2369 else if (op0_signed == op1_signed) 2370 /* OK */; 2371 else 2372 { 2373 tree sop, uop, base_type; 2374 bool ovf; 2375 2376 if (op0_signed) 2377 sop = orig_op0, uop = orig_op1; 2378 else 2379 sop = orig_op1, uop = orig_op0; 2380 2381 sop = fold_for_warn (sop); 2382 uop = fold_for_warn (uop); 2383 2384 STRIP_TYPE_NOPS (sop); 2385 STRIP_TYPE_NOPS (uop); 2386 base_type = (TREE_CODE (result_type) == COMPLEX_TYPE 2387 ? TREE_TYPE (result_type) : result_type); 2388 2389 /* Do not warn if the signed quantity is an unsuffixed integer 2390 literal (or some static constant expression involving such 2391 literals or a conditional expression involving such literals) 2392 and it is non-negative. */ 2393 if (tree_expr_nonnegative_warnv_p (sop, &ovf)) 2394 /* OK */; 2395 /* Do not warn if the comparison is an equality operation, the 2396 unsigned quantity is an integral constant, and it would fit 2397 in the result if the result were signed. */ 2398 else if (TREE_CODE (uop) == INTEGER_CST 2399 && (resultcode == EQ_EXPR || resultcode == NE_EXPR) 2400 && int_fits_type_p (uop, c_common_signed_type (base_type))) 2401 /* OK */; 2402 /* In C, do not warn if the unsigned quantity is an enumeration 2403 constant and its maximum value would fit in the result if the 2404 result were signed. */ 2405 else if (!c_dialect_cxx() && TREE_CODE (uop) == INTEGER_CST 2406 && TREE_CODE (TREE_TYPE (uop)) == ENUMERAL_TYPE 2407 && int_fits_type_p (TYPE_MAX_VALUE (TREE_TYPE (uop)), 2408 c_common_signed_type (base_type))) 2409 /* OK */; 2410 else 2411 warning_at (location, OPT_Wsign_compare, 2412 "comparison of integer expressions of different " 2413 "signedness: %qT and %qT", TREE_TYPE (orig_op0), 2414 TREE_TYPE (orig_op1)); 2415 } 2416 2417 /* Warn if two unsigned values are being compared in a size larger 2418 than their original size, and one (and only one) is the result of 2419 a `~' operator. This comparison will always fail. 2420 2421 Also warn if one operand is a constant, and the constant does not 2422 have all bits set that are set in the ~ operand when it is 2423 extended. */ 2424 2425 /* bits0 is the bit index of op0 extended to result_type, which will 2426 be always 0 and so all bits above it. If there is a BIT_NOT_EXPR 2427 in that operand possibly sign or zero extended to op0 and then 2428 possibly further sign or zero extended to result_type, bits0 will 2429 be the precision of result type if all the extensions involved 2430 if any are sign extensions, and will be the place of the innermost 2431 zero extension otherwise. We warn only if BIT_NOT_EXPR's operand is 2432 zero extended from some even smaller precision, in that case after 2433 BIT_NOT_EXPR some bits below bits0 will be guaranteed to be set. 2434 Similarly for bits1. */ 2435 int bits0 = TYPE_PRECISION (result_type); 2436 if (TYPE_UNSIGNED (TREE_TYPE (op0))) 2437 bits0 = TYPE_PRECISION (TREE_TYPE (op0)); 2438 tree arg0 = c_common_get_narrower (op0, &unsignedp0); 2439 if (TYPE_PRECISION (TREE_TYPE (arg0)) == TYPE_PRECISION (TREE_TYPE (op0))) 2440 unsignedp0 = TYPE_UNSIGNED (TREE_TYPE (op0)); 2441 else if (unsignedp0) 2442 bits0 = TYPE_PRECISION (TREE_TYPE (arg0)); 2443 op0 = arg0; 2444 int bits1 = TYPE_PRECISION (result_type); 2445 if (TYPE_UNSIGNED (TREE_TYPE (op1))) 2446 bits1 = TYPE_PRECISION (TREE_TYPE (op1)); 2447 tree arg1 = c_common_get_narrower (op1, &unsignedp1); 2448 if (TYPE_PRECISION (TREE_TYPE (arg1)) == TYPE_PRECISION (TREE_TYPE (op1))) 2449 unsignedp1 = TYPE_UNSIGNED (TREE_TYPE (op1)); 2450 else if (unsignedp1) 2451 bits1 = TYPE_PRECISION (TREE_TYPE (arg1)); 2452 op1 = arg1; 2453 2454 if ((TREE_CODE (op0) == BIT_NOT_EXPR) 2455 ^ (TREE_CODE (op1) == BIT_NOT_EXPR)) 2456 { 2457 if (TREE_CODE (op1) == BIT_NOT_EXPR) 2458 { 2459 std::swap (op0, op1); 2460 std::swap (unsignedp0, unsignedp1); 2461 std::swap (bits0, bits1); 2462 } 2463 2464 int unsignedp; 2465 arg0 = c_common_get_narrower (TREE_OPERAND (op0, 0), &unsignedp); 2466 2467 /* For these warnings, we need BIT_NOT_EXPR operand to be 2468 zero extended from narrower type to BIT_NOT_EXPR's type. 2469 In that case, all those bits above the narrower's type 2470 are after BIT_NOT_EXPR set to 1. */ 2471 if (tree_fits_shwi_p (op1)) 2472 { 2473 HOST_WIDE_INT constant = tree_to_shwi (op1); 2474 unsigned int bits = TYPE_PRECISION (TREE_TYPE (arg0)); 2475 if (unsignedp 2476 && bits < TYPE_PRECISION (TREE_TYPE (op0)) 2477 && bits < HOST_BITS_PER_WIDE_INT) 2478 { 2479 HOST_WIDE_INT mask = HOST_WIDE_INT_M1U << bits; 2480 if (bits0 < HOST_BITS_PER_WIDE_INT) 2481 mask &= ~(HOST_WIDE_INT_M1U << bits0); 2482 if ((mask & constant) != mask) 2483 { 2484 if (constant == 0) 2485 warning_at (location, OPT_Wsign_compare, 2486 "promoted bitwise complement of an unsigned " 2487 "value is always nonzero"); 2488 else 2489 warning_at (location, OPT_Wsign_compare, 2490 "comparison of promoted bitwise complement " 2491 "of an unsigned value with constant"); 2492 } 2493 } 2494 } 2495 else if ((TYPE_PRECISION (TREE_TYPE (arg0)) 2496 < TYPE_PRECISION (TREE_TYPE (op0))) 2497 && unsignedp 2498 && unsignedp1 2499 && TYPE_PRECISION (TREE_TYPE (op1)) < bits0) 2500 warning_at (location, OPT_Wsign_compare, 2501 "comparison of promoted bitwise complement " 2502 "of an unsigned value with unsigned"); 2503 } 2504 } 2505 2506 /* RESULT_TYPE is the result of converting TYPE1 and TYPE2 to a common 2507 type via c_common_type. If -Wdouble-promotion is in use, and the 2508 conditions for warning have been met, issue a warning. GMSGID is 2509 the warning message. It must have two %T specifiers for the type 2510 that was converted (generally "float") and the type to which it was 2511 converted (generally "double), respectively. LOC is the location 2512 to which the warning should refer. */ 2513 2514 void 2515 do_warn_double_promotion (tree result_type, tree type1, tree type2, 2516 const char *gmsgid, location_t loc) 2517 { 2518 tree source_type; 2519 2520 if (!warn_double_promotion) 2521 return; 2522 /* If the conversion will not occur at run-time, there is no need to 2523 warn about it. */ 2524 if (c_inhibit_evaluation_warnings) 2525 return; 2526 /* If an invalid conversion has occurred, don't warn. */ 2527 if (result_type == error_mark_node) 2528 return; 2529 if (TYPE_MAIN_VARIANT (result_type) != double_type_node 2530 && TYPE_MAIN_VARIANT (result_type) != complex_double_type_node) 2531 return; 2532 if (TYPE_MAIN_VARIANT (type1) == float_type_node 2533 || TYPE_MAIN_VARIANT (type1) == complex_float_type_node) 2534 source_type = type1; 2535 else if (TYPE_MAIN_VARIANT (type2) == float_type_node 2536 || TYPE_MAIN_VARIANT (type2) == complex_float_type_node) 2537 source_type = type2; 2538 else 2539 return; 2540 warning_at (loc, OPT_Wdouble_promotion, gmsgid, source_type, result_type); 2541 } 2542 2543 /* Possibly warn about unused parameters. */ 2544 2545 void 2546 do_warn_unused_parameter (tree fn) 2547 { 2548 tree decl; 2549 2550 for (decl = DECL_ARGUMENTS (fn); 2551 decl; decl = DECL_CHAIN (decl)) 2552 if (!TREE_USED (decl) && TREE_CODE (decl) == PARM_DECL 2553 && DECL_NAME (decl) && !DECL_ARTIFICIAL (decl) 2554 && !warning_suppressed_p (decl, OPT_Wunused_parameter)) 2555 warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wunused_parameter, 2556 "unused parameter %qD", decl); 2557 } 2558 2559 /* If DECL is a typedef that is declared in the current function, 2560 record it for the purpose of -Wunused-local-typedefs. */ 2561 2562 void 2563 record_locally_defined_typedef (tree decl) 2564 { 2565 struct c_language_function *l; 2566 2567 if (!warn_unused_local_typedefs 2568 || cfun == NULL 2569 /* if this is not a locally defined typedef then we are not 2570 interested. */ 2571 || !is_typedef_decl (decl) 2572 || !decl_function_context (decl)) 2573 return; 2574 2575 l = (struct c_language_function *) cfun->language; 2576 vec_safe_push (l->local_typedefs, decl); 2577 } 2578 2579 /* If T is a TYPE_DECL declared locally, mark it as used. */ 2580 2581 void 2582 maybe_record_typedef_use (tree t) 2583 { 2584 if (!is_typedef_decl (t)) 2585 return; 2586 2587 TREE_USED (t) = true; 2588 } 2589 2590 /* Warn if there are some unused locally defined typedefs in the 2591 current function. */ 2592 2593 void 2594 maybe_warn_unused_local_typedefs (void) 2595 { 2596 int i; 2597 tree decl; 2598 /* The number of times we have emitted -Wunused-local-typedefs 2599 warnings. If this is different from errorcount, that means some 2600 unrelated errors have been issued. In which case, we'll avoid 2601 emitting "unused-local-typedefs" warnings. */ 2602 static int unused_local_typedefs_warn_count; 2603 struct c_language_function *l; 2604 2605 if (cfun == NULL) 2606 return; 2607 2608 if ((l = (struct c_language_function *) cfun->language) == NULL) 2609 return; 2610 2611 if (warn_unused_local_typedefs 2612 && errorcount == unused_local_typedefs_warn_count) 2613 { 2614 FOR_EACH_VEC_SAFE_ELT (l->local_typedefs, i, decl) 2615 if (!TREE_USED (decl)) 2616 warning_at (DECL_SOURCE_LOCATION (decl), 2617 OPT_Wunused_local_typedefs, 2618 "typedef %qD locally defined but not used", decl); 2619 unused_local_typedefs_warn_count = errorcount; 2620 } 2621 2622 vec_free (l->local_typedefs); 2623 } 2624 2625 /* If we're creating an if-else-if condition chain, first see if we 2626 already have this COND in the CHAIN. If so, warn and don't add COND 2627 into the vector, otherwise add the COND there. LOC is the location 2628 of COND. */ 2629 2630 void 2631 warn_duplicated_cond_add_or_warn (location_t loc, tree cond, vec<tree> **chain) 2632 { 2633 /* No chain has been created yet. Do nothing. */ 2634 if (*chain == NULL) 2635 return; 2636 2637 if (TREE_SIDE_EFFECTS (cond) || instantiation_dependent_expression_p (cond)) 2638 { 2639 /* Uh-oh! This condition has a side-effect, thus invalidates 2640 the whole chain. */ 2641 delete *chain; 2642 *chain = NULL; 2643 return; 2644 } 2645 2646 unsigned int ix; 2647 tree t; 2648 bool found = false; 2649 FOR_EACH_VEC_ELT (**chain, ix, t) 2650 if (operand_equal_p (cond, t, 0)) 2651 { 2652 auto_diagnostic_group d; 2653 if (warning_at (loc, OPT_Wduplicated_cond, 2654 "duplicated %<if%> condition")) 2655 inform (EXPR_LOCATION (t), "previously used here"); 2656 found = true; 2657 break; 2658 } 2659 2660 if (!found 2661 && !CONSTANT_CLASS_P (cond) 2662 /* Don't infinitely grow the chain. */ 2663 && (*chain)->length () < 512) 2664 (*chain)->safe_push (cond); 2665 } 2666 2667 /* Check and possibly warn if two declarations have contradictory 2668 attributes, such as always_inline vs. noinline. */ 2669 2670 bool 2671 diagnose_mismatched_attributes (tree olddecl, tree newdecl) 2672 { 2673 bool warned = false; 2674 2675 tree a1 = lookup_attribute ("optimize", DECL_ATTRIBUTES (olddecl)); 2676 tree a2 = lookup_attribute ("optimize", DECL_ATTRIBUTES (newdecl)); 2677 /* An optimization attribute applied on a declaration after the 2678 definition is likely not what the user wanted. */ 2679 if (a2 != NULL_TREE 2680 && DECL_SAVED_TREE (olddecl) != NULL_TREE 2681 && (a1 == NULL_TREE || !attribute_list_equal (a1, a2))) 2682 warned |= warning (OPT_Wattributes, 2683 "optimization attribute on %qD follows " 2684 "definition but the attribute doesn%'t match", 2685 newdecl); 2686 2687 /* Diagnose inline __attribute__ ((noinline)) which is silly. */ 2688 if (DECL_DECLARED_INLINE_P (newdecl) 2689 && DECL_UNINLINABLE (olddecl) 2690 && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl))) 2691 warned |= warning (OPT_Wattributes, "inline declaration of %qD follows " 2692 "declaration with attribute %<noinline%>", newdecl); 2693 else if (DECL_DECLARED_INLINE_P (olddecl) 2694 && DECL_UNINLINABLE (newdecl) 2695 && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) 2696 warned |= warning (OPT_Wattributes, "declaration of %q+D with attribute " 2697 "%<noinline%> follows inline declaration", newdecl); 2698 2699 return warned; 2700 } 2701 2702 /* Warn if signed left shift overflows. We don't warn 2703 about left-shifting 1 into the sign bit in C++14; cf. 2704 <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3367.html#1457> 2705 and don't warn for C++20 at all, as signed left shifts never 2706 overflow. 2707 LOC is a location of the shift; OP0 and OP1 are the operands. 2708 Return true if an overflow is detected, false otherwise. */ 2709 2710 bool 2711 maybe_warn_shift_overflow (location_t loc, tree op0, tree op1) 2712 { 2713 if (TREE_CODE (op0) != INTEGER_CST 2714 || TREE_CODE (op1) != INTEGER_CST) 2715 return false; 2716 2717 /* match.pd could have narrowed the left shift already, 2718 take type promotion into account. */ 2719 tree type0 = lang_hooks.types.type_promotes_to (TREE_TYPE (op0)); 2720 unsigned int prec0 = TYPE_PRECISION (type0); 2721 2722 /* Left-hand operand must be signed. */ 2723 if (TYPE_OVERFLOW_WRAPS (type0) || cxx_dialect >= cxx20) 2724 return false; 2725 2726 signop sign = SIGNED; 2727 if (TYPE_PRECISION (TREE_TYPE (op0)) < TYPE_PRECISION (type0)) 2728 sign = TYPE_SIGN (TREE_TYPE (op0)); 2729 unsigned int min_prec = (wi::min_precision (wi::to_wide (op0), sign) 2730 + TREE_INT_CST_LOW (op1)); 2731 /* Handle the case of left-shifting 1 into the sign bit. 2732 * However, shifting 1 _out_ of the sign bit, as in 2733 * INT_MIN << 1, is considered an overflow. 2734 */ 2735 if (!tree_int_cst_sign_bit (op0) && min_prec == prec0 + 1) 2736 { 2737 /* Never warn for C++14 onwards. */ 2738 if (cxx_dialect >= cxx14) 2739 return false; 2740 /* Otherwise only if -Wshift-overflow=2. But return 2741 true to signal an overflow for the sake of integer 2742 constant expressions. */ 2743 if (warn_shift_overflow < 2) 2744 return true; 2745 } 2746 2747 bool overflowed = min_prec > prec0; 2748 if (overflowed && c_inhibit_evaluation_warnings == 0) 2749 warning_at (loc, OPT_Wshift_overflow_, 2750 "result of %qE requires %u bits to represent, " 2751 "but %qT only has %u bits", 2752 build2_loc (loc, LSHIFT_EXPR, type0, 2753 fold_convert (type0, op0), op1), 2754 min_prec, type0, prec0); 2755 2756 return overflowed; 2757 } 2758 2759 /* Warn about boolean expression compared with an integer value different 2760 from true/false. Warns also e.g. about "(i1 == i2) == 2". 2761 LOC is the location of the comparison, CODE is its code, OP0 and OP1 2762 are the operands of the comparison. The caller must ensure that 2763 either operand is a boolean expression. */ 2764 2765 void 2766 maybe_warn_bool_compare (location_t loc, enum tree_code code, tree op0, 2767 tree op1) 2768 { 2769 if (TREE_CODE_CLASS (code) != tcc_comparison) 2770 return; 2771 2772 tree f, cst; 2773 if (f = fold_for_warn (op0), 2774 TREE_CODE (f) == INTEGER_CST) 2775 cst = op0 = f; 2776 else if (f = fold_for_warn (op1), 2777 TREE_CODE (f) == INTEGER_CST) 2778 cst = op1 = f; 2779 else 2780 return; 2781 2782 if (!integer_zerop (cst) && !integer_onep (cst)) 2783 { 2784 int sign = (TREE_CODE (op0) == INTEGER_CST 2785 ? tree_int_cst_sgn (cst) : -tree_int_cst_sgn (cst)); 2786 if (code == EQ_EXPR 2787 || ((code == GT_EXPR || code == GE_EXPR) && sign < 0) 2788 || ((code == LT_EXPR || code == LE_EXPR) && sign > 0)) 2789 warning_at (loc, OPT_Wbool_compare, "comparison of constant %qE " 2790 "with boolean expression is always false", cst); 2791 else 2792 warning_at (loc, OPT_Wbool_compare, "comparison of constant %qE " 2793 "with boolean expression is always true", cst); 2794 } 2795 else if (integer_zerop (cst) || integer_onep (cst)) 2796 { 2797 /* If the non-constant operand isn't of a boolean type, we 2798 don't want to warn here. */ 2799 tree noncst = TREE_CODE (op0) == INTEGER_CST ? op1 : op0; 2800 /* Handle booleans promoted to integers. */ 2801 if (bool_promoted_to_int_p (noncst)) 2802 /* Warn. */; 2803 else if (TREE_CODE (TREE_TYPE (noncst)) != BOOLEAN_TYPE 2804 && !truth_value_p (TREE_CODE (noncst))) 2805 return; 2806 /* Do some magic to get the right diagnostics. */ 2807 bool flag = TREE_CODE (op0) == INTEGER_CST; 2808 flag = integer_zerop (cst) ? flag : !flag; 2809 if ((code == GE_EXPR && !flag) || (code == LE_EXPR && flag)) 2810 warning_at (loc, OPT_Wbool_compare, "comparison of constant %qE " 2811 "with boolean expression is always true", cst); 2812 else if ((code == LT_EXPR && !flag) || (code == GT_EXPR && flag)) 2813 warning_at (loc, OPT_Wbool_compare, "comparison of constant %qE " 2814 "with boolean expression is always false", cst); 2815 } 2816 } 2817 2818 /* Warn if an argument at position param_pos is passed to a 2819 restrict-qualified param, and it aliases with another argument. 2820 Return true if a warning has been issued. */ 2821 2822 bool 2823 warn_for_restrict (unsigned param_pos, tree *argarray, unsigned nargs) 2824 { 2825 tree arg = argarray[param_pos]; 2826 if (TREE_VISITED (arg) || integer_zerop (arg)) 2827 return false; 2828 2829 location_t loc = EXPR_LOC_OR_LOC (arg, input_location); 2830 gcc_rich_location richloc (loc); 2831 2832 unsigned i; 2833 auto_vec<int, 16> arg_positions; 2834 2835 for (i = 0; i < nargs; i++) 2836 { 2837 if (i == param_pos) 2838 continue; 2839 2840 tree current_arg = argarray[i]; 2841 if (operand_equal_p (arg, current_arg, 0)) 2842 { 2843 TREE_VISITED (current_arg) = 1; 2844 arg_positions.safe_push (i + 1); 2845 } 2846 } 2847 2848 if (arg_positions.is_empty ()) 2849 return false; 2850 2851 int pos; 2852 FOR_EACH_VEC_ELT (arg_positions, i, pos) 2853 { 2854 arg = argarray[pos - 1]; 2855 if (EXPR_HAS_LOCATION (arg)) 2856 richloc.add_range (EXPR_LOCATION (arg)); 2857 } 2858 2859 return warning_n (&richloc, OPT_Wrestrict, arg_positions.length (), 2860 "passing argument %i to %qs-qualified parameter" 2861 " aliases with argument %Z", 2862 "passing argument %i to %qs-qualified parameter" 2863 " aliases with arguments %Z", 2864 param_pos + 1, "restrict", arg_positions.address (), 2865 arg_positions.length ()); 2866 } 2867 2868 /* Callback function to determine whether an expression TP or one of its 2869 subexpressions comes from macro expansion. Used to suppress bogus 2870 warnings. */ 2871 2872 static tree 2873 expr_from_macro_expansion_r (tree *tp, int *, void *) 2874 { 2875 if (CAN_HAVE_LOCATION_P (*tp) 2876 && from_macro_expansion_at (EXPR_LOCATION (*tp))) 2877 return integer_zero_node; 2878 2879 return NULL_TREE; 2880 } 2881 2882 /* Possibly warn when an if-else has identical branches. */ 2883 2884 static void 2885 do_warn_duplicated_branches (tree expr) 2886 { 2887 tree thenb = COND_EXPR_THEN (expr); 2888 tree elseb = COND_EXPR_ELSE (expr); 2889 2890 /* Don't bother if any of the branches is missing. */ 2891 if (thenb == NULL_TREE || elseb == NULL_TREE) 2892 return; 2893 2894 /* And don't warn for empty statements. */ 2895 if (TREE_CODE (thenb) == NOP_EXPR 2896 && TREE_TYPE (thenb) == void_type_node 2897 && TREE_OPERAND (thenb, 0) == size_zero_node) 2898 return; 2899 2900 /* ... or empty branches. */ 2901 if (TREE_CODE (thenb) == STATEMENT_LIST 2902 && STATEMENT_LIST_HEAD (thenb) == NULL) 2903 return; 2904 2905 /* Compute the hash of the then branch. */ 2906 inchash::hash hstate0 (0); 2907 inchash::add_expr (thenb, hstate0); 2908 hashval_t h0 = hstate0.end (); 2909 2910 /* Compute the hash of the else branch. */ 2911 inchash::hash hstate1 (0); 2912 inchash::add_expr (elseb, hstate1); 2913 hashval_t h1 = hstate1.end (); 2914 2915 /* Compare the hashes. */ 2916 if (h0 == h1 2917 && operand_equal_p (thenb, elseb, OEP_LEXICOGRAPHIC 2918 | OEP_ADDRESS_OF_SAME_FIELD) 2919 /* Don't warn if any of the branches or their subexpressions comes 2920 from a macro. */ 2921 && !walk_tree_without_duplicates (&thenb, expr_from_macro_expansion_r, 2922 NULL) 2923 && !walk_tree_without_duplicates (&elseb, expr_from_macro_expansion_r, 2924 NULL)) 2925 warning_at (EXPR_LOCATION (expr), OPT_Wduplicated_branches, 2926 "this condition has identical branches"); 2927 } 2928 2929 /* Callback for c_genericize to implement -Wduplicated-branches. */ 2930 2931 tree 2932 do_warn_duplicated_branches_r (tree *tp, int *, void *) 2933 { 2934 if (TREE_CODE (*tp) == COND_EXPR) 2935 do_warn_duplicated_branches (*tp); 2936 return NULL_TREE; 2937 } 2938 2939 /* Implementation of -Wmultistatement-macros. This warning warns about 2940 cases when a macro expands to multiple statements not wrapped in 2941 do {} while (0) or ({ }) and is used as a body of if/else/for/while 2942 conditionals. For example, 2943 2944 #define DOIT x++; y++ 2945 2946 if (c) 2947 DOIT; 2948 2949 will increment y unconditionally. 2950 2951 BODY_LOC is the location of the first token in the body after labels 2952 have been parsed, NEXT_LOC is the location of the next token after the 2953 body of the conditional has been parsed, and GUARD_LOC is the location 2954 of the conditional. */ 2955 2956 void 2957 warn_for_multistatement_macros (location_t body_loc, location_t next_loc, 2958 location_t guard_loc, enum rid keyword) 2959 { 2960 if (!warn_multistatement_macros) 2961 return; 2962 2963 /* Ain't got time to waste. We only care about macros here. */ 2964 if (!from_macro_expansion_at (body_loc) 2965 || !from_macro_expansion_at (next_loc)) 2966 return; 2967 2968 /* Let's skip macros defined in system headers. */ 2969 if (in_system_header_at (body_loc) 2970 || in_system_header_at (next_loc)) 2971 return; 2972 2973 /* Find the actual tokens in the macro definition. BODY_LOC and 2974 NEXT_LOC have to come from the same spelling location, but they 2975 will resolve to different locations in the context of the macro 2976 definition. */ 2977 location_t body_loc_exp 2978 = linemap_resolve_location (line_table, body_loc, 2979 LRK_MACRO_DEFINITION_LOCATION, NULL); 2980 location_t next_loc_exp 2981 = linemap_resolve_location (line_table, next_loc, 2982 LRK_MACRO_DEFINITION_LOCATION, NULL); 2983 location_t guard_loc_exp 2984 = linemap_resolve_location (line_table, guard_loc, 2985 LRK_MACRO_DEFINITION_LOCATION, NULL); 2986 2987 /* These are some funky cases we don't want to warn about. */ 2988 if (body_loc_exp == guard_loc_exp 2989 || next_loc_exp == guard_loc_exp 2990 || body_loc_exp == next_loc_exp) 2991 return; 2992 2993 /* Find the macro maps for the macro expansions. */ 2994 const line_map *body_map = linemap_lookup (line_table, body_loc); 2995 const line_map *next_map = linemap_lookup (line_table, next_loc); 2996 const line_map *guard_map = linemap_lookup (line_table, guard_loc); 2997 2998 /* Now see if the following token (after the body) is coming from the 2999 same macro expansion. If it is, it might be a problem. */ 3000 if (body_map != next_map) 3001 return; 3002 3003 /* The conditional itself must not come from the same expansion, because 3004 we don't want to warn about 3005 #define IF if (x) x++; y++ 3006 and similar. */ 3007 if (guard_map == body_map) 3008 return; 3009 3010 /* Handle the case where NEXT and BODY come from the same expansion while 3011 GUARD doesn't, yet we shouldn't warn. E.g. 3012 3013 #define GUARD if (...) 3014 #define GUARD2 GUARD 3015 3016 and in the definition of another macro: 3017 3018 GUARD2 3019 foo (); 3020 return 1; 3021 */ 3022 while (linemap_macro_expansion_map_p (guard_map)) 3023 { 3024 const line_map_macro *mm = linemap_check_macro (guard_map); 3025 guard_loc_exp = mm->get_expansion_point_location (); 3026 guard_map = linemap_lookup (line_table, guard_loc_exp); 3027 if (guard_map == body_map) 3028 return; 3029 } 3030 3031 auto_diagnostic_group d; 3032 if (warning_at (body_loc, OPT_Wmultistatement_macros, 3033 "macro expands to multiple statements")) 3034 inform (guard_loc, "some parts of macro expansion are not guarded by " 3035 "this %qs clause", guard_tinfo_to_string (keyword)); 3036 } 3037 3038 /* Return struct or union type if the alignment of data member, FIELD, 3039 is less than the alignment of TYPE. Otherwise, return NULL_TREE. 3040 If RVALUE is true, only arrays evaluate to pointers. */ 3041 3042 static tree 3043 check_alignment_of_packed_member (tree type, tree field, bool rvalue) 3044 { 3045 /* Check alignment of the data member. */ 3046 if (TREE_CODE (field) == FIELD_DECL 3047 && (DECL_PACKED (field) || TYPE_PACKED (TREE_TYPE (field))) 3048 /* Ignore FIELDs not laid out yet. */ 3049 && DECL_FIELD_OFFSET (field) 3050 && (!rvalue || TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE)) 3051 { 3052 /* Check the expected alignment against the field alignment. */ 3053 unsigned int type_align = min_align_of_type (type); 3054 tree context = DECL_CONTEXT (field); 3055 unsigned int record_align = min_align_of_type (context); 3056 if (record_align < type_align) 3057 return context; 3058 tree field_off = byte_position (field); 3059 if (!multiple_of_p (TREE_TYPE (field_off), field_off, 3060 size_int (type_align))) 3061 return context; 3062 } 3063 3064 return NULL_TREE; 3065 } 3066 3067 /* Return struct or union type if the right hand value, RHS, 3068 is an address which takes the unaligned address of packed member 3069 of struct or union when assigning to TYPE. 3070 Otherwise, return NULL_TREE. */ 3071 3072 static tree 3073 check_address_of_packed_member (tree type, tree rhs) 3074 { 3075 bool rvalue = true; 3076 bool indirect = false; 3077 3078 if (INDIRECT_REF_P (rhs)) 3079 { 3080 rhs = TREE_OPERAND (rhs, 0); 3081 STRIP_NOPS (rhs); 3082 indirect = true; 3083 } 3084 3085 if (TREE_CODE (rhs) == ADDR_EXPR) 3086 { 3087 rhs = TREE_OPERAND (rhs, 0); 3088 rvalue = indirect; 3089 } 3090 3091 if (!POINTER_TYPE_P (type)) 3092 return NULL_TREE; 3093 3094 type = TREE_TYPE (type); 3095 3096 tree context = NULL_TREE; 3097 3098 /* Check alignment of the object. */ 3099 while (handled_component_p (rhs)) 3100 { 3101 if (TREE_CODE (rhs) == COMPONENT_REF) 3102 { 3103 tree field = TREE_OPERAND (rhs, 1); 3104 context = check_alignment_of_packed_member (type, field, rvalue); 3105 if (context) 3106 break; 3107 } 3108 if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE) 3109 rvalue = false; 3110 if (rvalue) 3111 return NULL_TREE; 3112 rhs = TREE_OPERAND (rhs, 0); 3113 } 3114 3115 return context; 3116 } 3117 3118 /* Check and warn if the right hand value, RHS, 3119 is an address which takes the unaligned address of packed member 3120 of struct or union when assigning to TYPE. */ 3121 3122 static void 3123 check_and_warn_address_of_packed_member (tree type, tree rhs) 3124 { 3125 bool nop_p = false; 3126 tree orig_rhs; 3127 3128 do 3129 { 3130 while (TREE_CODE (rhs) == COMPOUND_EXPR) 3131 rhs = TREE_OPERAND (rhs, 1); 3132 orig_rhs = rhs; 3133 STRIP_NOPS (rhs); 3134 nop_p |= orig_rhs != rhs; 3135 } 3136 while (orig_rhs != rhs); 3137 3138 if (TREE_CODE (rhs) == COND_EXPR) 3139 { 3140 /* Check the THEN path. */ 3141 check_and_warn_address_of_packed_member 3142 (type, TREE_OPERAND (rhs, 1)); 3143 3144 /* Check the ELSE path. */ 3145 check_and_warn_address_of_packed_member 3146 (type, TREE_OPERAND (rhs, 2)); 3147 } 3148 else 3149 { 3150 if (nop_p) 3151 { 3152 switch (TREE_CODE (rhs)) 3153 { 3154 case ADDR_EXPR: 3155 /* Address is taken. */ 3156 case PARM_DECL: 3157 case VAR_DECL: 3158 /* Pointer conversion. */ 3159 break; 3160 case CALL_EXPR: 3161 /* Function call. */ 3162 break; 3163 default: 3164 return; 3165 } 3166 } 3167 3168 tree context 3169 = check_address_of_packed_member (type, rhs); 3170 if (context) 3171 { 3172 location_t loc = EXPR_LOC_OR_LOC (rhs, input_location); 3173 warning_at (loc, OPT_Waddress_of_packed_member, 3174 "taking address of packed member of %qT may result " 3175 "in an unaligned pointer value", 3176 context); 3177 } 3178 } 3179 } 3180 3181 /* Warn if the right hand value, RHS, 3182 is an address which takes the unaligned address of packed member 3183 of struct or union when assigning to TYPE. */ 3184 3185 void 3186 warn_for_address_of_packed_member (tree type, tree rhs) 3187 { 3188 if (!warn_address_of_packed_member) 3189 return; 3190 3191 /* Don't warn if we don't assign RHS to a pointer. */ 3192 if (!POINTER_TYPE_P (type)) 3193 return; 3194 3195 check_and_warn_address_of_packed_member (type, rhs); 3196 } 3197 3198 /* Return EXPR + 1. Convenience helper used below. */ 3199 3200 static inline tree 3201 plus_one (tree expr) 3202 { 3203 tree type = TREE_TYPE (expr); 3204 return fold_build2 (PLUS_EXPR, type, expr, build_int_cst (type, 1)); 3205 } 3206 3207 /* Try to strip the expressions from around a VLA bound added internally 3208 to make it fit the domain mold, including any casts, and return 3209 the result. The goal is to obtain the PARM_DECL the VLA bound may 3210 refer to. */ 3211 3212 static tree 3213 vla_bound_parm_decl (tree expr) 3214 { 3215 if (!expr) 3216 return NULL_TREE; 3217 3218 if (TREE_CODE (expr) == NOP_EXPR) 3219 expr = TREE_OPERAND (expr, 0); 3220 if (TREE_CODE (expr) == PLUS_EXPR 3221 && integer_all_onesp (TREE_OPERAND (expr, 1))) 3222 { 3223 expr = TREE_OPERAND (expr, 0); 3224 if (TREE_CODE (expr) == NOP_EXPR) 3225 expr = TREE_OPERAND (expr, 0); 3226 } 3227 if (TREE_CODE (expr) == SAVE_EXPR) 3228 { 3229 expr = TREE_OPERAND (expr, 0); 3230 if (TREE_CODE (expr) == NOP_EXPR) 3231 expr = TREE_OPERAND (expr, 0); 3232 } 3233 return expr; 3234 } 3235 3236 /* Diagnose mismatches in VLA bounds between function parameters NEWPARMS 3237 of pointer types on a redeclaration of a function previously declared 3238 with CURPARMS at ORIGLOC. */ 3239 3240 static void 3241 warn_parm_ptrarray_mismatch (location_t origloc, tree curparms, tree newparms) 3242 { 3243 /* Maps each named integral parameter seen so far to its position 3244 in the argument list; used to associate VLA sizes with arguments. */ 3245 hash_map<tree, unsigned> curparm2pos; 3246 hash_map<tree, unsigned> newparm2pos; 3247 3248 unsigned parmpos = 1; 3249 for (tree curp = curparms, newp = newparms; curp && newp; 3250 curp = TREE_CHAIN (curp), newp = TREE_CHAIN (newp), ++parmpos) 3251 { 3252 tree curtyp = TREE_TYPE (curp), newtyp = TREE_TYPE (newp); 3253 if (INTEGRAL_TYPE_P (curtyp)) 3254 { 3255 /* Only add named parameters; unnamed ones cannot be referred 3256 to in VLA bounds. */ 3257 if (DECL_NAME (curp)) 3258 curparm2pos.put (curp, parmpos); 3259 if (DECL_NAME (newp)) 3260 newparm2pos.put (newp, parmpos); 3261 3262 continue; 3263 } 3264 3265 /* The parameter types should match at this point so only test one. */ 3266 if (TREE_CODE (curtyp) != POINTER_TYPE) 3267 continue; 3268 3269 do 3270 { 3271 curtyp = TREE_TYPE (curtyp); 3272 newtyp = TREE_TYPE (newtyp); 3273 3274 if (!newtyp) 3275 /* Bail on error. */ 3276 return; 3277 } 3278 while (TREE_CODE (curtyp) == POINTER_TYPE 3279 && TREE_CODE (newtyp) == POINTER_TYPE); 3280 3281 if (TREE_CODE (curtyp) != ARRAY_TYPE 3282 || TREE_CODE (newtyp) != ARRAY_TYPE) 3283 { 3284 if (curtyp == error_mark_node 3285 || newtyp == error_mark_node) 3286 /* Bail on error. */ 3287 return; 3288 3289 continue; 3290 } 3291 3292 tree curdom = TYPE_DOMAIN (curtyp), newdom = TYPE_DOMAIN (newtyp); 3293 tree curbnd = curdom ? TYPE_MAX_VALUE (curdom) : NULL_TREE; 3294 tree newbnd = newdom ? TYPE_MAX_VALUE (newdom) : NULL_TREE; 3295 3296 if (DECL_P (curp)) 3297 origloc = DECL_SOURCE_LOCATION (curp); 3298 else if (EXPR_P (curp) && EXPR_HAS_LOCATION (curp)) 3299 origloc = EXPR_LOCATION (curp); 3300 3301 /* The location of the parameter in the current redeclaration. */ 3302 location_t newloc = DECL_SOURCE_LOCATION (newp); 3303 if (origloc == UNKNOWN_LOCATION) 3304 origloc = newloc; 3305 3306 /* Issue -Warray-parameter unless one or more mismatches involves 3307 a VLA bound; then issue -Wvla-parameter. */ 3308 int opt = OPT_Warray_parameter_; 3309 /* Traverse the two array types looking for variable bounds and 3310 comparing the two in each pair for mismatches either in their 3311 positions in the function parameter list or lexicographically 3312 for others. Record the 1-based parameter position of each 3313 mismatch in BNDVEC, and the location of each parameter in 3314 the mismatch in WARNLOC (for the new parameter list) and 3315 NOTELOC (for the current parameter list). */ 3316 unsigned bndpos = 1; 3317 auto_vec<int> bndvec; 3318 gcc_rich_location warnloc (newloc); 3319 gcc_rich_location noteloc (origloc); 3320 for ( ; curtyp || newtyp; 3321 ++bndpos, 3322 curbnd = curdom ? TYPE_MAX_VALUE (curdom) : NULL_TREE, 3323 newbnd = newdom ? TYPE_MAX_VALUE (newdom) : NULL_TREE) 3324 { 3325 /* Try to strip each bound down to the PARM_DECL if it does 3326 correspond to one. Either bound can be null if it's 3327 unspecified (i.e., has the [*] form). */ 3328 curbnd = vla_bound_parm_decl (curbnd); 3329 newbnd = vla_bound_parm_decl (newbnd); 3330 3331 /* Peel the current bound off CURTYP and NEWTYP, skipping 3332 over any subsequent pointer types. */ 3333 if (curtyp && TREE_CODE (curtyp) == ARRAY_TYPE) 3334 { 3335 do 3336 curtyp = TREE_TYPE (curtyp); 3337 while (TREE_CODE (curtyp) == POINTER_TYPE); 3338 if (TREE_CODE (curtyp) == ARRAY_TYPE) 3339 curdom = TYPE_DOMAIN (curtyp); 3340 else 3341 curdom = NULL_TREE; 3342 } 3343 else 3344 curtyp = NULL_TREE; 3345 3346 if (newtyp && TREE_CODE (newtyp) == ARRAY_TYPE) 3347 { 3348 do 3349 newtyp = TREE_TYPE (newtyp); 3350 while (TREE_CODE (newtyp) == POINTER_TYPE); 3351 if (TREE_CODE (newtyp) == ARRAY_TYPE) 3352 newdom = TYPE_DOMAIN (newtyp); 3353 else 3354 newdom = NULL_TREE; 3355 } 3356 else 3357 newtyp = NULL_TREE; 3358 3359 /* Move on to the next bound if this one is unspecified. */ 3360 if (!curbnd && !newbnd) 3361 continue; 3362 3363 /* Try to find each bound in the parameter list. */ 3364 const unsigned* const pcurbndpos = curparm2pos.get (curbnd); 3365 const unsigned* const pnewbndpos = newparm2pos.get (newbnd); 3366 /* Move on if both bounds refer to the same parameter. */ 3367 if (pcurbndpos && pnewbndpos && *pcurbndpos == *pnewbndpos) 3368 continue; 3369 3370 /* Move on if the bounds look the same. */ 3371 if (!pcurbndpos && !pnewbndpos 3372 && curbnd && newbnd 3373 && operand_equal_p (curbnd, newbnd, 3374 OEP_DECL_NAME | OEP_LEXICOGRAPHIC)) 3375 continue; 3376 3377 if ((curbnd && TREE_CODE (curbnd) != INTEGER_CST) 3378 || (newbnd && TREE_CODE (newbnd) != INTEGER_CST)) 3379 opt = OPT_Wvla_parameter; 3380 3381 /* Record the mismatch. */ 3382 bndvec.safe_push (bndpos); 3383 /* Underline the bounding parameter in the declaration. */ 3384 if (curbnd && TREE_CODE (curbnd) == PARM_DECL) 3385 noteloc.add_range (DECL_SOURCE_LOCATION (curbnd)); 3386 if (newbnd && TREE_CODE (newbnd) == PARM_DECL) 3387 warnloc.add_range (DECL_SOURCE_LOCATION (newbnd)); 3388 } 3389 3390 const unsigned nbnds = bndvec.length (); 3391 if (!nbnds) 3392 continue; 3393 3394 /* Use attr_access to format the parameter types. */ 3395 attr_access spec = { }; 3396 const std::string newparmstr = spec.array_as_string (TREE_TYPE (newp)); 3397 const std::string curparmstr = spec.array_as_string (TREE_TYPE (curp)); 3398 3399 if (warning_n (&warnloc, opt, nbnds, 3400 "mismatch in bound %Z of argument %u declared as %s", 3401 "mismatch in bounds %Z of argument %u declared as %s", 3402 bndvec.address (), nbnds, parmpos, newparmstr.c_str ())) 3403 inform (¬eloc, "previously declared as %s", curparmstr.c_str ()); 3404 } 3405 } 3406 3407 /* Format EXPR if nonnull and return the formatted string. If EXPR is 3408 null return DFLT. */ 3409 3410 static inline const char* 3411 expr_to_str (pretty_printer &pp, tree expr, const char *dflt) 3412 { 3413 if (!expr) 3414 return dflt; 3415 3416 dump_generic_node (&pp, expr, 0, TDF_VOPS | TDF_MEMSYMS, false); 3417 return pp_formatted_text (&pp); 3418 } 3419 3420 /* Detect and diagnose a mismatch between an attribute access specification 3421 on the original declaration of FNDECL and that on the parameters NEWPARMS 3422 from its redeclaration. ORIGLOC is the location of the first declaration 3423 (FNDECL's is set to the location of the redeclaration). */ 3424 3425 void 3426 warn_parm_array_mismatch (location_t origloc, tree fndecl, tree newparms) 3427 { 3428 /* The original parameter list (copied from the original declaration 3429 into the current [re]declaration, FNDECL)). The two are equal if 3430 and only if FNDECL is the first declaration. */ 3431 tree curparms = DECL_ARGUMENTS (fndecl); 3432 if (!curparms || !newparms || curparms == newparms) 3433 return; 3434 3435 if (TREE_CODE (curparms) != PARM_DECL 3436 || TREE_CODE (newparms) != PARM_DECL) 3437 return; 3438 /* Extract the (possibly empty) attribute access specification from 3439 the declaration and its type (it doesn't yet reflect those created 3440 in response to NEWPARMS). */ 3441 rdwr_map cur_idx; 3442 tree fntype = TREE_TYPE (fndecl); 3443 init_attr_rdwr_indices (&cur_idx, TYPE_ATTRIBUTES (fntype)); 3444 3445 /* Build a (possibly null) chain of access attributes corresponding 3446 to NEWPARMS. */ 3447 const bool builtin = fndecl_built_in_p (fndecl); 3448 tree newattrs = build_attr_access_from_parms (newparms, builtin); 3449 3450 /* Extract the (possibly empty) attribute access specification from 3451 NEWATTRS. */ 3452 rdwr_map new_idx; 3453 init_attr_rdwr_indices (&new_idx, newattrs); 3454 3455 if (cur_idx.is_empty () && new_idx.is_empty ()) 3456 { 3457 /* If both specs are empty check pointers to VLAs for mismatches. */ 3458 warn_parm_ptrarray_mismatch (origloc, curparms, newparms); 3459 return; 3460 } 3461 /* ...otherwise, if at least one spec isn't empty there may be mismatches, 3462 such as between f(T*) and f(T[1]), where the former mapping would be 3463 empty. */ 3464 3465 /* Create an empty access specification and use it for pointers with 3466 no spec of their own. */ 3467 attr_access ptr_spec = { }; 3468 3469 /* Iterate over the two lists of function parameters, comparing their 3470 respective mappings and diagnosing mismatches. */ 3471 unsigned parmpos = 0; 3472 for (tree curp = curparms, newp = newparms; curp; 3473 curp = TREE_CHAIN (curp), newp = TREE_CHAIN (newp), ++parmpos) 3474 { 3475 if (!newp) 3476 /* Bail on invalid redeclarations with fewer arguments. */ 3477 return; 3478 3479 /* Only check pointers and C++ references. */ 3480 tree curptype = TREE_TYPE (curp); 3481 tree newptype = TREE_TYPE (newp); 3482 if (!POINTER_TYPE_P (curptype) || !POINTER_TYPE_P (newptype)) 3483 continue; 3484 3485 /* Skip mismatches in __builtin_va_list that is commonly 3486 an array but that in declarations of built-ins decays 3487 to a pointer. */ 3488 if (builtin && TREE_TYPE (newptype) == TREE_TYPE (va_list_type_node)) 3489 continue; 3490 3491 /* Access specs for the argument on the current (previous) and 3492 new (to replace the current) declarations. Either may be null, 3493 indicating the parameter is an ordinary pointer with no size 3494 associated with it. */ 3495 attr_access *cura = cur_idx.get (parmpos); 3496 attr_access *newa = new_idx.get (parmpos); 3497 3498 if (!newa) 3499 { 3500 /* Continue of both parameters are pointers with no size 3501 associated with it. */ 3502 if (!cura) 3503 continue; 3504 3505 /* Otherwise point at PTR_SPEC and set its parameter pointer 3506 and number. */ 3507 newa = &ptr_spec; 3508 newa->ptr = newp; 3509 newa->ptrarg = parmpos; 3510 } 3511 else if (!cura) 3512 { 3513 cura = &ptr_spec; 3514 cura->ptr = curp; 3515 cura->ptrarg = parmpos; 3516 } 3517 3518 /* Set if the parameter is [re]declared as a VLA. */ 3519 const bool cur_vla_p = cura->size || cura->minsize == HOST_WIDE_INT_M1U; 3520 const bool new_vla_p = newa->size || newa->minsize == HOST_WIDE_INT_M1U; 3521 3522 if (DECL_P (curp)) 3523 origloc = DECL_SOURCE_LOCATION (curp); 3524 else if (EXPR_P (curp) && EXPR_HAS_LOCATION (curp)) 3525 origloc = EXPR_LOCATION (curp); 3526 3527 /* The location of the parameter in the current redeclaration. */ 3528 location_t newloc = DECL_SOURCE_LOCATION (newp); 3529 if (origloc == UNKNOWN_LOCATION) 3530 origloc = newloc; 3531 3532 const std::string newparmstr = newa->array_as_string (newptype); 3533 const std::string curparmstr = cura->array_as_string (curptype); 3534 if (new_vla_p && !cur_vla_p) 3535 { 3536 if (warning_at (newloc, OPT_Wvla_parameter, 3537 "argument %u of type %s declared as " 3538 "a variable length array", 3539 parmpos + 1, newparmstr.c_str ())) 3540 inform (origloc, 3541 (cura == &ptr_spec 3542 ? G_("previously declared as a pointer %s") 3543 : G_("previously declared as an ordinary array %s")), 3544 curparmstr.c_str ()); 3545 continue; 3546 } 3547 3548 if (newa == &ptr_spec) 3549 { 3550 /* The new declaration uses the pointer form. Detect mismatches 3551 between the pointer and a previous array or VLA forms. */ 3552 if (cura->minsize == HOST_WIDE_INT_M1U) 3553 { 3554 /* Diagnose a pointer/VLA mismatch. */ 3555 if (warning_at (newloc, OPT_Wvla_parameter, 3556 "argument %u of type %s declared " 3557 "as a pointer", 3558 parmpos + 1, newparmstr.c_str ())) 3559 inform (origloc, 3560 "previously declared as a variable length array %s", 3561 curparmstr.c_str ()); 3562 continue; 3563 } 3564 3565 if (cura->minsize && cura->minsize != HOST_WIDE_INT_M1U) 3566 { 3567 /* Diagnose mismatches between arrays with a constant 3568 bound and pointers. */ 3569 if (warning_at (newloc, OPT_Warray_parameter_, 3570 "argument %u of type %s declared " 3571 "as a pointer", 3572 parmpos + 1, newparmstr.c_str ())) 3573 inform (origloc, "previously declared as an array %s", 3574 curparmstr.c_str ()); 3575 continue; 3576 } 3577 } 3578 3579 if (!new_vla_p && cur_vla_p) 3580 { 3581 if (warning_at (newloc, OPT_Wvla_parameter, 3582 "argument %u of type %s declared " 3583 "as an ordinary array", 3584 parmpos + 1, newparmstr.c_str ())) 3585 inform (origloc, 3586 "previously declared as a variable length array %s", 3587 curparmstr.c_str ()); 3588 continue; 3589 } 3590 3591 /* Move on to the next pair of parameters if both of the current 3592 pair are VLAs with a single variable bound that refers to 3593 a parameter at the same position. */ 3594 if (newa->size && cura->size 3595 && newa->sizarg != UINT_MAX 3596 && newa->sizarg == cura->sizarg 3597 && newa->minsize == cura->minsize 3598 && !TREE_PURPOSE (newa->size) && !TREE_PURPOSE (cura->size)) 3599 continue; 3600 3601 if (newa->size || cura->size) 3602 { 3603 unsigned newunspec, curunspec; 3604 unsigned newbnds = newa->vla_bounds (&newunspec) + newunspec; 3605 unsigned curbnds = cura->vla_bounds (&curunspec) + curunspec; 3606 3607 if (newbnds != curbnds) 3608 { 3609 if (warning_n (newloc, OPT_Wvla_parameter, newbnds, 3610 "argument %u of type %s declared with " 3611 "%u variable bound", 3612 "argument %u of type %s declared with " 3613 "%u variable bounds", 3614 parmpos + 1, newparmstr.c_str (), 3615 newbnds)) 3616 inform_n (origloc, curbnds, 3617 "previously declared as %s with %u variable bound", 3618 "previously declared as %s with %u variable bounds", 3619 curparmstr.c_str (), curbnds); 3620 continue; 3621 } 3622 3623 if (newunspec > curunspec) 3624 { 3625 location_t warnloc = newloc, noteloc = origloc; 3626 const char *warnparmstr = newparmstr.c_str (); 3627 const char *noteparmstr = curparmstr.c_str (); 3628 unsigned warnunspec = newunspec, noteunspec = curunspec; 3629 3630 if (warning_n (warnloc, OPT_Wvla_parameter, warnunspec, 3631 "argument %u of type %s declared with " 3632 "%u unspecified variable bound", 3633 "argument %u of type %s declared with " 3634 "%u unspecified variable bounds", 3635 parmpos + 1, warnparmstr, warnunspec)) 3636 { 3637 if (warnloc == newloc) 3638 inform_n (noteloc, noteunspec, 3639 "previously declared as %s with %u unspecified " 3640 "variable bound", 3641 "previously declared as %s with %u unspecified " 3642 "variable bounds", 3643 noteparmstr, noteunspec); 3644 else 3645 inform_n (noteloc, noteunspec, 3646 "subsequently declared as %s with %u unspecified " 3647 "variable bound", 3648 "subsequently declared as %s with %u unspecified " 3649 "variable bounds", 3650 noteparmstr, noteunspec); 3651 } 3652 continue; 3653 } 3654 } 3655 3656 /* Iterate over the lists of VLA variable bounds, comparing each 3657 pair for equality, and diagnosing mismatches. */ 3658 for (tree newvbl = newa->size, curvbl = cura->size; newvbl && curvbl; 3659 newvbl = TREE_CHAIN (newvbl), curvbl = TREE_CHAIN (curvbl)) 3660 { 3661 tree newpos = TREE_PURPOSE (newvbl); 3662 tree curpos = TREE_PURPOSE (curvbl); 3663 3664 tree newbnd = vla_bound_parm_decl (TREE_VALUE (newvbl)); 3665 tree curbnd = vla_bound_parm_decl (TREE_VALUE (curvbl)); 3666 3667 if (newpos == curpos && newbnd == curbnd) 3668 /* In the expected case when both bounds either refer to 3669 the same positional parameter or when neither does, 3670 and both are the same expression they are necessarily 3671 the same. */ 3672 continue; 3673 3674 pretty_printer pp1, pp2; 3675 const char* const newbndstr = expr_to_str (pp1, newbnd, "*"); 3676 const char* const curbndstr = expr_to_str (pp2, curbnd, "*"); 3677 3678 if (!newpos != !curpos 3679 || (newpos && !tree_int_cst_equal (newpos, curpos))) 3680 { 3681 /* Diagnose a mismatch between a specified VLA bound and 3682 an unspecified one. This can only happen in the most 3683 significant bound. 3684 3685 Distinguish between the common case of bounds that are 3686 other function parameters such as in 3687 f (int n, int[n]); 3688 and others. */ 3689 3690 gcc_rich_location richloc (newloc); 3691 bool warned; 3692 if (newpos) 3693 { 3694 /* Also underline the VLA bound argument. */ 3695 richloc.add_range (DECL_SOURCE_LOCATION (newbnd)); 3696 warned = warning_at (&richloc, OPT_Wvla_parameter, 3697 "argument %u of type %s declared " 3698 "with mismatched bound argument %E", 3699 parmpos + 1, newparmstr.c_str (), 3700 plus_one (newpos)); 3701 } 3702 else 3703 warned = warning_at (&richloc, OPT_Wvla_parameter, 3704 "argument %u of type %s declared " 3705 "with mismatched bound %<%s%>", 3706 parmpos + 1, newparmstr.c_str (), 3707 newbndstr); 3708 3709 if (warned) 3710 { 3711 gcc_rich_location richloc (origloc); 3712 if (curpos) 3713 { 3714 /* Also underline the VLA bound argument. */ 3715 richloc.add_range (DECL_SOURCE_LOCATION (curbnd)); 3716 inform (&richloc, "previously declared as %s with " 3717 "bound argument %E", 3718 curparmstr.c_str (), plus_one (curpos)); 3719 } 3720 else 3721 inform (&richloc, "previously declared as %s with bound " 3722 "%<%s%>", curparmstr.c_str (), curbndstr); 3723 3724 continue; 3725 } 3726 } 3727 3728 if (!newpos && newbnd && curbnd) 3729 { 3730 /* The VLA bounds don't refer to other function parameters. 3731 Compare them lexicographically to detect gross mismatches 3732 such as between T[foo()] and T[bar()]. */ 3733 if (operand_equal_p (newbnd, curbnd, 3734 OEP_DECL_NAME | OEP_LEXICOGRAPHIC)) 3735 continue; 3736 3737 if (warning_at (newloc, OPT_Wvla_parameter, 3738 "argument %u of type %s declared with " 3739 "mismatched bound %<%s%>", 3740 parmpos + 1, newparmstr.c_str (), newbndstr)) 3741 inform (origloc, "previously declared as %s with bound %qs", 3742 curparmstr.c_str (), curbndstr); 3743 continue; 3744 } 3745 } 3746 3747 if (newa->minsize == cura->minsize 3748 || (((newa->minsize == 0 && newa->mode != access_deferred) 3749 || (cura->minsize == 0 && cura->mode != access_deferred)) 3750 && newa != &ptr_spec 3751 && cura != &ptr_spec)) 3752 continue; 3753 3754 if (!newa->static_p && !cura->static_p && warn_array_parameter < 2) 3755 /* Avoid warning about mismatches in ordinary (non-static) arrays 3756 at levels below 2. */ 3757 continue; 3758 3759 if (warning_at (newloc, OPT_Warray_parameter_, 3760 "argument %u of type %s with mismatched bound", 3761 parmpos + 1, newparmstr.c_str ())) 3762 inform (origloc, "previously declared as %s", curparmstr.c_str ()); 3763 } 3764 } 3765 3766 /* Warn about divisions of two sizeof operators when the first one is applied 3767 to an array and the divisor does not equal the size of the array element. 3768 For instance: 3769 3770 sizeof (ARR) / sizeof (OP) 3771 3772 ARR is the array argument of the first sizeof, ARR_TYPE is its ARRAY_TYPE. 3773 OP1 is the whole second SIZEOF_EXPR, or its argument; TYPE1 is the type 3774 of the second argument. */ 3775 3776 void 3777 maybe_warn_sizeof_array_div (location_t loc, tree arr, tree arr_type, 3778 tree op1, tree type1) 3779 { 3780 tree elt_type = TREE_TYPE (arr_type); 3781 3782 if (!warn_sizeof_array_div 3783 /* Don't warn on multidimensional arrays. */ 3784 || TREE_CODE (elt_type) == ARRAY_TYPE) 3785 return; 3786 3787 if (!tree_int_cst_equal (TYPE_SIZE (elt_type), TYPE_SIZE (type1))) 3788 { 3789 auto_diagnostic_group d; 3790 if (warning_at (loc, OPT_Wsizeof_array_div, 3791 "expression does not compute the number of " 3792 "elements in this array; element type is " 3793 "%qT, not %qT", elt_type, type1)) 3794 { 3795 if (EXPR_HAS_LOCATION (op1)) 3796 { 3797 location_t op1_loc = EXPR_LOCATION (op1); 3798 gcc_rich_location richloc (op1_loc); 3799 richloc.add_fixit_insert_before (op1_loc, "("); 3800 richloc.add_fixit_insert_after (op1_loc, ")"); 3801 inform (&richloc, "add parentheses around %qE to " 3802 "silence this warning", op1); 3803 } 3804 else 3805 inform (loc, "add parentheses around the second %<sizeof%> " 3806 "to silence this warning"); 3807 if (DECL_P (arr)) 3808 inform (DECL_SOURCE_LOCATION (arr), "array %qD declared here", arr); 3809 } 3810 } 3811 } 3812 3813 /* Warn about C++20 [depr.array.comp] array comparisons: "Equality 3814 and relational comparisons between two operands of array type are 3815 deprecated." We also warn in C and earlier C++ standards. CODE is 3816 the code for this comparison, OP0 and OP1 are the operands. */ 3817 3818 void 3819 do_warn_array_compare (location_t location, tree_code code, tree op0, tree op1) 3820 { 3821 STRIP_NOPS (op0); 3822 STRIP_NOPS (op1); 3823 if (TREE_CODE (op0) == ADDR_EXPR) 3824 op0 = TREE_OPERAND (op0, 0); 3825 if (TREE_CODE (op1) == ADDR_EXPR) 3826 op1 = TREE_OPERAND (op1, 0); 3827 3828 auto_diagnostic_group d; 3829 if (warning_at (location, OPT_Warray_compare, 3830 (c_dialect_cxx () && cxx_dialect >= cxx20) 3831 ? G_("comparison between two arrays is deprecated in C++20") 3832 : G_("comparison between two arrays"))) 3833 { 3834 /* C doesn't allow +arr. */ 3835 if (c_dialect_cxx ()) 3836 inform (location, "use unary %<+%> which decays operands to pointers " 3837 "or %<&%s%E%s[0] %s &%s%E%s[0]%> to compare the addresses", 3838 DECL_P (op0) ? "" : "(", op0, DECL_P (op0) ? "" : ")", 3839 op_symbol_code (code), 3840 DECL_P (op1) ? "" : "(", op1, DECL_P (op1) ? "" : ")"); 3841 else 3842 inform (location, 3843 "use %<&%s%E%s[0] %s &%s%E%s[0]%> to compare the addresses", 3844 DECL_P (op0) ? "" : "(", op0, DECL_P (op0) ? "" : ")", 3845 op_symbol_code (code), 3846 DECL_P (op1) ? "" : "(", op1, DECL_P (op1) ? "" : ")"); 3847 } 3848 } 3849 3850 /* Given LHS_VAL ^ RHS_VAL, where LHS_LOC is the location of the LHS, 3851 OPERATOR_LOC is the location of the ^, and RHS_LOC the location of the 3852 RHS, complain with -Wxor-used-as-pow if it looks like the user meant 3853 exponentiation rather than xor. */ 3854 3855 void 3856 check_for_xor_used_as_pow (location_t lhs_loc, tree lhs_val, 3857 location_t operator_loc, 3858 location_t rhs_loc, tree rhs_val) 3859 { 3860 /* Only complain if both args are non-negative integer constants that fit 3861 in uhwi. */ 3862 if (!tree_fits_uhwi_p (lhs_val) || !tree_fits_uhwi_p (rhs_val)) 3863 return; 3864 3865 /* Only complain if the LHS is 2 or 10. */ 3866 unsigned HOST_WIDE_INT lhs_uhwi = tree_to_uhwi (lhs_val); 3867 if (lhs_uhwi != 2 && lhs_uhwi != 10) 3868 return; 3869 3870 unsigned HOST_WIDE_INT rhs_uhwi = tree_to_uhwi (rhs_val); 3871 unsigned HOST_WIDE_INT xor_result = lhs_uhwi ^ rhs_uhwi; 3872 binary_op_rich_location loc (operator_loc, 3873 lhs_val, rhs_val, false); 3874 3875 /* Reject cases where we don't have 3 distinct locations. 3876 This can happen e.g. due to macro expansion with 3877 -ftrack-macro-expansion=0 */ 3878 if (!(lhs_loc != operator_loc 3879 && lhs_loc != rhs_loc 3880 && operator_loc != rhs_loc)) 3881 return; 3882 3883 /* Reject cases in which any of the locations came from a macro. */ 3884 if (from_macro_expansion_at (lhs_loc) 3885 || from_macro_expansion_at (operator_loc) 3886 || from_macro_expansion_at (rhs_loc)) 3887 return; 3888 3889 /* If we issue fix-it hints with the warning then we will also issue a 3890 note suggesting how to suppress the warning with a different change. 3891 These proposed changes are incompatible. */ 3892 loc.fixits_cannot_be_auto_applied (); 3893 3894 auto_diagnostic_group d; 3895 bool warned = false; 3896 if (lhs_uhwi == 2) 3897 { 3898 /* Would exponentiation fit in int, in long long, or not at all? */ 3899 if (rhs_uhwi < (INT_TYPE_SIZE - 1)) 3900 { 3901 unsigned HOST_WIDE_INT suggested_result = 1 << rhs_uhwi; 3902 loc.add_fixit_replace (lhs_loc, "1"); 3903 loc.add_fixit_replace (operator_loc, "<<"); 3904 warned = warning_at (&loc, OPT_Wxor_used_as_pow, 3905 "result of %<%wu^%wu%> is %wu;" 3906 " did you mean %<1 << %wu%> (%wu)?", 3907 lhs_uhwi, rhs_uhwi, xor_result, 3908 rhs_uhwi, suggested_result); 3909 } 3910 else if (rhs_uhwi < (LONG_LONG_TYPE_SIZE - 1)) 3911 { 3912 loc.add_fixit_replace (lhs_loc, "1LL"); 3913 loc.add_fixit_replace (operator_loc, "<<"); 3914 warned = warning_at (&loc, OPT_Wxor_used_as_pow, 3915 "result of %<%wu^%wu%> is %wu;" 3916 " did you mean %<1LL << %wu%>?", 3917 lhs_uhwi, rhs_uhwi, xor_result, 3918 rhs_uhwi); 3919 } 3920 else if (rhs_uhwi <= LONG_LONG_TYPE_SIZE) 3921 warned = warning_at (&loc, OPT_Wxor_used_as_pow, 3922 "result of %<%wu^%wu%> is %wu;" 3923 " did you mean exponentiation?", 3924 lhs_uhwi, rhs_uhwi, xor_result); 3925 /* Otherwise assume it's an xor. */ 3926 } 3927 else 3928 { 3929 gcc_assert (lhs_uhwi == 10); 3930 loc.add_fixit_replace (lhs_loc, "1"); 3931 loc.add_fixit_replace (operator_loc, "e"); 3932 warned = warning_at (&loc, OPT_Wxor_used_as_pow, 3933 "result of %<%wu^%wu%> is %wu;" 3934 " did you mean %<1e%wu%>?", 3935 lhs_uhwi, rhs_uhwi, xor_result, 3936 rhs_uhwi); 3937 } 3938 if (warned) 3939 { 3940 gcc_rich_location note_loc (lhs_loc); 3941 if (lhs_uhwi == 2) 3942 note_loc.add_fixit_replace (lhs_loc, "0x2"); 3943 else 3944 { 3945 gcc_assert (lhs_uhwi == 10); 3946 note_loc.add_fixit_replace (lhs_loc, "0xa"); 3947 } 3948 note_loc.fixits_cannot_be_auto_applied (); 3949 inform (¬e_loc, 3950 "you can silence this warning by using a hexadecimal constant" 3951 " (%wx rather than %wd)", 3952 lhs_uhwi, lhs_uhwi); 3953 } 3954 } 3955