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