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
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
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
23 #include "coretypes.h"
30 #include "diagnostic.h"
32 #include "stringpool.h"
35 #include "c-family/c-type-mismatch.h"
37 #include "c-family/c-indentation.h"
38 #include "c-family/c-spellcheck.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. */
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. */
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. */
89 overflow_warning (location_t loc
, tree value
, tree expr
)
91 if (c_inhibit_evaluation_warnings
!= 0)
94 const char *warnfmt
= NULL
;
96 switch (TREE_CODE (value
))
100 ? G_("integer overflow in expression %qE of type %qT "
102 : G_("integer overflow in expression of type %qT "
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 "
116 ? G_("fixed-point overflow in expression %qE of type %qT "
118 : G_("fixed-point overflow in expression of type %qT "
124 ? G_("vector overflow in expression %qE of type %qT "
126 : G_("vector overflow in expression of type %qT "
131 if (TREE_CODE (TREE_REALPART (value
)) == INTEGER_CST
)
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 "
137 else if (TREE_CODE (TREE_REALPART (value
)) == REAL_CST
)
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"));
153 warned
= warning_at (loc
, OPT_Woverflow
, warnfmt
, expr
, TREE_TYPE (expr
),
156 warned
= warning_at (loc
, OPT_Woverflow
, warnfmt
, TREE_TYPE (value
),
160 suppress_warning (value
, OPT_Woverflow
);
163 /* Helper function for walk_tree. Unwrap C_MAYBE_CONST_EXPRs in an expression
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;
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. */
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
)
197 if (code
!= TRUTH_ANDIF_EXPR
198 && code
!= TRUTH_AND_EXPR
199 && code
!= TRUTH_ORIF_EXPR
200 && code
!= TRUTH_OR_EXPR
)
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;
206 if (from_macro_expansion_at (EXPR_LOCATION (op_left
))
207 || from_macro_expansion_at (EXPR_LOCATION (op_right
)))
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
))
232 = warning_at (location
, OPT_Wlogical_op
,
233 "logical %<or%> applied to non-boolean constant");
236 = warning_at (location
, OPT_Wlogical_op
,
237 "logical %<and%> applied to non-boolean constant");
239 suppress_warning (op_left
, OPT_Wlogical_op
);
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
)))
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
))))
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
)))
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
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
);
271 /* If this is an OR operation, invert both sides; now, the result
272 should be always false to get a warning. */
276 tem
= build_range_check (UNKNOWN_LOCATION
, type
, lhs
, in0_p
, low0
, high0
);
277 if (tem
&& integer_zerop (tem
))
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
);
286 /* If this is an OR operation, invert both sides; now, the result
287 should be always false to get a warning. */
291 tem
= build_range_check (UNKNOWN_LOCATION
, type
, rhs
, in1_p
, low1
, high1
);
292 if (tem
&& integer_zerop (tem
))
295 /* If both expressions have the same operand, if we can merge the
297 if (operand_equal_p (lhs
, rhs
, 0)
298 && merge_ranges (&in_p
, &low
, &high
, in0_p
, low0
, high0
,
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
))
306 warning_at (location
, OPT_Wlogical_op
,
307 "logical %<or%> of collectively exhaustive tests is "
310 warning_at (location
, OPT_Wlogical_op
,
311 "logical %<and%> of mutually exclusive tests is "
314 /* Or warn if the operands have exactly the same range, e.g.
316 else if (tree_int_cst_equal (low0
, low1
)
317 && tree_int_cst_equal (high0
, high1
))
320 warning_at (location
, OPT_Wlogical_op
,
321 "logical %<or%> of equal expressions");
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. */
333 find_array_ref_with_const_idx_r (tree
*expr_p
, int *, void *)
337 if ((TREE_CODE (expr
) == ARRAY_REF
338 || TREE_CODE (expr
) == ARRAY_RANGE_REF
)
339 && (TREE_CODE (fold_for_warn (TREE_OPERAND (expr
, 1)))
341 return integer_type_node
;
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. */
352 warn_tautological_bitwise_comparison (const op_location_t
&loc
, tree_code code
,
355 if (code
!= EQ_EXPR
&& code
!= NE_EXPR
)
358 /* Extract the operands from e.g. (x & 8) == 4. */
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
;
375 tree bitop_op0
= fold_for_warn (TREE_OPERAND (bitop
, 0));
376 if (TREE_CODE (bitop_op0
) == INTEGER_CST
)
377 bitopcst
= bitop_op0
;
379 tree bitop_op1
= fold_for_warn (TREE_OPERAND (bitop
, 1));
380 if (TREE_CODE (bitop_op1
) == INTEGER_CST
)
381 bitopcst
= bitop_op1
;
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
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
);
397 if (TREE_CODE (bitop
) == BIT_AND_EXPR
)
398 res
= bitopcstw
& cstw
;
400 res
= bitopcstw
| cstw
;
402 /* For BIT_AND only warn if (CST2 & CST1) != CST1, and
403 for BIT_OR only if (CST2 | CST1) != CST1. */
407 binary_op_rich_location
richloc (loc
, lhs
, rhs
, false);
409 warning_at (&richloc
, OPT_Wtautological_compare
,
410 "bitwise comparison always evaluates to false");
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
));
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. */
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
))
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. */
460 warn_tautological_cmp (const op_location_t
&loc
, enum tree_code code
,
463 if (TREE_CODE_CLASS (code
) != tcc_comparison
)
466 /* Don't warn for various macro expansions. */
467 if (from_macro_expansion_at (loc
))
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
))
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
)))
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
)))
490 /* Don't warn for e.g.
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
))
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
502 if (FLOAT_TYPE_P (TREE_TYPE (lhs
)) || FLOAT_TYPE_P (TREE_TYPE (rhs
)))
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
,
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);
517 warning_at (&richloc
, OPT_Wtautological_compare
,
518 "self-comparison always evaluates to true");
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. */
528 expr_has_boolean_operands_p (tree 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
))
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
551 warn_logical_not_parentheses (location_t location
, enum tree_code code
,
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
)))
560 /* Don't warn for expression like !x == ~(bool1 | bool2). */
561 if (expr_has_boolean_operands_p (rhs
))
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
))
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 "
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. */
590 warn_if_unused_value (const_tree exp
, location_t locus
, bool quiet
)
593 if (TREE_USED (exp
) || warning_suppressed_p (exp
, OPT_Wunused_value
))
596 /* Don't warn about void constructs. This includes casting to void,
597 void function calls, and statement expressions with a final cast
599 if (VOID_TYPE_P (TREE_TYPE (exp
)))
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
:
621 /* For a binding, warn if no side effect within it. */
622 exp
= BIND_EXPR_BODY (exp
);
626 case NON_LVALUE_EXPR
:
628 exp
= TREE_OPERAND (exp
, 0);
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);
638 if (warn_if_unused_value (TREE_OPERAND (exp
, 0), locus
, quiet
))
640 /* Let people do `(foo (), 0)' without a warning. */
641 if (TREE_CONSTANT (TREE_OPERAND (exp
, 1)))
643 exp
= TREE_OPERAND (exp
, 1);
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
))
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))
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);
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
))
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)
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
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. */
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
))
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");
729 /* warn_strict_aliasing >= 3. This includes the default (3).
730 Only warn if the cast is dereferenced immediately. */
732 = get_alias_set (TREE_TYPE (TREE_OPERAND (expr
, 0)));
733 alias_set_type set2
= get_alias_set (TREE_TYPE (type
));
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");
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");
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");
776 /* Warn about memset (&a, 0, sizeof (&a)); and similar mistakes with
777 sizeof as last operand of certain builtins. */
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;
789 if (TREE_CODE (callee
) != FUNCTION_DECL
790 || !fndecl_built_in_p (callee
, BUILT_IN_NORMAL
)
791 || vec_safe_length (params
) <= 1)
794 enum built_in_function fncode
= DECL_FUNCTION_CODE (callee
);
797 case BUILT_IN_STRNCMP
:
798 case BUILT_IN_STRNCASECMP
:
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
:
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)
820 if (params
->length () < 3)
826 case BUILT_IN_MEMCMP
:
828 if (params
->length () < 3)
835 case BUILT_IN_MEMSET
:
836 case BUILT_IN_MEMSET_CHK
:
837 if (params
->length () < 3)
846 case BUILT_IN_STRNDUP
:
851 case BUILT_IN_MEMCHR
:
852 if (params
->length () < 3)
857 case BUILT_IN_SNPRINTF
:
858 case BUILT_IN_SNPRINTF_CHK
:
859 case BUILT_IN_VSNPRINTF
:
860 case BUILT_IN_VSNPRINTF_CHK
:
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
)
877 || error_operand_p (sizeof_arg
[idx
]))
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. */
899 if (get_attr_nonstring_decl (tem
, &dummy
))
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
));
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?",
924 && (tem
= tree_strip_nop_conversions (dest
))
925 && POINTER_TYPE_P (TREE_TYPE (tem
))
926 && comp_types (TREE_TYPE (TREE_TYPE (tem
)), type
))
930 && (tem
= tree_strip_nop_conversions (src
))
931 && POINTER_TYPE_P (TREE_TYPE (tem
))
932 && comp_types (TREE_TYPE (TREE_TYPE (tem
)), type
))
935 loc
= sizeof_arg_loc
[idx
];
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
)))
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
);
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
);
964 if (POINTER_TYPE_P (TREE_TYPE (dest
))
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
)));
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
)))
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
);
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
);
1005 if (POINTER_TYPE_P (TREE_TYPE (src
))
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
)));
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
)))
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
);
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
);
1046 if (POINTER_TYPE_P (TREE_TYPE (dest
))
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
)));
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
)))
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
);
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
);
1087 if (POINTER_TYPE_P (TREE_TYPE (src
))
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
)));
1103 /* Warn for unlikely, improbable, or stupid DECL declarations
1107 check_main_parameter_types (tree decl
)
1109 function_args_iterator iter
;
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
)
1120 if (TYPE_ATOMIC (t
))
1121 pedwarn (input_location
, OPT_Wmain
,
1122 "%<_Atomic%>-qualified parameter type %qT of %q+D",
1124 while (POINTER_TYPE_P (t
))
1127 if (TYPE_ATOMIC (t
))
1128 pedwarn (input_location
, OPT_Wmain
,
1129 "%<_Atomic%>-qualified parameter type %qT of %q+D",
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
);
1143 if (TREE_CODE (type
) != POINTER_TYPE
1144 || TREE_CODE (TREE_TYPE (type
)) != POINTER_TYPE
1145 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type
)))
1147 pedwarn (input_location
, OPT_Wmain
,
1148 "second argument of %q+D should be %<char **%>", decl
);
1152 if (TREE_CODE (type
) != POINTER_TYPE
1153 || TREE_CODE (TREE_TYPE (type
)) != POINTER_TYPE
1154 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type
)))
1156 pedwarn (input_location
, OPT_Wmain
,
1157 "third argument of %q+D should probably be "
1158 "%<char **%>", decl
);
1163 /* It is intentional that this message does not mention the third
1164 argument because it's only mentioned in an appendix of the
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. */
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
;
1185 if (!warn_conversion
&& !warn_sign_conversion
&& !warn_float_conversion
)
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
))
1204 case TRUTH_ANDIF_EXPR
:
1205 case TRUTH_ORIF_EXPR
:
1206 case TRUTH_AND_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
);
1222 conversion_kind
= unsafe_conversion_p (type
, expr
, result
, true);
1224 if (conversion_kind
== UNSAFE_REAL
)
1225 warnopt
= OPT_Wfloat_conversion
;
1226 else if (conversion_kind
)
1227 warnopt
= OPT_Wconversion
;
1231 if (conversion_kind
== UNSAFE_SIGN
)
1235 && CONSTANT_CLASS_P (result
));
1236 if (TYPE_UNSIGNED (type
))
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
);
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
);
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
);
1257 warning_at (loc
, OPT_Wsign_conversion
,
1258 "signed conversion from %qT to %qT changes "
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
);
1268 warning_at (loc
, warnopt
,
1269 "conversion from %qT to %qT changes the value of %qE",
1270 expr_type
, type
, expr
);
1279 case TRUNC_MOD_EXPR
:
1280 case FLOOR_MOD_EXPR
:
1281 case TRUNC_DIV_EXPR
:
1282 case FLOOR_DIV_EXPR
:
1284 case EXACT_DIV_EXPR
:
1289 case PREDECREMENT_EXPR
:
1290 case PREINCREMENT_EXPR
:
1291 case POSTDECREMENT_EXPR
:
1292 case POSTINCREMENT_EXPR
:
1295 case FIX_TRUNC_EXPR
:
1296 case NON_LVALUE_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
));
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
)
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
)))
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
))
1339 return (conversion_warning (loc
, type
, TREE_OPERAND (expr
, 0), result
)
1340 || conversion_warning (loc
, type
, TREE_OPERAND (expr
, 1),
1345 conversion_kind
= unsafe_conversion_p (type
, expr
, result
, true);
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
;
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))
1373 /* The operands seem safe, we might still want to warn if
1374 -Warith-conversion. */
1375 warnopt
= OPT_Warith_conversion
;
1379 if (conversion_kind
== UNSAFE_SIGN
)
1380 warning_at (loc
, warnopt
, "conversion to %qT from %qT "
1381 "may change the sign of the result",
1383 else if (conversion_kind
== UNSAFE_IMAGINARY
)
1384 warning_at (loc
, warnopt
,
1385 "conversion from %qT to %qT discards imaginary component",
1388 warning_at (loc
, warnopt
,
1389 "conversion from %qT to %qT may change value",
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. */
1402 warnings_for_convert_and_check (location_t loc
, tree type
, tree expr
,
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
);
1415 /* We're interested in the actual numerical value here, not its ASCII
1417 if (cst
&& TYPE_MAIN_VARIANT (TREE_TYPE (result
)) == char_type_node
)
1418 result_diag
= fold_convert (integer_type_node
, result
);
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
1438 if (!int_fits_type_p (expr
, c_common_signed_type (type
)))
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
);
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
);
1458 conversion_warning (loc
, type
, expr
, result
);
1460 else if (!int_fits_type_p (expr
, c_common_unsigned_type (type
)))
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
);
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. */
1475 && ((TREE_CODE (exprtype
) != INTEGER_TYPE
1476 && TREE_CODE (exprtype
) != BITINT_TYPE
)
1477 || (TYPE_PRECISION (exprtype
)
1478 != TYPE_PRECISION (type
))))
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
);
1486 warning_at (loc
, OPT_Woverflow
,
1487 "overflow in conversion from %qT to %qT "
1488 "changes the value of %qE",
1489 exprtype
, type
, expr
);
1492 conversion_warning (loc
, type
, expr
, result
);
1494 else if ((TREE_CODE (result
) == INTEGER_CST
1495 || TREE_CODE (result
) == FIXED_CST
) && TREE_OVERFLOW (result
))
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
);
1503 warning_at (loc
, OPT_Woverflow
,
1504 "overflow in conversion from %qT to %qT "
1505 "changes the value of %qE",
1506 exprtype
, type
, expr
);
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. */
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
)
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
);
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",
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",
1545 /* Subroutine of c_do_switch_warnings, called via splay_tree_foreach.
1546 Used to verify that case values match up with enumerator values. */
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
))
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
);
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
);
1573 CASE_HIGH_SEEN (label
) = 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. */
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
;
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
),
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"
1623 CASE_LOW ((tree
) node
->value
) = convert (TREE_TYPE (cond
),
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
)
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
);
1641 node
= splay_tree_lookup (cases
, (splay_tree_key
) max_value
);
1643 node
= splay_tree_predecessor (cases
, (splay_tree_key
) max_value
);
1644 /* Handle a single node that might partially overlap the range. */
1647 && CASE_HIGH ((tree
) node
->value
)
1648 && tree_int_cst_compare (CASE_HIGH ((tree
) node
->value
),
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
))
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
)
1675 default_node
= splay_tree_lookup (cases
, (splay_tree_key
) NULL
);
1677 warning_at (switch_location
, OPT_Wswitch_default
,
1678 "switch missing default case");
1680 /* There are certain cases where -Wswitch-bool warnings aren't
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). */
1694 min_node
= splay_tree_successor (cases
, (splay_tree_key
) NULL
);
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
;
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
1709 || (max
&& wi::gts_p (wi::to_wide (max
), 1))
1710 || (min
&& wi::lts_p (wi::to_wide (min
), 0))
1718 case, where we want to warn. */
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
)
1730 /* From here on, we only care about -Wswitch and -Wswitch-enum. */
1731 if (!warn_switch_enum
&& !warn_switch
)
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
)
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
);
1757 /* Mark the CASE_LOW part of the case entry as seen. */
1758 tree label
= (tree
) node
->value
;
1759 CASE_LOW_SEEN (label
) = 1;
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
);
1772 /* If we match the upper bound exactly, mark the CASE_HIGH
1773 part of the case entry as seen. */
1775 CASE_HIGH_SEEN (label
) = 1;
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
))
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
))
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
))))
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
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
)))
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. */
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. */
1852 readonly_error (location_t loc
, tree arg
, enum lvalue_use use
)
1854 gcc_assert (use
== lv_assign
|| use
== lv_increment
|| use
== lv_decrement
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
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));
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")),
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")),
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"),
1900 "read-only named return value %qD"),
1902 "read-only named return value %qD"),
1903 G_("read-only named return value %qD "
1904 "used as %<asm%>output")),
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")),
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")),
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. */
1926 lvalue_error (location_t loc
, enum lvalue_use use
)
1931 error_at (loc
, "lvalue required as left operand of assignment");
1934 error_at (loc
, "lvalue required as increment operand");
1937 error_at (loc
, "lvalue required as decrement operand");
1940 error_at (loc
, "lvalue required as unary %<&%> operand");
1943 error_at (loc
, "lvalue required in %<asm%> statement");
1950 /* Print an error message for an invalid indirection of type TYPE.
1951 ERRSTRING is the name of the operator for the indirection. */
1954 invalid_indirection_error (location_t loc
, tree type
, ref_operator errstring
)
1959 gcc_assert (c_dialect_cxx ());
1960 error_at (loc
, "invalid type argument (have %qT)", type
);
1962 case RO_ARRAY_INDEXING
:
1964 "invalid type argument of array indexing (have %qT)",
1969 "invalid type argument of unary %<*%> (have %qT)",
1974 "invalid type argument of %<->%> (have %qT)",
1979 "invalid type argument of %<->*%> (have %qT)",
1982 case RO_IMPLICIT_CONVERSION
:
1984 "invalid type argument of implicit conversion (have %qT)",
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. */
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. */
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
)
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))))
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 %<<<%>");
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 %<>>%>");
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 %<||%>");
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 %<~%>");
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 %<^%>");
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 %<~%>");
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 %<==%>");
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 %<!=%>");
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");
2190 /* If LABEL (a LABEL_DECL) has not been used, issue a warning. */
2193 warn_for_unused_label (tree label
)
2195 if (!TREE_USED (label
))
2197 if (warning_suppressed_p (label
, OPT_Wunused_label
))
2199 else if (DECL_INITIAL (label
))
2200 warning (OPT_Wunused_label
, "label %q+D defined but not used", label
);
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. */
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. */
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 "
2249 if (warn_memset_elt_size
&& TREE_CODE (arg2
) == INTEGER_CST
)
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
,
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 "
2276 /* Warn for calloc (sizeof (X), n). */
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
)))
2285 int arg1
= TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr
))) - 1;
2287 = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (TREE_VALUE (attr
)))) - 1;
2289 || (unsigned) arg1
>= vec_safe_length (params
)
2292 || (unsigned) arg2
>= vec_safe_length (params
)
2297 if (sizeof_arg
[arg1
] == NULL_TREE
|| sizeof_arg
[arg2
] != NULL_TREE
)
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). */
2311 warn_for_alloc_size (location_t loc
, tree type
, tree call
, tree alloc_size
)
2313 if (!TREE_VALUE (alloc_size
))
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
))
2320 arg1
= CALL_EXPR_ARG (call
, idx1
);
2321 if (TREE_CODE (arg1
) != INTEGER_CST
)
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
))
2329 arg2
= CALL_EXPR_ARG (call
, idx2
);
2330 if (TREE_CODE (arg2
) != INTEGER_CST
)
2332 arg1
= int_const_binop (MULT_EXPR
, fold_convert (sizetype
, arg1
),
2333 fold_convert (sizetype
, arg2
));
2334 if (TREE_CODE (arg1
) != INTEGER_CST
)
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. */
2358 warn_for_sign_compare (location_t location
,
2359 tree orig_op0
, tree orig_op1
,
2361 tree result_type
, enum tree_code resultcode
)
2363 if (error_operand_p (orig_op0
) || error_operand_p (orig_op1
))
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
))
2375 /* Do not warn if both operands are unsigned. */
2376 else if (op0_signed
== op1_signed
)
2380 tree sop
, uop
, base_type
;
2384 sop
= orig_op0
, uop
= orig_op1
;
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
))
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
)))
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
)))
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
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
));
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
));
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
);
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
));
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
)
2492 warning_at (location
, OPT_Wsign_compare
,
2493 "promoted bitwise complement of an unsigned "
2494 "value is always nonzero");
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
)))
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. */
2522 do_warn_double_promotion (tree result_type
, tree type1
, tree type2
,
2523 const char *gmsgid
, location_t loc
)
2527 if (!warn_double_promotion
)
2529 /* If the conversion will not occur at run-time, there is no need to
2531 if (c_inhibit_evaluation_warnings
)
2533 /* If an invalid conversion has occurred, don't warn. */
2534 if (result_type
== error_mark_node
)
2536 if (TYPE_MAIN_VARIANT (result_type
) != double_type_node
2537 && TYPE_MAIN_VARIANT (result_type
) != complex_double_type_node
)
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
;
2547 warning_at (loc
, OPT_Wdouble_promotion
, gmsgid
, source_type
, result_type
);
2550 /* Possibly warn about unused parameters. */
2553 do_warn_unused_parameter (tree fn
)
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. */
2570 record_locally_defined_typedef (tree decl
)
2572 struct c_language_function
*l
;
2574 if (!warn_unused_local_typedefs
2576 /* if this is not a locally defined typedef then we are not
2578 || !is_typedef_decl (decl
)
2579 || !decl_function_context (decl
))
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. */
2589 maybe_record_typedef_use (tree t
)
2591 if (!is_typedef_decl (t
))
2594 TREE_USED (t
) = true;
2597 /* Warn if there are some unused locally defined typedefs in the
2598 current function. */
2601 maybe_warn_unused_local_typedefs (void)
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
;
2615 if ((l
= (struct c_language_function
*) cfun
->language
) == NULL
)
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
2638 warn_duplicated_cond_add_or_warn (location_t loc
, tree cond
, vec
<tree
> **chain
)
2640 /* No chain has been created yet. Do nothing. */
2644 if (TREE_SIDE_EFFECTS (cond
) || instantiation_dependent_expression_p (cond
))
2646 /* Uh-oh! This condition has a side-effect, thus invalidates
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");
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. */
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. */
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",
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
);
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
2715 LOC is a location of the shift; OP0 and OP1 are the operands.
2716 Return true if an overflow is detected, false otherwise. */
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
)
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
)
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
)
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)
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
);
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. */
2774 maybe_warn_bool_compare (location_t loc
, enum tree_code code
, tree op0
,
2777 if (TREE_CODE_CLASS (code
) != tcc_comparison
)
2781 if (f
= fold_for_warn (op0
),
2782 TREE_CODE (f
) == INTEGER_CST
)
2784 else if (f
= fold_for_warn (op1
),
2785 TREE_CODE (f
) == INTEGER_CST
)
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
));
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
);
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
))
2811 else if (TREE_CODE (TREE_TYPE (noncst
)) != BOOLEAN_TYPE
2812 && !truth_value_p (TREE_CODE (noncst
)))
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. */
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
))
2837 location_t loc
= EXPR_LOC_OR_LOC (arg
, input_location
);
2838 gcc_rich_location
richloc (loc
);
2841 auto_vec
<int, 16> arg_positions
;
2843 for (i
= 0; i
< nargs
; i
++)
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 ())
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
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
;
2890 /* Possibly warn when an if-else has identical branches. */
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
)
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
)
2908 /* ... or empty branches. */
2909 if (TREE_CODE (thenb
) == STATEMENT_LIST
2910 && STATEMENT_LIST_HEAD (thenb
) == NULL
)
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. */
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
2929 && !walk_tree_without_duplicates (&thenb
, expr_from_macro_expansion_r
,
2931 && !walk_tree_without_duplicates (&elseb
, expr_from_macro_expansion_r
,
2933 warning_at (EXPR_LOCATION (expr
), OPT_Wduplicated_branches
,
2934 "this condition has identical branches");
2937 /* Callback for c_genericize to implement -Wduplicated-branches. */
2940 do_warn_duplicated_branches_r (tree
*tp
, int *, void *)
2942 if (TREE_CODE (*tp
) == COND_EXPR
)
2943 do_warn_duplicated_branches (*tp
);
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++
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. */
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
)
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
))
2976 /* Let's skip macros defined in system headers. */
2977 if (in_system_header_at (body_loc
)
2978 || in_system_header_at (next_loc
))
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
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
)
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
)
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++
3015 if (guard_map
== body_map
)
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:
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
)
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. */
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
)
3066 tree field_off
= byte_position (field
);
3067 if (!multiple_of_p (TREE_TYPE (field_off
), field_off
,
3068 size_int (type_align
)))
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. */
3081 check_address_of_packed_member (tree type
, tree rhs
)
3084 bool indirect
= false;
3086 if (INDIRECT_REF_P (rhs
))
3088 rhs
= TREE_OPERAND (rhs
, 0);
3093 if (TREE_CODE (rhs
) == ADDR_EXPR
)
3095 rhs
= TREE_OPERAND (rhs
, 0);
3099 if (!POINTER_TYPE_P (type
))
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
);
3116 if (TREE_CODE (TREE_TYPE (rhs
)) == ARRAY_TYPE
)
3120 rhs
= TREE_OPERAND (rhs
, 0);
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. */
3131 check_and_warn_address_of_packed_member (tree type
, tree rhs
)
3138 while (TREE_CODE (rhs
) == COMPOUND_EXPR
)
3139 rhs
= TREE_OPERAND (rhs
, 1);
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));
3160 switch (TREE_CODE (rhs
))
3163 /* Address is taken. */
3166 /* Pointer conversion. */
3169 /* Function call. */
3177 = check_address_of_packed_member (type
, rhs
);
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",
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. */
3194 warn_for_address_of_packed_member (tree type
, tree rhs
)
3196 if (!warn_address_of_packed_member
)
3199 /* Don't warn if we don't assign RHS to a pointer. */
3200 if (!POINTER_TYPE_P (type
))
3203 check_and_warn_address_of_packed_member (type
, rhs
);
3206 /* Return EXPR + 1. Convenience helper used below. */
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
3221 vla_bound_parm_decl (tree expr
)
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);
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. */
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
);
3273 /* The parameter types should match at this point so only test one. */
3274 if (TREE_CODE (curtyp
) != POINTER_TYPE
)
3279 curtyp
= TREE_TYPE (curtyp
);
3280 newtyp
= TREE_TYPE (newtyp
);
3283 /* Bail on error. */
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. */
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
;
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
)
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
;
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
);
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
);
3367 /* Move on to the next bound if this one is unspecified. */
3368 if (!curbnd
&& !newbnd
)
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
)
3378 /* Move on if the bounds look the same. */
3379 if (!pcurbndpos
&& !pnewbndpos
3381 && operand_equal_p (curbnd
, newbnd
,
3382 OEP_DECL_NAME
| OEP_LEXICOGRAPHIC
))
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 ();
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 (¬eloc
, "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
)
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). */
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
)
3443 if (TREE_CODE (curparms
) != PARM_DECL
3444 || TREE_CODE (newparms
) != PARM_DECL
)
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). */
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
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
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
);
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
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
)
3484 /* Bail on invalid redeclarations with fewer arguments. */
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
))
3493 /* Skip mismatches in __builtin_va_list that is commonly
3494 an array but that in declarations of built-ins decays
3496 if (builtin
&& TREE_TYPE (newptype
) == TREE_TYPE (va_list_type_node
))
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
);
3508 /* Continue of both parameters are pointers with no size
3509 associated with it. */
3513 /* Otherwise point at PTR_SPEC and set its parameter pointer
3517 newa
->ptrarg
= parmpos
;
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
;
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
)
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 ()))
3550 ? G_("previously declared as a pointer %s")
3551 : G_("previously declared as an ordinary array %s")),
3552 curparmstr
.c_str ());
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 "
3566 parmpos
+ 1, newparmstr
.c_str ()))
3568 "previously declared as a variable length array %s",
3569 curparmstr
.c_str ());
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 "
3580 parmpos
+ 1, newparmstr
.c_str ()))
3581 inform (origloc
, "previously declared as an array %s",
3582 curparmstr
.c_str ());
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 ()))
3594 "previously declared as a variable length array %s",
3595 curparmstr
.c_str ());
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
))
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 (),
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
);
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 "
3649 "previously declared as %s with %u unspecified "
3651 noteparmstr
, noteunspec
);
3653 inform_n (noteloc
, noteunspec
,
3654 "subsequently declared as %s with %u unspecified "
3656 "subsequently declared as %s with %u unspecified "
3658 noteparmstr
, noteunspec
);
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
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
3693 Distinguish between the common case of bounds that are
3694 other function parameters such as in
3698 gcc_rich_location
richloc (newloc
);
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 (),
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 (),
3719 gcc_rich_location
richloc (origloc
);
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
));
3729 inform (&richloc
, "previously declared as %s with bound "
3730 "%qs", curparmstr
.c_str (), curbndstr
);
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
))
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
);
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
))
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. */
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.
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. */
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
)
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
);
3813 inform (loc
, "add parentheses around the second %<sizeof%> "
3814 "to silence this warning");
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
3828 do_warn_array_compare (location_t location
, tree_code code
, tree op0
, tree 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
;
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
;
3849 msg
= G_("comparison between two arrays is deprecated in C++20");
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
) ? "" : ")");
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. */
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
3883 if (!tree_fits_uhwi_p (lhs_val
) || !tree_fits_uhwi_p (rhs_val
))
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)
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
))
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
))
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;
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
,
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. */
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
,
3961 gcc_rich_location
note_loc (lhs_loc
);
3963 note_loc
.add_fixit_replace (lhs_loc
, "0x2");
3966 gcc_assert (lhs_uhwi
== 10);
3967 note_loc
.add_fixit_replace (lhs_loc
, "0xa");
3969 note_loc
.fixits_cannot_be_auto_applied ();
3971 "you can silence this warning by using a hexadecimal constant"
3972 " (%wx rather than %wd)",
3973 lhs_uhwi
, lhs_uhwi
);