PR rtl-optimization/88470
[official-gcc.git] / gcc / c-family / c-warn.c
blob798ad1bcb399fd30969d879bc2247305bc156797
1 /* Diagnostic routines shared by all languages that are variants of C.
2 Copyright (C) 1992-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "target.h"
24 #include "function.h"
25 #include "tree.h"
26 #include "c-common.h"
27 #include "memmodel.h"
28 #include "tm_p.h"
29 #include "diagnostic.h"
30 #include "intl.h"
31 #include "stringpool.h"
32 #include "attribs.h"
33 #include "asan.h"
34 #include "gcc-rich-location.h"
35 #include "gimplify.h"
36 #include "c-family/c-indentation.h"
37 #include "calls.h"
39 /* Print a warning if a constant expression had overflow in folding.
40 Invoke this function on every expression that the language
41 requires to be a constant expression.
42 Note the ANSI C standard says it is erroneous for a
43 constant expression to overflow. */
45 void
46 constant_expression_warning (tree value)
48 if (warn_overflow && pedantic
49 && (TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
50 || TREE_CODE (value) == FIXED_CST
51 || TREE_CODE (value) == VECTOR_CST
52 || TREE_CODE (value) == COMPLEX_CST)
53 && TREE_OVERFLOW (value))
54 pedwarn (input_location, OPT_Woverflow, "overflow in constant expression");
57 /* The same as above but print an unconditional error. */
59 void
60 constant_expression_error (tree value)
62 if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
63 || TREE_CODE (value) == FIXED_CST
64 || TREE_CODE (value) == VECTOR_CST
65 || TREE_CODE (value) == COMPLEX_CST)
66 && TREE_OVERFLOW (value))
67 error ("overflow in constant expression");
70 /* Print a warning if an expression result VALUE had an overflow
71 in folding and its operands hadn't. EXPR, which may be null, is
72 the operand of the expression.
74 Invoke this function on every expression that
75 (1) appears in the source code, and
76 (2) is a constant expression that overflowed, and
77 (3) is not already checked by convert_and_check;
78 however, do not invoke this function on operands of explicit casts
79 or when the expression is the result of an operator and any operand
80 already overflowed. */
82 void
83 overflow_warning (location_t loc, tree value, tree expr)
85 if (c_inhibit_evaluation_warnings != 0)
86 return;
88 const char *warnfmt = NULL;
90 switch (TREE_CODE (value))
92 case INTEGER_CST:
93 warnfmt = (expr
94 ? G_("integer overflow in expression %qE of type %qT "
95 "results in %qE")
96 : G_("integer overflow in expression of type %qT "
97 "results in %qE"));
98 break;
100 case REAL_CST:
101 warnfmt = (expr
102 ? G_("floating point overflow in expression %qE "
103 "of type %qT results in %qE")
104 : G_("floating point overflow in expression of type %qT "
105 "results in %qE"));
106 break;
108 case FIXED_CST:
109 warnfmt = (expr
110 ? G_("fixed-point overflow in expression %qE of type %qT "
111 "results in %qE")
112 : G_("fixed-point overflow in expression of type %qT "
113 "results in %qE"));
114 break;
116 case VECTOR_CST:
117 warnfmt = (expr
118 ? G_("vector overflow in expression %qE of type %qT "
119 "results in %qE")
120 : G_("vector overflow in expression of type %qT "
121 "results in %qE"));
122 break;
124 case COMPLEX_CST:
125 if (TREE_CODE (TREE_REALPART (value)) == INTEGER_CST)
126 warnfmt = (expr
127 ? G_("complex integer overflow in expression %qE "
128 "of type %qT results in %qE")
129 : G_("complex integer overflow in expression of type %qT "
130 "results in %qE"));
131 else if (TREE_CODE (TREE_REALPART (value)) == REAL_CST)
132 warnfmt = (expr
133 ? G_("complex floating point overflow in expression %qE "
134 "of type %qT results in %qE")
135 : G_("complex floating point overflow in expression "
136 "of type %qT results in %qE"));
137 else
138 return;
139 break;
141 default:
142 return;
145 if (expr)
146 warning_at (loc, OPT_Woverflow, warnfmt, expr, TREE_TYPE (expr), value);
147 else
148 warning_at (loc, OPT_Woverflow, warnfmt, TREE_TYPE (value), value);
150 TREE_NO_WARNING (value) = 1;
153 /* Helper function for walk_tree. Unwrap C_MAYBE_CONST_EXPRs in an expression
154 pointed to by TP. */
156 static tree
157 unwrap_c_maybe_const (tree *tp, int *walk_subtrees, void *)
159 if (TREE_CODE (*tp) == C_MAYBE_CONST_EXPR)
161 *tp = C_MAYBE_CONST_EXPR_EXPR (*tp);
162 /* C_MAYBE_CONST_EXPRs don't nest. */
163 *walk_subtrees = false;
165 return NULL_TREE;
168 /* Warn about uses of logical || / && operator in a context where it
169 is likely that the bitwise equivalent was intended by the
170 programmer. We have seen an expression in which CODE is a binary
171 operator used to combine expressions OP_LEFT and OP_RIGHT, which before folding
172 had CODE_LEFT and CODE_RIGHT, into an expression of type TYPE. */
174 void
175 warn_logical_operator (location_t location, enum tree_code code, tree type,
176 enum tree_code code_left, tree op_left,
177 enum tree_code ARG_UNUSED (code_right), tree op_right)
179 int or_op = (code == TRUTH_ORIF_EXPR || code == TRUTH_OR_EXPR);
180 int in0_p, in1_p, in_p;
181 tree low0, low1, low, high0, high1, high, lhs, rhs, tem;
182 bool strict_overflow_p = false;
184 if (!warn_logical_op)
185 return;
187 if (code != TRUTH_ANDIF_EXPR
188 && code != TRUTH_AND_EXPR
189 && code != TRUTH_ORIF_EXPR
190 && code != TRUTH_OR_EXPR)
191 return;
193 /* We don't want to warn if either operand comes from a macro
194 expansion. ??? This doesn't work with e.g. NEGATE_EXPR yet;
195 see PR61534. */
196 if (from_macro_expansion_at (EXPR_LOCATION (op_left))
197 || from_macro_expansion_at (EXPR_LOCATION (op_right)))
198 return;
200 /* Warn if &&/|| are being used in a context where it is
201 likely that the bitwise equivalent was intended by the
202 programmer. That is, an expression such as op && MASK
203 where op should not be any boolean expression, nor a
204 constant, and mask seems to be a non-boolean integer constant. */
205 if (TREE_CODE (op_right) == CONST_DECL)
206 /* An enumerator counts as a constant. */
207 op_right = DECL_INITIAL (op_right);
208 if (!truth_value_p (code_left)
209 && INTEGRAL_TYPE_P (TREE_TYPE (op_left))
210 && !CONSTANT_CLASS_P (op_left)
211 && !TREE_NO_WARNING (op_left)
212 && TREE_CODE (op_right) == INTEGER_CST
213 && !integer_zerop (op_right)
214 && !integer_onep (op_right))
216 if (or_op)
217 warning_at (location, OPT_Wlogical_op, "logical %<or%>"
218 " applied to non-boolean constant");
219 else
220 warning_at (location, OPT_Wlogical_op, "logical %<and%>"
221 " applied to non-boolean constant");
222 TREE_NO_WARNING (op_left) = true;
223 return;
226 /* We do not warn for constants because they are typical of macro
227 expansions that test for features. */
228 if (CONSTANT_CLASS_P (fold_for_warn (op_left))
229 || CONSTANT_CLASS_P (fold_for_warn (op_right)))
230 return;
232 /* This warning only makes sense with logical operands. */
233 if (!(truth_value_p (TREE_CODE (op_left))
234 || INTEGRAL_TYPE_P (TREE_TYPE (op_left)))
235 || !(truth_value_p (TREE_CODE (op_right))
236 || INTEGRAL_TYPE_P (TREE_TYPE (op_right))))
237 return;
239 /* The range computations only work with scalars. */
240 if (VECTOR_TYPE_P (TREE_TYPE (op_left))
241 || VECTOR_TYPE_P (TREE_TYPE (op_right)))
242 return;
244 /* We first test whether either side separately is trivially true
245 (with OR) or trivially false (with AND). If so, do not warn.
246 This is a common idiom for testing ranges of data types in
247 portable code. */
248 op_left = unshare_expr (op_left);
249 walk_tree_without_duplicates (&op_left, unwrap_c_maybe_const, NULL);
250 lhs = make_range (op_left, &in0_p, &low0, &high0, &strict_overflow_p);
251 if (!lhs)
252 return;
254 /* If this is an OR operation, invert both sides; now, the result
255 should be always false to get a warning. */
256 if (or_op)
257 in0_p = !in0_p;
259 tem = build_range_check (UNKNOWN_LOCATION, type, lhs, in0_p, low0, high0);
260 if (tem && integer_zerop (tem))
261 return;
263 op_right = unshare_expr (op_right);
264 walk_tree_without_duplicates (&op_right, unwrap_c_maybe_const, NULL);
265 rhs = make_range (op_right, &in1_p, &low1, &high1, &strict_overflow_p);
266 if (!rhs)
267 return;
269 /* If this is an OR operation, invert both sides; now, the result
270 should be always false to get a warning. */
271 if (or_op)
272 in1_p = !in1_p;
274 tem = build_range_check (UNKNOWN_LOCATION, type, rhs, in1_p, low1, high1);
275 if (tem && integer_zerop (tem))
276 return;
278 /* If both expressions have the same operand, if we can merge the
279 ranges, ... */
280 if (operand_equal_p (lhs, rhs, 0)
281 && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
282 in1_p, low1, high1))
284 tem = build_range_check (UNKNOWN_LOCATION, type, lhs, in_p, low, high);
285 /* ... and if the range test is always false, then warn. */
286 if (tem && integer_zerop (tem))
288 if (or_op)
289 warning_at (location, OPT_Wlogical_op,
290 "logical %<or%> of collectively exhaustive tests is "
291 "always true");
292 else
293 warning_at (location, OPT_Wlogical_op,
294 "logical %<and%> of mutually exclusive tests is "
295 "always false");
297 /* Or warn if the operands have exactly the same range, e.g.
298 A > 0 && A > 0. */
299 else if (tree_int_cst_equal (low0, low1)
300 && tree_int_cst_equal (high0, high1))
302 if (or_op)
303 warning_at (location, OPT_Wlogical_op,
304 "logical %<or%> of equal expressions");
305 else
306 warning_at (location, OPT_Wlogical_op,
307 "logical %<and%> of equal expressions");
312 /* Helper function for warn_tautological_cmp. Look for ARRAY_REFs
313 with constant indices. */
315 static tree
316 find_array_ref_with_const_idx_r (tree *expr_p, int *, void *)
318 tree expr = *expr_p;
320 if ((TREE_CODE (expr) == ARRAY_REF
321 || TREE_CODE (expr) == ARRAY_RANGE_REF)
322 && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST)
323 return integer_type_node;
325 return NULL_TREE;
328 /* Subroutine of warn_tautological_cmp. Warn about bitwise comparison
329 that always evaluate to true or false. LOC is the location of the
330 ==/!= comparison specified by CODE; LHS and RHS are the usual operands
331 of this comparison. */
333 static void
334 warn_tautological_bitwise_comparison (location_t loc, tree_code code,
335 tree lhs, tree rhs)
337 if (code != EQ_EXPR && code != NE_EXPR)
338 return;
340 /* Extract the operands from e.g. (x & 8) == 4. */
341 tree bitop;
342 tree cst;
343 if ((TREE_CODE (lhs) == BIT_AND_EXPR
344 || TREE_CODE (lhs) == BIT_IOR_EXPR)
345 && TREE_CODE (rhs) == INTEGER_CST)
346 bitop = lhs, cst = rhs;
347 else if ((TREE_CODE (rhs) == BIT_AND_EXPR
348 || TREE_CODE (rhs) == BIT_IOR_EXPR)
349 && TREE_CODE (lhs) == INTEGER_CST)
350 bitop = rhs, cst = lhs;
351 else
352 return;
354 tree bitopcst;
355 if (TREE_CODE (TREE_OPERAND (bitop, 0)) == INTEGER_CST)
356 bitopcst = TREE_OPERAND (bitop, 0);
357 else if (TREE_CODE (TREE_OPERAND (bitop, 1)) == INTEGER_CST)
358 bitopcst = TREE_OPERAND (bitop, 1);
359 else
360 return;
362 /* Note that the two operands are from before the usual integer
363 conversions, so their types might not be the same.
364 Use the larger of the two precisions and ignore bits outside
365 of that. */
366 int prec = MAX (TYPE_PRECISION (TREE_TYPE (cst)),
367 TYPE_PRECISION (TREE_TYPE (bitopcst)));
369 wide_int bitopcstw = wi::to_wide (bitopcst, prec);
370 wide_int cstw = wi::to_wide (cst, prec);
372 wide_int res;
373 if (TREE_CODE (bitop) == BIT_AND_EXPR)
374 res = bitopcstw & cstw;
375 else
376 res = bitopcstw | cstw;
378 /* For BIT_AND only warn if (CST2 & CST1) != CST1, and
379 for BIT_OR only if (CST2 | CST1) != CST1. */
380 if (res == cstw)
381 return;
383 if (code == EQ_EXPR)
384 warning_at (loc, OPT_Wtautological_compare,
385 "bitwise comparison always evaluates to false");
386 else
387 warning_at (loc, OPT_Wtautological_compare,
388 "bitwise comparison always evaluates to true");
391 /* Warn if a self-comparison always evaluates to true or false. LOC
392 is the location of the comparison with code CODE, LHS and RHS are
393 operands of the comparison. */
395 void
396 warn_tautological_cmp (location_t loc, enum tree_code code, tree lhs, tree rhs)
398 if (TREE_CODE_CLASS (code) != tcc_comparison)
399 return;
401 /* Don't warn for various macro expansions. */
402 if (from_macro_expansion_at (loc)
403 || from_macro_expansion_at (EXPR_LOCATION (lhs))
404 || from_macro_expansion_at (EXPR_LOCATION (rhs)))
405 return;
407 warn_tautological_bitwise_comparison (loc, code, lhs, rhs);
409 /* We do not warn for constants because they are typical of macro
410 expansions that test for features, sizeof, and similar. */
411 if (CONSTANT_CLASS_P (fold_for_warn (lhs))
412 || CONSTANT_CLASS_P (fold_for_warn (rhs)))
413 return;
415 /* Don't warn for e.g.
416 HOST_WIDE_INT n;
418 if (n == (long) n) ...
420 if ((CONVERT_EXPR_P (lhs) || TREE_CODE (lhs) == NON_LVALUE_EXPR)
421 || (CONVERT_EXPR_P (rhs) || TREE_CODE (rhs) == NON_LVALUE_EXPR))
422 return;
424 /* Don't warn if either LHS or RHS has an IEEE floating-point type.
425 It could be a NaN, and NaN never compares equal to anything, even
426 itself. */
427 if (FLOAT_TYPE_P (TREE_TYPE (lhs)) || FLOAT_TYPE_P (TREE_TYPE (rhs)))
428 return;
430 if (operand_equal_p (lhs, rhs, 0))
432 /* Don't warn about array references with constant indices;
433 these are likely to come from a macro. */
434 if (walk_tree_without_duplicates (&lhs, find_array_ref_with_const_idx_r,
435 NULL))
436 return;
437 const bool always_true = (code == EQ_EXPR || code == LE_EXPR
438 || code == GE_EXPR || code == UNLE_EXPR
439 || code == UNGE_EXPR || code == UNEQ_EXPR);
440 if (always_true)
441 warning_at (loc, OPT_Wtautological_compare,
442 "self-comparison always evaluates to true");
443 else
444 warning_at (loc, OPT_Wtautological_compare,
445 "self-comparison always evaluates to false");
449 /* Return true iff EXPR only contains boolean operands, or comparisons. */
451 static bool
452 expr_has_boolean_operands_p (tree expr)
454 STRIP_NOPS (expr);
456 if (CONVERT_EXPR_P (expr))
457 return bool_promoted_to_int_p (expr);
458 else if (UNARY_CLASS_P (expr))
459 return expr_has_boolean_operands_p (TREE_OPERAND (expr, 0));
460 else if (BINARY_CLASS_P (expr))
461 return (expr_has_boolean_operands_p (TREE_OPERAND (expr, 0))
462 && expr_has_boolean_operands_p (TREE_OPERAND (expr, 1)));
463 else if (COMPARISON_CLASS_P (expr))
464 return true;
465 else
466 return false;
469 /* Warn about logical not used on the left hand side operand of a comparison.
470 This function assumes that the LHS is inside of TRUTH_NOT_EXPR.
471 Do not warn if RHS is of a boolean type, a logical operator, or
472 a comparison. */
474 void
475 warn_logical_not_parentheses (location_t location, enum tree_code code,
476 tree lhs, tree rhs)
478 if (TREE_CODE_CLASS (code) != tcc_comparison
479 || TREE_TYPE (rhs) == NULL_TREE
480 || TREE_CODE (TREE_TYPE (rhs)) == BOOLEAN_TYPE
481 || truth_value_p (TREE_CODE (rhs)))
482 return;
484 /* Don't warn for expression like !x == ~(bool1 | bool2). */
485 if (expr_has_boolean_operands_p (rhs))
486 return;
488 /* Don't warn for !x == 0 or !y != 0, those are equivalent to
489 !(x == 0) or !(y != 0). */
490 if ((code == EQ_EXPR || code == NE_EXPR)
491 && integer_zerop (rhs))
492 return;
494 auto_diagnostic_group d;
495 if (warning_at (location, OPT_Wlogical_not_parentheses,
496 "logical not is only applied to the left hand side of "
497 "comparison")
498 && EXPR_HAS_LOCATION (lhs))
500 location_t lhs_loc = EXPR_LOCATION (lhs);
501 rich_location richloc (line_table, lhs_loc);
502 richloc.add_fixit_insert_before (lhs_loc, "(");
503 richloc.add_fixit_insert_after (lhs_loc, ")");
504 inform (&richloc, "add parentheses around left hand side "
505 "expression to silence this warning");
509 /* Warn if EXP contains any computations whose results are not used.
510 Return true if a warning is printed; false otherwise. LOCUS is the
511 (potential) location of the expression. */
513 bool
514 warn_if_unused_value (const_tree exp, location_t locus)
516 restart:
517 if (TREE_USED (exp) || TREE_NO_WARNING (exp))
518 return false;
520 /* Don't warn about void constructs. This includes casting to void,
521 void function calls, and statement expressions with a final cast
522 to void. */
523 if (VOID_TYPE_P (TREE_TYPE (exp)))
524 return false;
526 if (EXPR_HAS_LOCATION (exp))
527 locus = EXPR_LOCATION (exp);
529 switch (TREE_CODE (exp))
531 case PREINCREMENT_EXPR:
532 case POSTINCREMENT_EXPR:
533 case PREDECREMENT_EXPR:
534 case POSTDECREMENT_EXPR:
535 case MODIFY_EXPR:
536 case INIT_EXPR:
537 case TARGET_EXPR:
538 case CALL_EXPR:
539 case TRY_CATCH_EXPR:
540 case EXIT_EXPR:
541 case VA_ARG_EXPR:
542 return false;
544 case BIND_EXPR:
545 /* For a binding, warn if no side effect within it. */
546 exp = BIND_EXPR_BODY (exp);
547 goto restart;
549 case SAVE_EXPR:
550 case NON_LVALUE_EXPR:
551 case NOP_EXPR:
552 exp = TREE_OPERAND (exp, 0);
553 goto restart;
555 case TRUTH_ORIF_EXPR:
556 case TRUTH_ANDIF_EXPR:
557 /* In && or ||, warn if 2nd operand has no side effect. */
558 exp = TREE_OPERAND (exp, 1);
559 goto restart;
561 case COMPOUND_EXPR:
562 if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus))
563 return true;
564 /* Let people do `(foo (), 0)' without a warning. */
565 if (TREE_CONSTANT (TREE_OPERAND (exp, 1)))
566 return false;
567 exp = TREE_OPERAND (exp, 1);
568 goto restart;
570 case COND_EXPR:
571 /* If this is an expression with side effects, don't warn; this
572 case commonly appears in macro expansions. */
573 if (TREE_SIDE_EFFECTS (exp))
574 return false;
575 goto warn;
577 case INDIRECT_REF:
578 /* Don't warn about automatic dereferencing of references, since
579 the user cannot control it. */
580 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE)
582 exp = TREE_OPERAND (exp, 0);
583 goto restart;
585 /* Fall through. */
587 default:
588 /* Referencing a volatile value is a side effect, so don't warn. */
589 if ((DECL_P (exp) || REFERENCE_CLASS_P (exp))
590 && TREE_THIS_VOLATILE (exp))
591 return false;
593 /* If this is an expression which has no operands, there is no value
594 to be unused. There are no such language-independent codes,
595 but front ends may define such. */
596 if (EXPRESSION_CLASS_P (exp) && TREE_OPERAND_LENGTH (exp) == 0)
597 return false;
599 warn:
600 return warning_at (locus, OPT_Wunused_value, "value computed is not used");
604 /* Print a warning about casts that might indicate violation of strict
605 aliasing rules if -Wstrict-aliasing is used and strict aliasing
606 mode is in effect. LOC is the location of the expression being
607 cast, EXPR might be from inside it. TYPE is the type we're casting
608 to. */
610 bool
611 strict_aliasing_warning (location_t loc, tree type, tree expr)
613 if (loc == UNKNOWN_LOCATION)
614 loc = input_location;
616 /* Strip pointer conversion chains and get to the correct original type. */
617 STRIP_NOPS (expr);
618 tree otype = TREE_TYPE (expr);
620 if (!(flag_strict_aliasing
621 && POINTER_TYPE_P (type)
622 && POINTER_TYPE_P (otype)
623 && !VOID_TYPE_P (TREE_TYPE (type)))
624 /* If the type we are casting to is a ref-all pointer
625 dereferencing it is always valid. */
626 || TYPE_REF_CAN_ALIAS_ALL (type))
627 return false;
629 if ((warn_strict_aliasing > 1) && TREE_CODE (expr) == ADDR_EXPR
630 && (DECL_P (TREE_OPERAND (expr, 0))
631 || handled_component_p (TREE_OPERAND (expr, 0))))
633 /* Casting the address of an object to non void pointer. Warn
634 if the cast breaks type based aliasing. */
635 if (!COMPLETE_TYPE_P (TREE_TYPE (type)) && warn_strict_aliasing == 2)
637 warning_at (loc, OPT_Wstrict_aliasing,
638 "type-punning to incomplete type "
639 "might break strict-aliasing rules");
640 return true;
642 else
644 /* warn_strict_aliasing >= 3. This includes the default (3).
645 Only warn if the cast is dereferenced immediately. */
646 alias_set_type set1
647 = get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0)));
648 alias_set_type set2 = get_alias_set (TREE_TYPE (type));
650 if (set2 != 0
651 && set1 != set2
652 && !alias_set_subset_of (set2, set1)
653 && !alias_sets_conflict_p (set1, set2))
655 warning_at (loc, OPT_Wstrict_aliasing,
656 "dereferencing type-punned "
657 "pointer will break strict-aliasing rules");
658 return true;
660 else if (warn_strict_aliasing == 2
661 && !alias_sets_must_conflict_p (set1, set2))
663 warning_at (loc, OPT_Wstrict_aliasing,
664 "dereferencing type-punned "
665 "pointer might break strict-aliasing rules");
666 return true;
670 else if ((warn_strict_aliasing == 1) && !VOID_TYPE_P (TREE_TYPE (otype)))
672 /* At this level, warn for any conversions, even if an address is
673 not taken in the same statement. This will likely produce many
674 false positives, but could be useful to pinpoint problems that
675 are not revealed at higher levels. */
676 alias_set_type set1 = get_alias_set (TREE_TYPE (otype));
677 alias_set_type set2 = get_alias_set (TREE_TYPE (type));
678 if (!COMPLETE_TYPE_P (type)
679 || !alias_sets_must_conflict_p (set1, set2))
681 warning_at (loc, OPT_Wstrict_aliasing,
682 "dereferencing type-punned "
683 "pointer might break strict-aliasing rules");
684 return true;
688 return false;
691 /* Warn about memset (&a, 0, sizeof (&a)); and similar mistakes with
692 sizeof as last operand of certain builtins. */
694 void
695 sizeof_pointer_memaccess_warning (location_t *sizeof_arg_loc, tree callee,
696 vec<tree, va_gc> *params, tree *sizeof_arg,
697 bool (*comp_types) (tree, tree))
699 tree type, dest = NULL_TREE, src = NULL_TREE, tem;
700 bool strop = false, cmp = false;
701 unsigned int idx = ~0;
702 location_t loc;
704 if (TREE_CODE (callee) != FUNCTION_DECL
705 || !fndecl_built_in_p (callee, BUILT_IN_NORMAL)
706 || vec_safe_length (params) <= 1)
707 return;
709 enum built_in_function fncode = DECL_FUNCTION_CODE (callee);
710 switch (fncode)
712 case BUILT_IN_STRNCMP:
713 case BUILT_IN_STRNCASECMP:
714 cmp = true;
715 /* FALLTHRU */
716 case BUILT_IN_STRNCPY:
717 case BUILT_IN_STRNCPY_CHK:
718 case BUILT_IN_STRNCAT:
719 case BUILT_IN_STRNCAT_CHK:
720 case BUILT_IN_STPNCPY:
721 case BUILT_IN_STPNCPY_CHK:
722 strop = true;
723 /* FALLTHRU */
724 case BUILT_IN_MEMCPY:
725 case BUILT_IN_MEMCPY_CHK:
726 case BUILT_IN_MEMMOVE:
727 case BUILT_IN_MEMMOVE_CHK:
728 if (params->length () < 3)
729 return;
730 src = (*params)[1];
731 dest = (*params)[0];
732 idx = 2;
733 break;
734 case BUILT_IN_BCOPY:
735 if (params->length () < 3)
736 return;
737 src = (*params)[0];
738 dest = (*params)[1];
739 idx = 2;
740 break;
741 case BUILT_IN_MEMCMP:
742 case BUILT_IN_BCMP:
743 if (params->length () < 3)
744 return;
745 src = (*params)[1];
746 dest = (*params)[0];
747 idx = 2;
748 cmp = true;
749 break;
750 case BUILT_IN_MEMSET:
751 case BUILT_IN_MEMSET_CHK:
752 if (params->length () < 3)
753 return;
754 dest = (*params)[0];
755 idx = 2;
756 break;
757 case BUILT_IN_BZERO:
758 dest = (*params)[0];
759 idx = 1;
760 break;
761 case BUILT_IN_STRNDUP:
762 src = (*params)[0];
763 strop = true;
764 idx = 1;
765 break;
766 case BUILT_IN_MEMCHR:
767 if (params->length () < 3)
768 return;
769 src = (*params)[0];
770 idx = 2;
771 break;
772 case BUILT_IN_SNPRINTF:
773 case BUILT_IN_SNPRINTF_CHK:
774 case BUILT_IN_VSNPRINTF:
775 case BUILT_IN_VSNPRINTF_CHK:
776 dest = (*params)[0];
777 idx = 1;
778 strop = true;
779 break;
780 default:
781 break;
784 if (idx >= 3)
785 return;
787 /* Use error_operand_p to detect non-error arguments with an error
788 type that the C++ front-end constructs. */
789 if (error_operand_p (src)
790 || error_operand_p (dest)
791 || !sizeof_arg[idx]
792 || error_operand_p (sizeof_arg[idx]))
793 return;
795 type = TYPE_P (sizeof_arg[idx])
796 ? sizeof_arg[idx] : TREE_TYPE (sizeof_arg[idx]);
798 if (!POINTER_TYPE_P (type))
800 /* The argument type may be an array. Diagnose bounded string
801 copy functions that specify the bound in terms of the source
802 argument rather than the destination unless they are equal
803 to one another. Handle constant sizes and also try to handle
804 sizeof expressions involving VLAs. */
805 if (strop && !cmp && fncode != BUILT_IN_STRNDUP && src)
807 tem = tree_strip_nop_conversions (src);
808 if (TREE_CODE (tem) == ADDR_EXPR)
809 tem = TREE_OPERAND (tem, 0);
811 /* Avoid diagnosing sizeof SRC when SRC is declared with
812 attribute nonstring. */
813 tree dummy;
814 if (get_attr_nonstring_decl (tem, &dummy))
815 return;
817 tree d = tree_strip_nop_conversions (dest);
818 if (TREE_CODE (d) == ADDR_EXPR)
819 d = TREE_OPERAND (d, 0);
821 tree dstsz = TYPE_SIZE_UNIT (TREE_TYPE (d));
822 tree srcsz = TYPE_SIZE_UNIT (TREE_TYPE (tem));
824 if ((!dstsz
825 || !srcsz
826 || !operand_equal_p (dstsz, srcsz, OEP_LEXICOGRAPHIC))
827 && operand_equal_p (tem, sizeof_arg[idx], OEP_ADDRESS_OF))
828 warning_at (sizeof_arg_loc[idx], OPT_Wsizeof_pointer_memaccess,
829 "argument to %<sizeof%> in %qD call is the same "
830 "expression as the source; did you mean to use "
831 "the size of the destination?",
832 callee);
835 return;
838 if (dest
839 && (tem = tree_strip_nop_conversions (dest))
840 && POINTER_TYPE_P (TREE_TYPE (tem))
841 && comp_types (TREE_TYPE (TREE_TYPE (tem)), type))
842 return;
844 if (src
845 && (tem = tree_strip_nop_conversions (src))
846 && POINTER_TYPE_P (TREE_TYPE (tem))
847 && comp_types (TREE_TYPE (TREE_TYPE (tem)), type))
848 return;
850 loc = sizeof_arg_loc[idx];
852 if (dest && !cmp)
854 if (!TYPE_P (sizeof_arg[idx])
855 && operand_equal_p (dest, sizeof_arg[idx], 0)
856 && comp_types (TREE_TYPE (dest), type))
858 if (TREE_CODE (sizeof_arg[idx]) == ADDR_EXPR && !strop)
859 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
860 "argument to %<sizeof%> in %qD call is the same "
861 "expression as the destination; did you mean to "
862 "remove the addressof?", callee);
863 else if ((TYPE_PRECISION (TREE_TYPE (type))
864 == TYPE_PRECISION (char_type_node))
865 || strop)
866 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
867 "argument to %<sizeof%> in %qD call is the same "
868 "expression as the destination; did you mean to "
869 "provide an explicit length?", callee);
870 else
871 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
872 "argument to %<sizeof%> in %qD call is the same "
873 "expression as the destination; did you mean to "
874 "dereference it?", callee);
875 return;
878 if (POINTER_TYPE_P (TREE_TYPE (dest))
879 && !strop
880 && comp_types (TREE_TYPE (dest), type)
881 && !VOID_TYPE_P (TREE_TYPE (type)))
883 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
884 "argument to %<sizeof%> in %qD call is the same "
885 "pointer type %qT as the destination; expected %qT "
886 "or an explicit length", callee, TREE_TYPE (dest),
887 TREE_TYPE (TREE_TYPE (dest)));
888 return;
892 if (src && !cmp)
894 if (!TYPE_P (sizeof_arg[idx])
895 && operand_equal_p (src, sizeof_arg[idx], 0)
896 && comp_types (TREE_TYPE (src), type))
898 if (TREE_CODE (sizeof_arg[idx]) == ADDR_EXPR && !strop)
899 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
900 "argument to %<sizeof%> in %qD call is the same "
901 "expression as the source; did you mean to "
902 "remove the addressof?", callee);
903 else if ((TYPE_PRECISION (TREE_TYPE (type))
904 == TYPE_PRECISION (char_type_node))
905 || strop)
906 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
907 "argument to %<sizeof%> in %qD call is the same "
908 "expression as the source; did you mean to "
909 "provide an explicit length?", callee);
910 else
911 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
912 "argument to %<sizeof%> in %qD call is the same "
913 "expression as the source; did you mean to "
914 "dereference it?", callee);
915 return;
918 if (POINTER_TYPE_P (TREE_TYPE (src))
919 && !strop
920 && comp_types (TREE_TYPE (src), type)
921 && !VOID_TYPE_P (TREE_TYPE (type)))
923 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
924 "argument to %<sizeof%> in %qD call is the same "
925 "pointer type %qT as the source; expected %qT "
926 "or an explicit length", callee, TREE_TYPE (src),
927 TREE_TYPE (TREE_TYPE (src)));
928 return;
932 if (dest)
934 if (!TYPE_P (sizeof_arg[idx])
935 && operand_equal_p (dest, sizeof_arg[idx], 0)
936 && comp_types (TREE_TYPE (dest), type))
938 if (TREE_CODE (sizeof_arg[idx]) == ADDR_EXPR && !strop)
939 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
940 "argument to %<sizeof%> in %qD call is the same "
941 "expression as the first source; did you mean to "
942 "remove the addressof?", callee);
943 else if ((TYPE_PRECISION (TREE_TYPE (type))
944 == TYPE_PRECISION (char_type_node))
945 || strop)
946 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
947 "argument to %<sizeof%> in %qD call is the same "
948 "expression as the first source; did you mean to "
949 "provide an explicit length?", callee);
950 else
951 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
952 "argument to %<sizeof%> in %qD call is the same "
953 "expression as the first source; did you mean to "
954 "dereference it?", callee);
955 return;
958 if (POINTER_TYPE_P (TREE_TYPE (dest))
959 && !strop
960 && comp_types (TREE_TYPE (dest), type)
961 && !VOID_TYPE_P (TREE_TYPE (type)))
963 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
964 "argument to %<sizeof%> in %qD call is the same "
965 "pointer type %qT as the first source; expected %qT "
966 "or an explicit length", callee, TREE_TYPE (dest),
967 TREE_TYPE (TREE_TYPE (dest)));
968 return;
972 if (src)
974 if (!TYPE_P (sizeof_arg[idx])
975 && operand_equal_p (src, sizeof_arg[idx], 0)
976 && comp_types (TREE_TYPE (src), type))
978 if (TREE_CODE (sizeof_arg[idx]) == ADDR_EXPR && !strop)
979 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
980 "argument to %<sizeof%> in %qD call is the same "
981 "expression as the second source; did you mean to "
982 "remove the addressof?", callee);
983 else if ((TYPE_PRECISION (TREE_TYPE (type))
984 == TYPE_PRECISION (char_type_node))
985 || strop)
986 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
987 "argument to %<sizeof%> in %qD call is the same "
988 "expression as the second source; did you mean to "
989 "provide an explicit length?", callee);
990 else
991 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
992 "argument to %<sizeof%> in %qD call is the same "
993 "expression as the second source; did you mean to "
994 "dereference it?", callee);
995 return;
998 if (POINTER_TYPE_P (TREE_TYPE (src))
999 && !strop
1000 && comp_types (TREE_TYPE (src), type)
1001 && !VOID_TYPE_P (TREE_TYPE (type)))
1003 warning_at (loc, OPT_Wsizeof_pointer_memaccess,
1004 "argument to %<sizeof%> in %qD call is the same "
1005 "pointer type %qT as the second source; expected %qT "
1006 "or an explicit length", callee, TREE_TYPE (src),
1007 TREE_TYPE (TREE_TYPE (src)));
1008 return;
1014 /* Warn for unlikely, improbable, or stupid DECL declarations
1015 of `main'. */
1017 void
1018 check_main_parameter_types (tree decl)
1020 function_args_iterator iter;
1021 tree type;
1022 int argct = 0;
1024 FOREACH_FUNCTION_ARGS (TREE_TYPE (decl), type, iter)
1026 /* XXX void_type_node belies the abstraction. */
1027 if (type == void_type_node || type == error_mark_node)
1028 break;
1030 tree t = type;
1031 if (TYPE_ATOMIC (t))
1032 pedwarn (input_location, OPT_Wmain,
1033 "%<_Atomic%>-qualified parameter type %qT of %q+D",
1034 type, decl);
1035 while (POINTER_TYPE_P (t))
1037 t = TREE_TYPE (t);
1038 if (TYPE_ATOMIC (t))
1039 pedwarn (input_location, OPT_Wmain,
1040 "%<_Atomic%>-qualified parameter type %qT of %q+D",
1041 type, decl);
1044 ++argct;
1045 switch (argct)
1047 case 1:
1048 if (TYPE_MAIN_VARIANT (type) != integer_type_node)
1049 pedwarn (input_location, OPT_Wmain,
1050 "first argument of %q+D should be %<int%>", decl);
1051 break;
1053 case 2:
1054 if (TREE_CODE (type) != POINTER_TYPE
1055 || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
1056 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
1057 != char_type_node))
1058 pedwarn (input_location, OPT_Wmain,
1059 "second argument of %q+D should be %<char **%>", decl);
1060 break;
1062 case 3:
1063 if (TREE_CODE (type) != POINTER_TYPE
1064 || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
1065 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
1066 != char_type_node))
1067 pedwarn (input_location, OPT_Wmain,
1068 "third argument of %q+D should probably be "
1069 "%<char **%>", decl);
1070 break;
1074 /* It is intentional that this message does not mention the third
1075 argument because it's only mentioned in an appendix of the
1076 standard. */
1077 if (argct > 0 && (argct < 2 || argct > 3))
1078 pedwarn (input_location, OPT_Wmain,
1079 "%q+D takes only zero or two arguments", decl);
1081 if (stdarg_p (TREE_TYPE (decl)))
1082 pedwarn (input_location, OPT_Wmain,
1083 "%q+D declared as variadic function", decl);
1086 /* Warns if the conversion of EXPR to TYPE may alter a value.
1087 This is a helper function for warnings_for_convert_and_check. */
1089 static void
1090 conversion_warning (location_t loc, tree type, tree expr, tree result)
1092 tree expr_type = TREE_TYPE (expr);
1093 enum conversion_safety conversion_kind;
1095 if (!warn_conversion && !warn_sign_conversion && !warn_float_conversion)
1096 return;
1098 /* This may happen, because for LHS op= RHS we preevaluate
1099 RHS and create C_MAYBE_CONST_EXPR <SAVE_EXPR <RHS>>, which
1100 means we could no longer see the code of the EXPR. */
1101 if (TREE_CODE (expr) == C_MAYBE_CONST_EXPR)
1102 expr = C_MAYBE_CONST_EXPR_EXPR (expr);
1103 if (TREE_CODE (expr) == SAVE_EXPR)
1104 expr = TREE_OPERAND (expr, 0);
1106 switch (TREE_CODE (expr))
1108 case EQ_EXPR:
1109 case NE_EXPR:
1110 case LE_EXPR:
1111 case GE_EXPR:
1112 case LT_EXPR:
1113 case GT_EXPR:
1114 case TRUTH_ANDIF_EXPR:
1115 case TRUTH_ORIF_EXPR:
1116 case TRUTH_AND_EXPR:
1117 case TRUTH_OR_EXPR:
1118 case TRUTH_XOR_EXPR:
1119 case TRUTH_NOT_EXPR:
1120 /* Conversion from boolean to a signed:1 bit-field (which only
1121 can hold the values 0 and -1) doesn't lose information - but
1122 it does change the value. */
1123 if (TYPE_PRECISION (type) == 1 && !TYPE_UNSIGNED (type))
1124 warning_at (loc, OPT_Wconversion,
1125 "conversion to %qT from boolean expression", type);
1126 return;
1128 case REAL_CST:
1129 case INTEGER_CST:
1130 case COMPLEX_CST:
1132 conversion_kind = unsafe_conversion_p (loc, type, expr, result, true);
1133 int warnopt;
1134 if (conversion_kind == UNSAFE_REAL)
1135 warnopt = OPT_Wfloat_conversion;
1136 else if (conversion_kind)
1137 warnopt = OPT_Wconversion;
1138 else
1139 break;
1141 if (TREE_CODE_CLASS (TREE_CODE (result)) == tcc_constant)
1142 warning_at (loc, warnopt,
1143 "conversion from %qT to %qT changes value from %qE to %qE",
1144 expr_type, type, expr, result);
1145 else
1146 warning_at (loc, warnopt,
1147 "conversion from %qT to %qT changes the value of %qE",
1148 expr_type, type, expr);
1149 break;
1151 case COND_EXPR:
1153 /* In case of COND_EXPR, we do not care about the type of
1154 COND_EXPR, only about the conversion of each operand. */
1155 tree op1 = TREE_OPERAND (expr, 1);
1156 tree op2 = TREE_OPERAND (expr, 2);
1158 conversion_warning (loc, type, op1, result);
1159 conversion_warning (loc, type, op2, result);
1160 return;
1163 default: /* 'expr' is not a constant. */
1164 conversion_kind = unsafe_conversion_p (loc, type, expr, result, true);
1165 if (conversion_kind == UNSAFE_IMAGINARY)
1166 warning_at (loc, OPT_Wconversion,
1167 "conversion from %qT to %qT discards imaginary component",
1168 expr_type, type);
1169 else
1171 int warnopt;
1172 if (conversion_kind == UNSAFE_REAL)
1173 warnopt = OPT_Wfloat_conversion;
1174 else if (conversion_kind)
1175 warnopt = OPT_Wconversion;
1176 else
1177 break;
1178 warning_at (loc, warnopt,
1179 "conversion from %qT to %qT may change value",
1180 expr_type, type);
1185 /* Produce warnings after a conversion. RESULT is the result of
1186 converting EXPR to TYPE. This is a helper function for
1187 convert_and_check and cp_convert_and_check. */
1189 void
1190 warnings_for_convert_and_check (location_t loc, tree type, tree expr,
1191 tree result)
1193 loc = expansion_point_location_if_in_system_header (loc);
1195 bool cst = TREE_CODE_CLASS (TREE_CODE (result)) == tcc_constant;
1197 tree exprtype = TREE_TYPE (expr);
1199 if (TREE_CODE (expr) == INTEGER_CST
1200 && (TREE_CODE (type) == INTEGER_TYPE
1201 || TREE_CODE (type) == ENUMERAL_TYPE)
1202 && !int_fits_type_p (expr, type))
1204 /* Do not diagnose overflow in a constant expression merely
1205 because a conversion overflowed. */
1206 if (TREE_OVERFLOW (result))
1207 TREE_OVERFLOW (result) = TREE_OVERFLOW (expr);
1209 if (TYPE_UNSIGNED (type))
1211 /* This detects cases like converting -129 or 256 to
1212 unsigned char. */
1213 if (!int_fits_type_p (expr, c_common_signed_type (type)))
1215 if (cst)
1216 warning_at (loc, OPT_Woverflow,
1217 (TYPE_UNSIGNED (exprtype)
1218 ? G_("conversion from %qT to %qT "
1219 "changes value from %qE to %qE")
1220 : G_("unsigned conversion from %qT to %qT "
1221 "changes value from %qE to %qE")),
1222 exprtype, type, expr, result);
1223 else
1224 warning_at (loc, OPT_Woverflow,
1225 (TYPE_UNSIGNED (exprtype)
1226 ? G_("conversion from %qT to %qT "
1227 "changes the value of %qE")
1228 : G_("unsigned conversion from %qT to %qT "
1229 "changes the value of %qE")),
1230 exprtype, type, expr);
1232 else
1233 conversion_warning (loc, type, expr, result);
1235 else if (!int_fits_type_p (expr, c_common_unsigned_type (type)))
1237 if (cst)
1238 warning_at (loc, OPT_Woverflow,
1239 "overflow in conversion from %qT to %qT "
1240 "changes value from %qE to %qE",
1241 exprtype, type, expr, result);
1242 else
1243 warning_at (loc, OPT_Woverflow,
1244 "overflow in conversion from %qT to %qT "
1245 "changes the value of %qE",
1246 exprtype, type, expr);
1248 /* No warning for converting 0x80000000 to int. */
1249 else if (pedantic
1250 && (TREE_CODE (exprtype) != INTEGER_TYPE
1251 || TYPE_PRECISION (exprtype)
1252 != TYPE_PRECISION (type)))
1254 if (cst)
1255 warning_at (loc, OPT_Woverflow,
1256 "overflow in conversion from %qT to %qT "
1257 "changes value from %qE to %qE",
1258 exprtype, type, expr, result);
1259 else
1260 warning_at (loc, OPT_Woverflow,
1261 "overflow in conversion from %qT to %qT "
1262 "changes the value of %qE",
1263 exprtype, type, expr);
1265 else
1266 conversion_warning (loc, type, expr, result);
1268 else if ((TREE_CODE (result) == INTEGER_CST
1269 || TREE_CODE (result) == FIXED_CST) && TREE_OVERFLOW (result))
1271 if (cst)
1272 warning_at (loc, OPT_Woverflow,
1273 "overflow in conversion from %qT to %qT "
1274 "changes value from %qE to %qE",
1275 exprtype, type, expr, result);
1276 else
1277 warning_at (loc, OPT_Woverflow,
1278 "overflow in conversion from %qT to %qT "
1279 "changes the value of %qE",
1280 exprtype, type, expr);
1282 else
1283 conversion_warning (loc, type, expr, result);
1286 /* Subroutines of c_do_switch_warnings, called via splay_tree_foreach.
1287 Used to verify that case values match up with enumerator values. */
1289 static void
1290 match_case_to_enum_1 (tree key, tree type, tree label)
1292 /* Avoid warning about enums that have no enumerators. */
1293 if (TYPE_VALUES (type) == NULL_TREE)
1294 return;
1296 char buf[WIDE_INT_PRINT_BUFFER_SIZE];
1298 if (tree_fits_uhwi_p (key))
1299 print_dec (wi::to_wide (key), buf, UNSIGNED);
1300 else if (tree_fits_shwi_p (key))
1301 print_dec (wi::to_wide (key), buf, SIGNED);
1302 else
1303 print_hex (wi::to_wide (key), buf);
1305 if (TYPE_NAME (type) == NULL_TREE)
1306 warning_at (DECL_SOURCE_LOCATION (CASE_LABEL (label)),
1307 warn_switch ? OPT_Wswitch : OPT_Wswitch_enum,
1308 "case value %qs not in enumerated type",
1309 buf);
1310 else
1311 warning_at (DECL_SOURCE_LOCATION (CASE_LABEL (label)),
1312 warn_switch ? OPT_Wswitch : OPT_Wswitch_enum,
1313 "case value %qs not in enumerated type %qT",
1314 buf, type);
1317 /* Subroutine of c_do_switch_warnings, called via splay_tree_foreach.
1318 Used to verify that case values match up with enumerator values. */
1320 static int
1321 match_case_to_enum (splay_tree_node node, void *data)
1323 tree label = (tree) node->value;
1324 tree type = (tree) data;
1326 /* Skip default case. */
1327 if (!CASE_LOW (label))
1328 return 0;
1330 /* If CASE_LOW_SEEN is not set, that means CASE_LOW did not appear
1331 when we did our enum->case scan. Reset our scratch bit after. */
1332 if (!CASE_LOW_SEEN (label))
1333 match_case_to_enum_1 (CASE_LOW (label), type, label);
1334 else
1335 CASE_LOW_SEEN (label) = 0;
1337 /* If CASE_HIGH is non-null, we have a range. If CASE_HIGH_SEEN is
1338 not set, that means that CASE_HIGH did not appear when we did our
1339 enum->case scan. Reset our scratch bit after. */
1340 if (CASE_HIGH (label))
1342 if (!CASE_HIGH_SEEN (label))
1343 match_case_to_enum_1 (CASE_HIGH (label), type, label);
1344 else
1345 CASE_HIGH_SEEN (label) = 0;
1348 return 0;
1351 /* Handle -Wswitch*. Called from the front end after parsing the
1352 switch construct. */
1353 /* ??? Should probably be somewhere generic, since other languages
1354 besides C and C++ would want this. At the moment, however, C/C++
1355 are the only tree-ssa languages that support enumerations at all,
1356 so the point is moot. */
1358 void
1359 c_do_switch_warnings (splay_tree cases, location_t switch_location,
1360 tree type, tree cond, bool bool_cond_p,
1361 bool outside_range_p)
1363 splay_tree_node default_node;
1364 splay_tree_node node;
1365 tree chain;
1367 if (!warn_switch && !warn_switch_enum && !warn_switch_default
1368 && !warn_switch_bool)
1369 return;
1371 default_node = splay_tree_lookup (cases, (splay_tree_key) NULL);
1372 if (!default_node)
1373 warning_at (switch_location, OPT_Wswitch_default,
1374 "switch missing default case");
1376 /* There are certain cases where -Wswitch-bool warnings aren't
1377 desirable, such as
1378 switch (boolean)
1380 case true: ...
1381 case false: ...
1383 so be careful here. */
1384 if (warn_switch_bool && bool_cond_p)
1386 splay_tree_node min_node;
1387 /* If there's a default node, it's also the value with the minimal
1388 key. So look at the penultimate key (if any). */
1389 if (default_node)
1390 min_node = splay_tree_successor (cases, (splay_tree_key) NULL);
1391 else
1392 min_node = splay_tree_min (cases);
1393 tree min = min_node ? (tree) min_node->key : NULL_TREE;
1395 splay_tree_node max_node = splay_tree_max (cases);
1396 /* This might be a case range, so look at the value with the
1397 maximal key and then check CASE_HIGH. */
1398 tree max = max_node ? (tree) max_node->value : NULL_TREE;
1399 if (max)
1400 max = CASE_HIGH (max) ? CASE_HIGH (max) : CASE_LOW (max);
1402 /* If there's a case value > 1 or < 0, that is outside bool
1403 range, warn. */
1404 if (outside_range_p
1405 || (max && wi::gts_p (wi::to_wide (max), 1))
1406 || (min && wi::lts_p (wi::to_wide (min), 0))
1407 /* And handle the
1408 switch (boolean)
1410 case true: ...
1411 case false: ...
1412 default: ...
1414 case, where we want to warn. */
1415 || (default_node
1416 && max && wi::to_wide (max) == 1
1417 && min && wi::to_wide (min) == 0))
1418 warning_at (switch_location, OPT_Wswitch_bool,
1419 "switch condition has boolean value");
1422 /* From here on, we only care about enumerated types. */
1423 if (!type || TREE_CODE (type) != ENUMERAL_TYPE)
1424 return;
1426 /* From here on, we only care about -Wswitch and -Wswitch-enum. */
1427 if (!warn_switch_enum && !warn_switch)
1428 return;
1430 /* Check the cases. Warn about case values which are not members of
1431 the enumerated type. For -Wswitch-enum, or for -Wswitch when
1432 there is no default case, check that exactly all enumeration
1433 literals are covered by the cases. */
1435 /* Clearing COND if it is not an integer constant simplifies
1436 the tests inside the loop below. */
1437 if (TREE_CODE (cond) != INTEGER_CST)
1438 cond = NULL_TREE;
1440 /* The time complexity here is O(N*lg(N)) worst case, but for the
1441 common case of monotonically increasing enumerators, it is
1442 O(N), since the nature of the splay tree will keep the next
1443 element adjacent to the root at all times. */
1445 for (chain = TYPE_VALUES (type); chain; chain = TREE_CHAIN (chain))
1447 tree value = TREE_VALUE (chain);
1448 if (TREE_CODE (value) == CONST_DECL)
1449 value = DECL_INITIAL (value);
1450 node = splay_tree_lookup (cases, (splay_tree_key) value);
1451 if (node)
1453 /* Mark the CASE_LOW part of the case entry as seen. */
1454 tree label = (tree) node->value;
1455 CASE_LOW_SEEN (label) = 1;
1456 continue;
1459 /* Even though there wasn't an exact match, there might be a
1460 case range which includes the enumerator's value. */
1461 node = splay_tree_predecessor (cases, (splay_tree_key) value);
1462 if (node && CASE_HIGH ((tree) node->value))
1464 tree label = (tree) node->value;
1465 int cmp = tree_int_cst_compare (CASE_HIGH (label), value);
1466 if (cmp >= 0)
1468 /* If we match the upper bound exactly, mark the CASE_HIGH
1469 part of the case entry as seen. */
1470 if (cmp == 0)
1471 CASE_HIGH_SEEN (label) = 1;
1472 continue;
1476 /* We've now determined that this enumerated literal isn't
1477 handled by the case labels of the switch statement. */
1479 /* If the switch expression is a constant, we only really care
1480 about whether that constant is handled by the switch. */
1481 if (cond && tree_int_cst_compare (cond, value))
1482 continue;
1484 /* If there is a default_node, the only relevant option is
1485 Wswitch-enum. Otherwise, if both are enabled then we prefer
1486 to warn using -Wswitch because -Wswitch is enabled by -Wall
1487 while -Wswitch-enum is explicit. */
1488 warning_at (switch_location,
1489 (default_node || !warn_switch
1490 ? OPT_Wswitch_enum
1491 : OPT_Wswitch),
1492 "enumeration value %qE not handled in switch",
1493 TREE_PURPOSE (chain));
1496 /* Warn if there are case expressions that don't correspond to
1497 enumerators. This can occur since C and C++ don't enforce
1498 type-checking of assignments to enumeration variables.
1500 The time complexity here is now always O(N) worst case, since
1501 we should have marked both the lower bound and upper bound of
1502 every disjoint case label, with CASE_LOW_SEEN and CASE_HIGH_SEEN
1503 above. This scan also resets those fields. */
1505 splay_tree_foreach (cases, match_case_to_enum, type);
1508 /* Warn for A ?: C expressions (with B omitted) where A is a boolean
1509 expression, because B will always be true. */
1511 void
1512 warn_for_omitted_condop (location_t location, tree cond)
1514 /* In C++ template declarations it can happen that the type is dependent
1515 and not yet known, thus TREE_TYPE (cond) == NULL_TREE. */
1516 if (truth_value_p (TREE_CODE (cond))
1517 || (TREE_TYPE (cond) != NULL_TREE
1518 && TREE_CODE (TREE_TYPE (cond)) == BOOLEAN_TYPE))
1519 warning_at (location, OPT_Wparentheses,
1520 "the omitted middle operand in ?: will always be %<true%>, "
1521 "suggest explicit middle operand");
1524 /* Give an error for storing into ARG, which is 'const'. USE indicates
1525 how ARG was being used. */
1527 void
1528 readonly_error (location_t loc, tree arg, enum lvalue_use use)
1530 gcc_assert (use == lv_assign || use == lv_increment || use == lv_decrement
1531 || use == lv_asm);
1532 /* Using this macro rather than (for example) arrays of messages
1533 ensures that all the format strings are checked at compile
1534 time. */
1535 #define READONLY_MSG(A, I, D, AS) (use == lv_assign ? (A) \
1536 : (use == lv_increment ? (I) \
1537 : (use == lv_decrement ? (D) : (AS))))
1538 if (TREE_CODE (arg) == COMPONENT_REF)
1540 if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
1541 error_at (loc, READONLY_MSG (G_("assignment of member "
1542 "%qD in read-only object"),
1543 G_("increment of member "
1544 "%qD in read-only object"),
1545 G_("decrement of member "
1546 "%qD in read-only object"),
1547 G_("member %qD in read-only object "
1548 "used as %<asm%> output")),
1549 TREE_OPERAND (arg, 1));
1550 else
1551 error_at (loc, READONLY_MSG (G_("assignment of read-only member %qD"),
1552 G_("increment of read-only member %qD"),
1553 G_("decrement of read-only member %qD"),
1554 G_("read-only member %qD used as %<asm%> output")),
1555 TREE_OPERAND (arg, 1));
1557 else if (VAR_P (arg))
1558 error_at (loc, READONLY_MSG (G_("assignment of read-only variable %qD"),
1559 G_("increment of read-only variable %qD"),
1560 G_("decrement of read-only variable %qD"),
1561 G_("read-only variable %qD used as %<asm%> output")),
1562 arg);
1563 else if (TREE_CODE (arg) == PARM_DECL)
1564 error_at (loc, READONLY_MSG (G_("assignment of read-only parameter %qD"),
1565 G_("increment of read-only parameter %qD"),
1566 G_("decrement of read-only parameter %qD"),
1567 G_("read-only parameter %qD use as %<asm%> output")),
1568 arg);
1569 else if (TREE_CODE (arg) == RESULT_DECL)
1571 gcc_assert (c_dialect_cxx ());
1572 error_at (loc, READONLY_MSG (G_("assignment of "
1573 "read-only named return value %qD"),
1574 G_("increment of "
1575 "read-only named return value %qD"),
1576 G_("decrement of "
1577 "read-only named return value %qD"),
1578 G_("read-only named return value %qD "
1579 "used as %<asm%>output")),
1580 arg);
1582 else if (TREE_CODE (arg) == FUNCTION_DECL)
1583 error_at (loc, READONLY_MSG (G_("assignment of function %qD"),
1584 G_("increment of function %qD"),
1585 G_("decrement of function %qD"),
1586 G_("function %qD used as %<asm%> output")),
1587 arg);
1588 else
1589 error_at (loc, READONLY_MSG (G_("assignment of read-only location %qE"),
1590 G_("increment of read-only location %qE"),
1591 G_("decrement of read-only location %qE"),
1592 G_("read-only location %qE used as %<asm%> output")),
1593 arg);
1596 /* Print an error message for an invalid lvalue. USE says
1597 how the lvalue is being used and so selects the error message. LOC
1598 is the location for the error. */
1600 void
1601 lvalue_error (location_t loc, enum lvalue_use use)
1603 switch (use)
1605 case lv_assign:
1606 error_at (loc, "lvalue required as left operand of assignment");
1607 break;
1608 case lv_increment:
1609 error_at (loc, "lvalue required as increment operand");
1610 break;
1611 case lv_decrement:
1612 error_at (loc, "lvalue required as decrement operand");
1613 break;
1614 case lv_addressof:
1615 error_at (loc, "lvalue required as unary %<&%> operand");
1616 break;
1617 case lv_asm:
1618 error_at (loc, "lvalue required in asm statement");
1619 break;
1620 default:
1621 gcc_unreachable ();
1625 /* Print an error message for an invalid indirection of type TYPE.
1626 ERRSTRING is the name of the operator for the indirection. */
1628 void
1629 invalid_indirection_error (location_t loc, tree type, ref_operator errstring)
1631 switch (errstring)
1633 case RO_NULL:
1634 gcc_assert (c_dialect_cxx ());
1635 error_at (loc, "invalid type argument (have %qT)", type);
1636 break;
1637 case RO_ARRAY_INDEXING:
1638 error_at (loc,
1639 "invalid type argument of array indexing (have %qT)",
1640 type);
1641 break;
1642 case RO_UNARY_STAR:
1643 error_at (loc,
1644 "invalid type argument of unary %<*%> (have %qT)",
1645 type);
1646 break;
1647 case RO_ARROW:
1648 error_at (loc,
1649 "invalid type argument of %<->%> (have %qT)",
1650 type);
1651 break;
1652 case RO_ARROW_STAR:
1653 error_at (loc,
1654 "invalid type argument of %<->*%> (have %qT)",
1655 type);
1656 break;
1657 case RO_IMPLICIT_CONVERSION:
1658 error_at (loc,
1659 "invalid type argument of implicit conversion (have %qT)",
1660 type);
1661 break;
1662 default:
1663 gcc_unreachable ();
1667 /* Subscripting with type char is likely to lose on a machine where
1668 chars are signed. So warn on any machine, but optionally. Don't
1669 warn for unsigned char since that type is safe. Don't warn for
1670 signed char because anyone who uses that must have done so
1671 deliberately. Furthermore, we reduce the false positive load by
1672 warning only for non-constant value of type char. */
1674 void
1675 warn_array_subscript_with_type_char (location_t loc, tree index)
1677 if (TYPE_MAIN_VARIANT (TREE_TYPE (index)) == char_type_node
1678 && TREE_CODE (index) != INTEGER_CST)
1679 warning_at (loc, OPT_Wchar_subscripts,
1680 "array subscript has type %<char%>");
1683 /* Implement -Wparentheses for the unexpected C precedence rules, to
1684 cover cases like x + y << z which readers are likely to
1685 misinterpret. We have seen an expression in which CODE is a binary
1686 operator used to combine expressions ARG_LEFT and ARG_RIGHT, which
1687 before folding had CODE_LEFT and CODE_RIGHT. CODE_LEFT and
1688 CODE_RIGHT may be ERROR_MARK, which means that that side of the
1689 expression was not formed using a binary or unary operator, or it
1690 was enclosed in parentheses. */
1692 void
1693 warn_about_parentheses (location_t loc, enum tree_code code,
1694 enum tree_code code_left, tree arg_left,
1695 enum tree_code code_right, tree arg_right)
1697 if (!warn_parentheses)
1698 return;
1700 /* This macro tests that the expression ARG with original tree code
1701 CODE appears to be a boolean expression. or the result of folding a
1702 boolean expression. */
1703 #define APPEARS_TO_BE_BOOLEAN_EXPR_P(CODE, ARG) \
1704 (truth_value_p (TREE_CODE (ARG)) \
1705 || TREE_CODE (TREE_TYPE (ARG)) == BOOLEAN_TYPE \
1706 /* Folding may create 0 or 1 integers from other expressions. */ \
1707 || ((CODE) != INTEGER_CST \
1708 && (integer_onep (ARG) || integer_zerop (ARG))))
1710 switch (code)
1712 case LSHIFT_EXPR:
1713 if (code_left == PLUS_EXPR)
1714 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1715 "suggest parentheses around %<+%> inside %<<<%>");
1716 else if (code_right == PLUS_EXPR)
1717 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1718 "suggest parentheses around %<+%> inside %<<<%>");
1719 else if (code_left == MINUS_EXPR)
1720 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1721 "suggest parentheses around %<-%> inside %<<<%>");
1722 else if (code_right == MINUS_EXPR)
1723 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1724 "suggest parentheses around %<-%> inside %<<<%>");
1725 return;
1727 case RSHIFT_EXPR:
1728 if (code_left == PLUS_EXPR)
1729 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1730 "suggest parentheses around %<+%> inside %<>>%>");
1731 else if (code_right == PLUS_EXPR)
1732 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1733 "suggest parentheses around %<+%> inside %<>>%>");
1734 else if (code_left == MINUS_EXPR)
1735 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1736 "suggest parentheses around %<-%> inside %<>>%>");
1737 else if (code_right == MINUS_EXPR)
1738 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1739 "suggest parentheses around %<-%> inside %<>>%>");
1740 return;
1742 case TRUTH_ORIF_EXPR:
1743 if (code_left == TRUTH_ANDIF_EXPR)
1744 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1745 "suggest parentheses around %<&&%> within %<||%>");
1746 else if (code_right == TRUTH_ANDIF_EXPR)
1747 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1748 "suggest parentheses around %<&&%> within %<||%>");
1749 return;
1751 case BIT_IOR_EXPR:
1752 if (code_left == BIT_AND_EXPR || code_left == BIT_XOR_EXPR
1753 || code_left == PLUS_EXPR || code_left == MINUS_EXPR)
1754 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1755 "suggest parentheses around arithmetic in operand of %<|%>");
1756 else if (code_right == BIT_AND_EXPR || code_right == BIT_XOR_EXPR
1757 || code_right == PLUS_EXPR || code_right == MINUS_EXPR)
1758 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1759 "suggest parentheses around arithmetic in operand of %<|%>");
1760 /* Check cases like x|y==z */
1761 else if (TREE_CODE_CLASS (code_left) == tcc_comparison)
1762 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1763 "suggest parentheses around comparison in operand of %<|%>");
1764 else if (TREE_CODE_CLASS (code_right) == tcc_comparison)
1765 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1766 "suggest parentheses around comparison in operand of %<|%>");
1767 /* Check cases like !x | y */
1768 else if (code_left == TRUTH_NOT_EXPR
1769 && !APPEARS_TO_BE_BOOLEAN_EXPR_P (code_right, arg_right))
1770 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1771 "suggest parentheses around operand of "
1772 "%<!%> or change %<|%> to %<||%> or %<!%> to %<~%>");
1773 return;
1775 case BIT_XOR_EXPR:
1776 if (code_left == BIT_AND_EXPR
1777 || code_left == PLUS_EXPR || code_left == MINUS_EXPR)
1778 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1779 "suggest parentheses around arithmetic in operand of %<^%>");
1780 else if (code_right == BIT_AND_EXPR
1781 || code_right == PLUS_EXPR || code_right == MINUS_EXPR)
1782 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1783 "suggest parentheses around arithmetic in operand of %<^%>");
1784 /* Check cases like x^y==z */
1785 else if (TREE_CODE_CLASS (code_left) == tcc_comparison)
1786 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1787 "suggest parentheses around comparison in operand of %<^%>");
1788 else if (TREE_CODE_CLASS (code_right) == tcc_comparison)
1789 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1790 "suggest parentheses around comparison in operand of %<^%>");
1791 return;
1793 case BIT_AND_EXPR:
1794 if (code_left == PLUS_EXPR)
1795 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1796 "suggest parentheses around %<+%> in operand of %<&%>");
1797 else if (code_right == PLUS_EXPR)
1798 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1799 "suggest parentheses around %<+%> in operand of %<&%>");
1800 else if (code_left == MINUS_EXPR)
1801 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1802 "suggest parentheses around %<-%> in operand of %<&%>");
1803 else if (code_right == MINUS_EXPR)
1804 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1805 "suggest parentheses around %<-%> in operand of %<&%>");
1806 /* Check cases like x&y==z */
1807 else if (TREE_CODE_CLASS (code_left) == tcc_comparison)
1808 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1809 "suggest parentheses around comparison in operand of %<&%>");
1810 else if (TREE_CODE_CLASS (code_right) == tcc_comparison)
1811 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1812 "suggest parentheses around comparison in operand of %<&%>");
1813 /* Check cases like !x & y */
1814 else if (code_left == TRUTH_NOT_EXPR
1815 && !APPEARS_TO_BE_BOOLEAN_EXPR_P (code_right, arg_right))
1816 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1817 "suggest parentheses around operand of "
1818 "%<!%> or change %<&%> to %<&&%> or %<!%> to %<~%>");
1819 return;
1821 case EQ_EXPR:
1822 if (TREE_CODE_CLASS (code_left) == tcc_comparison)
1823 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1824 "suggest parentheses around comparison in operand of %<==%>");
1825 else if (TREE_CODE_CLASS (code_right) == tcc_comparison)
1826 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1827 "suggest parentheses around comparison in operand of %<==%>");
1828 return;
1829 case NE_EXPR:
1830 if (TREE_CODE_CLASS (code_left) == tcc_comparison)
1831 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1832 "suggest parentheses around comparison in operand of %<!=%>");
1833 else if (TREE_CODE_CLASS (code_right) == tcc_comparison)
1834 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1835 "suggest parentheses around comparison in operand of %<!=%>");
1836 return;
1838 default:
1839 if (TREE_CODE_CLASS (code) == tcc_comparison)
1841 if (TREE_CODE_CLASS (code_left) == tcc_comparison
1842 && code_left != NE_EXPR && code_left != EQ_EXPR
1843 && INTEGRAL_TYPE_P (TREE_TYPE (arg_left)))
1844 warning_at (EXPR_LOC_OR_LOC (arg_left, loc), OPT_Wparentheses,
1845 "comparisons like %<X<=Y<=Z%> do not "
1846 "have their mathematical meaning");
1847 else if (TREE_CODE_CLASS (code_right) == tcc_comparison
1848 && code_right != NE_EXPR && code_right != EQ_EXPR
1849 && INTEGRAL_TYPE_P (TREE_TYPE (arg_right)))
1850 warning_at (EXPR_LOC_OR_LOC (arg_right, loc), OPT_Wparentheses,
1851 "comparisons like %<X<=Y<=Z%> do not "
1852 "have their mathematical meaning");
1854 return;
1856 #undef NOT_A_BOOLEAN_EXPR_P
1859 /* If LABEL (a LABEL_DECL) has not been used, issue a warning. */
1861 void
1862 warn_for_unused_label (tree label)
1864 if (!TREE_USED (label))
1866 if (DECL_INITIAL (label))
1867 warning (OPT_Wunused_label, "label %q+D defined but not used", label);
1868 else
1869 warning (OPT_Wunused_label, "label %q+D declared but not defined", label);
1871 else if (asan_sanitize_use_after_scope ())
1873 if (asan_used_labels == NULL)
1874 asan_used_labels = new hash_set<tree> (16);
1876 asan_used_labels->add (label);
1880 /* Warn for division by zero according to the value of DIVISOR. LOC
1881 is the location of the division operator. */
1883 void
1884 warn_for_div_by_zero (location_t loc, tree divisor)
1886 /* If DIVISOR is zero, and has integral or fixed-point type, issue a warning
1887 about division by zero. Do not issue a warning if DIVISOR has a
1888 floating-point type, since we consider 0.0/0.0 a valid way of
1889 generating a NaN. */
1890 if (c_inhibit_evaluation_warnings == 0
1891 && (integer_zerop (divisor) || fixed_zerop (divisor)))
1892 warning_at (loc, OPT_Wdiv_by_zero, "division by zero");
1895 /* Warn for patterns where memset appears to be used incorrectly. The
1896 warning location should be LOC. ARG0, and ARG2 are the first and
1897 last arguments to the call, while LITERAL_ZERO_MASK has a 1 bit for
1898 each argument that was a literal zero. */
1900 void
1901 warn_for_memset (location_t loc, tree arg0, tree arg2,
1902 int literal_zero_mask)
1904 arg0 = fold_for_warn (arg0);
1905 arg2 = fold_for_warn (arg2);
1907 if (warn_memset_transposed_args
1908 && integer_zerop (arg2)
1909 && (literal_zero_mask & (1 << 2)) != 0
1910 && (literal_zero_mask & (1 << 1)) == 0)
1911 warning_at (loc, OPT_Wmemset_transposed_args,
1912 "%<memset%> used with constant zero length "
1913 "parameter; this could be due to transposed "
1914 "parameters");
1916 if (warn_memset_elt_size && TREE_CODE (arg2) == INTEGER_CST)
1918 STRIP_NOPS (arg0);
1919 if (TREE_CODE (arg0) == ADDR_EXPR)
1920 arg0 = TREE_OPERAND (arg0, 0);
1921 tree type = TREE_TYPE (arg0);
1922 if (type != NULL_TREE && TREE_CODE (type) == ARRAY_TYPE)
1924 tree elt_type = TREE_TYPE (type);
1925 tree domain = TYPE_DOMAIN (type);
1926 if (COMPLETE_TYPE_P (elt_type)
1927 && !integer_onep (TYPE_SIZE_UNIT (elt_type))
1928 && domain != NULL_TREE
1929 && TYPE_MAX_VALUE (domain)
1930 && TYPE_MIN_VALUE (domain)
1931 && integer_zerop (TYPE_MIN_VALUE (domain))
1932 && integer_onep (fold_build2 (MINUS_EXPR, domain,
1933 arg2,
1934 TYPE_MAX_VALUE (domain))))
1935 warning_at (loc, OPT_Wmemset_elt_size,
1936 "%<memset%> used with length equal to "
1937 "number of elements without multiplication "
1938 "by element size");
1943 /* Subroutine of build_binary_op. Give warnings for comparisons
1944 between signed and unsigned quantities that may fail. Do the
1945 checking based on the original operand trees ORIG_OP0 and ORIG_OP1,
1946 so that casts will be considered, but default promotions won't
1949 LOCATION is the location of the comparison operator.
1951 The arguments of this function map directly to local variables
1952 of build_binary_op. */
1954 void
1955 warn_for_sign_compare (location_t location,
1956 tree orig_op0, tree orig_op1,
1957 tree op0, tree op1,
1958 tree result_type, enum tree_code resultcode)
1960 if (error_operand_p (orig_op0) || error_operand_p (orig_op1))
1961 return;
1963 int op0_signed = !TYPE_UNSIGNED (TREE_TYPE (orig_op0));
1964 int op1_signed = !TYPE_UNSIGNED (TREE_TYPE (orig_op1));
1965 int unsignedp0, unsignedp1;
1967 /* In C++, check for comparison of different enum types. */
1968 if (c_dialect_cxx()
1969 && TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
1970 && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE
1971 && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0))
1972 != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
1974 warning_at (location,
1975 OPT_Wsign_compare, "comparison between types %qT and %qT",
1976 TREE_TYPE (orig_op0), TREE_TYPE (orig_op1));
1979 /* Do not warn if the comparison is being done in a signed type,
1980 since the signed type will only be chosen if it can represent
1981 all the values of the unsigned type. */
1982 if (!TYPE_UNSIGNED (result_type))
1983 /* OK */;
1984 /* Do not warn if both operands are unsigned. */
1985 else if (op0_signed == op1_signed)
1986 /* OK */;
1987 else
1989 tree sop, uop, base_type;
1990 bool ovf;
1992 if (op0_signed)
1993 sop = orig_op0, uop = orig_op1;
1994 else
1995 sop = orig_op1, uop = orig_op0;
1997 STRIP_TYPE_NOPS (sop);
1998 STRIP_TYPE_NOPS (uop);
1999 base_type = (TREE_CODE (result_type) == COMPLEX_TYPE
2000 ? TREE_TYPE (result_type) : result_type);
2002 /* Do not warn if the signed quantity is an unsuffixed integer
2003 literal (or some static constant expression involving such
2004 literals or a conditional expression involving such literals)
2005 and it is non-negative. */
2006 if (tree_expr_nonnegative_warnv_p (sop, &ovf))
2007 /* OK */;
2008 /* Do not warn if the comparison is an equality operation, the
2009 unsigned quantity is an integral constant, and it would fit
2010 in the result if the result were signed. */
2011 else if (TREE_CODE (uop) == INTEGER_CST
2012 && (resultcode == EQ_EXPR || resultcode == NE_EXPR)
2013 && int_fits_type_p (uop, c_common_signed_type (base_type)))
2014 /* OK */;
2015 /* In C, do not warn if the unsigned quantity is an enumeration
2016 constant and its maximum value would fit in the result if the
2017 result were signed. */
2018 else if (!c_dialect_cxx() && TREE_CODE (uop) == INTEGER_CST
2019 && TREE_CODE (TREE_TYPE (uop)) == ENUMERAL_TYPE
2020 && int_fits_type_p (TYPE_MAX_VALUE (TREE_TYPE (uop)),
2021 c_common_signed_type (base_type)))
2022 /* OK */;
2023 else
2024 warning_at (location, OPT_Wsign_compare,
2025 "comparison of integer expressions of different "
2026 "signedness: %qT and %qT", TREE_TYPE (orig_op0),
2027 TREE_TYPE (orig_op1));
2030 /* Warn if two unsigned values are being compared in a size larger
2031 than their original size, and one (and only one) is the result of
2032 a `~' operator. This comparison will always fail.
2034 Also warn if one operand is a constant, and the constant does not
2035 have all bits set that are set in the ~ operand when it is
2036 extended. */
2038 op0 = c_common_get_narrower (op0, &unsignedp0);
2039 op1 = c_common_get_narrower (op1, &unsignedp1);
2041 if ((TREE_CODE (op0) == BIT_NOT_EXPR)
2042 ^ (TREE_CODE (op1) == BIT_NOT_EXPR))
2044 if (TREE_CODE (op0) == BIT_NOT_EXPR)
2045 op0 = c_common_get_narrower (TREE_OPERAND (op0, 0), &unsignedp0);
2046 if (TREE_CODE (op1) == BIT_NOT_EXPR)
2047 op1 = c_common_get_narrower (TREE_OPERAND (op1, 0), &unsignedp1);
2049 if (tree_fits_shwi_p (op0) || tree_fits_shwi_p (op1))
2051 tree primop;
2052 HOST_WIDE_INT constant, mask;
2053 int unsignedp;
2054 unsigned int bits;
2056 if (tree_fits_shwi_p (op0))
2058 primop = op1;
2059 unsignedp = unsignedp1;
2060 constant = tree_to_shwi (op0);
2062 else
2064 primop = op0;
2065 unsignedp = unsignedp0;
2066 constant = tree_to_shwi (op1);
2069 bits = TYPE_PRECISION (TREE_TYPE (primop));
2070 if (bits < TYPE_PRECISION (result_type)
2071 && bits < HOST_BITS_PER_LONG && unsignedp)
2073 mask = HOST_WIDE_INT_M1U << bits;
2074 if ((mask & constant) != mask)
2076 if (constant == 0)
2077 warning_at (location, OPT_Wsign_compare,
2078 "promoted ~unsigned is always non-zero");
2079 else
2080 warning_at (location, OPT_Wsign_compare,
2081 "comparison of promoted ~unsigned with constant");
2085 else if (unsignedp0 && unsignedp1
2086 && (TYPE_PRECISION (TREE_TYPE (op0))
2087 < TYPE_PRECISION (result_type))
2088 && (TYPE_PRECISION (TREE_TYPE (op1))
2089 < TYPE_PRECISION (result_type)))
2090 warning_at (location, OPT_Wsign_compare,
2091 "comparison of promoted ~unsigned with unsigned");
2095 /* RESULT_TYPE is the result of converting TYPE1 and TYPE2 to a common
2096 type via c_common_type. If -Wdouble-promotion is in use, and the
2097 conditions for warning have been met, issue a warning. GMSGID is
2098 the warning message. It must have two %T specifiers for the type
2099 that was converted (generally "float") and the type to which it was
2100 converted (generally "double), respectively. LOC is the location
2101 to which the warning should refer. */
2103 void
2104 do_warn_double_promotion (tree result_type, tree type1, tree type2,
2105 const char *gmsgid, location_t loc)
2107 tree source_type;
2109 if (!warn_double_promotion)
2110 return;
2111 /* If the conversion will not occur at run-time, there is no need to
2112 warn about it. */
2113 if (c_inhibit_evaluation_warnings)
2114 return;
2115 /* If an invalid conversion has occured, don't warn. */
2116 if (result_type == error_mark_node)
2117 return;
2118 if (TYPE_MAIN_VARIANT (result_type) != double_type_node
2119 && TYPE_MAIN_VARIANT (result_type) != complex_double_type_node)
2120 return;
2121 if (TYPE_MAIN_VARIANT (type1) == float_type_node
2122 || TYPE_MAIN_VARIANT (type1) == complex_float_type_node)
2123 source_type = type1;
2124 else if (TYPE_MAIN_VARIANT (type2) == float_type_node
2125 || TYPE_MAIN_VARIANT (type2) == complex_float_type_node)
2126 source_type = type2;
2127 else
2128 return;
2129 warning_at (loc, OPT_Wdouble_promotion, gmsgid, source_type, result_type);
2132 /* Possibly warn about unused parameters. */
2134 void
2135 do_warn_unused_parameter (tree fn)
2137 tree decl;
2139 for (decl = DECL_ARGUMENTS (fn);
2140 decl; decl = DECL_CHAIN (decl))
2141 if (!TREE_USED (decl) && TREE_CODE (decl) == PARM_DECL
2142 && DECL_NAME (decl) && !DECL_ARTIFICIAL (decl)
2143 && !TREE_NO_WARNING (decl))
2144 warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wunused_parameter,
2145 "unused parameter %qD", decl);
2148 /* If DECL is a typedef that is declared in the current function,
2149 record it for the purpose of -Wunused-local-typedefs. */
2151 void
2152 record_locally_defined_typedef (tree decl)
2154 struct c_language_function *l;
2156 if (!warn_unused_local_typedefs
2157 || cfun == NULL
2158 /* if this is not a locally defined typedef then we are not
2159 interested. */
2160 || !is_typedef_decl (decl)
2161 || !decl_function_context (decl))
2162 return;
2164 l = (struct c_language_function *) cfun->language;
2165 vec_safe_push (l->local_typedefs, decl);
2168 /* If T is a TYPE_DECL declared locally, mark it as used. */
2170 void
2171 maybe_record_typedef_use (tree t)
2173 if (!is_typedef_decl (t))
2174 return;
2176 TREE_USED (t) = true;
2179 /* Warn if there are some unused locally defined typedefs in the
2180 current function. */
2182 void
2183 maybe_warn_unused_local_typedefs (void)
2185 int i;
2186 tree decl;
2187 /* The number of times we have emitted -Wunused-local-typedefs
2188 warnings. If this is different from errorcount, that means some
2189 unrelated errors have been issued. In which case, we'll avoid
2190 emitting "unused-local-typedefs" warnings. */
2191 static int unused_local_typedefs_warn_count;
2192 struct c_language_function *l;
2194 if (cfun == NULL)
2195 return;
2197 if ((l = (struct c_language_function *) cfun->language) == NULL)
2198 return;
2200 if (warn_unused_local_typedefs
2201 && errorcount == unused_local_typedefs_warn_count)
2203 FOR_EACH_VEC_SAFE_ELT (l->local_typedefs, i, decl)
2204 if (!TREE_USED (decl))
2205 warning_at (DECL_SOURCE_LOCATION (decl),
2206 OPT_Wunused_local_typedefs,
2207 "typedef %qD locally defined but not used", decl);
2208 unused_local_typedefs_warn_count = errorcount;
2211 vec_free (l->local_typedefs);
2214 /* If we're creating an if-else-if condition chain, first see if we
2215 already have this COND in the CHAIN. If so, warn and don't add COND
2216 into the vector, otherwise add the COND there. LOC is the location
2217 of COND. */
2219 void
2220 warn_duplicated_cond_add_or_warn (location_t loc, tree cond, vec<tree> **chain)
2222 /* No chain has been created yet. Do nothing. */
2223 if (*chain == NULL)
2224 return;
2226 if (TREE_SIDE_EFFECTS (cond))
2228 /* Uh-oh! This condition has a side-effect, thus invalidates
2229 the whole chain. */
2230 delete *chain;
2231 *chain = NULL;
2232 return;
2235 unsigned int ix;
2236 tree t;
2237 bool found = false;
2238 FOR_EACH_VEC_ELT (**chain, ix, t)
2239 if (operand_equal_p (cond, t, 0))
2241 auto_diagnostic_group d;
2242 if (warning_at (loc, OPT_Wduplicated_cond,
2243 "duplicated %<if%> condition"))
2244 inform (EXPR_LOCATION (t), "previously used here");
2245 found = true;
2246 break;
2249 if (!found
2250 && !CONSTANT_CLASS_P (cond)
2251 /* Don't infinitely grow the chain. */
2252 && (*chain)->length () < 512)
2253 (*chain)->safe_push (cond);
2256 /* Check and possibly warn if two declarations have contradictory
2257 attributes, such as always_inline vs. noinline. */
2259 bool
2260 diagnose_mismatched_attributes (tree olddecl, tree newdecl)
2262 bool warned = false;
2264 tree a1 = lookup_attribute ("optimize", DECL_ATTRIBUTES (olddecl));
2265 tree a2 = lookup_attribute ("optimize", DECL_ATTRIBUTES (newdecl));
2266 /* An optimization attribute applied on a declaration after the
2267 definition is likely not what the user wanted. */
2268 if (a2 != NULL_TREE
2269 && DECL_SAVED_TREE (olddecl) != NULL_TREE
2270 && (a1 == NULL_TREE || !attribute_list_equal (a1, a2)))
2271 warned |= warning (OPT_Wattributes,
2272 "optimization attribute on %qD follows "
2273 "definition but the attribute doesn%'t match",
2274 newdecl);
2276 /* Diagnose inline __attribute__ ((noinline)) which is silly. */
2277 if (DECL_DECLARED_INLINE_P (newdecl)
2278 && DECL_UNINLINABLE (olddecl)
2279 && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
2280 warned |= warning (OPT_Wattributes, "inline declaration of %qD follows "
2281 "declaration with attribute %<noinline%>", newdecl);
2282 else if (DECL_DECLARED_INLINE_P (olddecl)
2283 && DECL_UNINLINABLE (newdecl)
2284 && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl)))
2285 warned |= warning (OPT_Wattributes, "declaration of %q+D with attribute "
2286 "%<noinline%> follows inline declaration", newdecl);
2288 return warned;
2291 /* Warn if signed left shift overflows. We don't warn
2292 about left-shifting 1 into the sign bit in C++14; cf.
2293 <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3367.html#1457>
2294 and don't warn for C++2a at all, as signed left shifts never
2295 overflow.
2296 LOC is a location of the shift; OP0 and OP1 are the operands.
2297 Return true if an overflow is detected, false otherwise. */
2299 bool
2300 maybe_warn_shift_overflow (location_t loc, tree op0, tree op1)
2302 if (TREE_CODE (op0) != INTEGER_CST
2303 || TREE_CODE (op1) != INTEGER_CST)
2304 return false;
2306 tree type0 = TREE_TYPE (op0);
2307 unsigned int prec0 = TYPE_PRECISION (type0);
2309 /* Left-hand operand must be signed. */
2310 if (TYPE_UNSIGNED (type0) || cxx_dialect >= cxx2a)
2311 return false;
2313 unsigned int min_prec = (wi::min_precision (wi::to_wide (op0), SIGNED)
2314 + TREE_INT_CST_LOW (op1));
2315 /* Handle the case of left-shifting 1 into the sign bit.
2316 * However, shifting 1 _out_ of the sign bit, as in
2317 * INT_MIN << 1, is considered an overflow.
2319 if (!tree_int_cst_sign_bit (op0) && min_prec == prec0 + 1)
2321 /* Never warn for C++14 onwards. */
2322 if (cxx_dialect >= cxx14)
2323 return false;
2324 /* Otherwise only if -Wshift-overflow=2. But return
2325 true to signal an overflow for the sake of integer
2326 constant expressions. */
2327 if (warn_shift_overflow < 2)
2328 return true;
2331 bool overflowed = min_prec > prec0;
2332 if (overflowed && c_inhibit_evaluation_warnings == 0)
2333 warning_at (loc, OPT_Wshift_overflow_,
2334 "result of %qE requires %u bits to represent, "
2335 "but %qT only has %u bits",
2336 build2_loc (loc, LSHIFT_EXPR, type0, op0, op1),
2337 min_prec, type0, prec0);
2339 return overflowed;
2342 /* Warn about boolean expression compared with an integer value different
2343 from true/false. Warns also e.g. about "(i1 == i2) == 2".
2344 LOC is the location of the comparison, CODE is its code, OP0 and OP1
2345 are the operands of the comparison. The caller must ensure that
2346 either operand is a boolean expression. */
2348 void
2349 maybe_warn_bool_compare (location_t loc, enum tree_code code, tree op0,
2350 tree op1)
2352 if (TREE_CODE_CLASS (code) != tcc_comparison)
2353 return;
2355 tree f, cst;
2356 if (f = fold_for_warn (op0),
2357 TREE_CODE (f) == INTEGER_CST)
2358 cst = op0 = f;
2359 else if (f = fold_for_warn (op1),
2360 TREE_CODE (f) == INTEGER_CST)
2361 cst = op1 = f;
2362 else
2363 return;
2365 if (!integer_zerop (cst) && !integer_onep (cst))
2367 int sign = (TREE_CODE (op0) == INTEGER_CST
2368 ? tree_int_cst_sgn (cst) : -tree_int_cst_sgn (cst));
2369 if (code == EQ_EXPR
2370 || ((code == GT_EXPR || code == GE_EXPR) && sign < 0)
2371 || ((code == LT_EXPR || code == LE_EXPR) && sign > 0))
2372 warning_at (loc, OPT_Wbool_compare, "comparison of constant %qE "
2373 "with boolean expression is always false", cst);
2374 else
2375 warning_at (loc, OPT_Wbool_compare, "comparison of constant %qE "
2376 "with boolean expression is always true", cst);
2378 else if (integer_zerop (cst) || integer_onep (cst))
2380 /* If the non-constant operand isn't of a boolean type, we
2381 don't want to warn here. */
2382 tree noncst = TREE_CODE (op0) == INTEGER_CST ? op1 : op0;
2383 /* Handle booleans promoted to integers. */
2384 if (bool_promoted_to_int_p (noncst))
2385 /* Warn. */;
2386 else if (TREE_CODE (TREE_TYPE (noncst)) != BOOLEAN_TYPE
2387 && !truth_value_p (TREE_CODE (noncst)))
2388 return;
2389 /* Do some magic to get the right diagnostics. */
2390 bool flag = TREE_CODE (op0) == INTEGER_CST;
2391 flag = integer_zerop (cst) ? flag : !flag;
2392 if ((code == GE_EXPR && !flag) || (code == LE_EXPR && flag))
2393 warning_at (loc, OPT_Wbool_compare, "comparison of constant %qE "
2394 "with boolean expression is always true", cst);
2395 else if ((code == LT_EXPR && !flag) || (code == GT_EXPR && flag))
2396 warning_at (loc, OPT_Wbool_compare, "comparison of constant %qE "
2397 "with boolean expression is always false", cst);
2401 /* Warn if an argument at position param_pos is passed to a
2402 restrict-qualified param, and it aliases with another argument.
2403 Return true if a warning has been issued. */
2405 bool
2406 warn_for_restrict (unsigned param_pos, tree *argarray, unsigned nargs)
2408 tree arg = argarray[param_pos];
2409 if (TREE_VISITED (arg) || integer_zerop (arg))
2410 return false;
2412 location_t loc = EXPR_LOC_OR_LOC (arg, input_location);
2413 gcc_rich_location richloc (loc);
2415 unsigned i;
2416 auto_vec<int, 16> arg_positions;
2418 for (i = 0; i < nargs; i++)
2420 if (i == param_pos)
2421 continue;
2423 tree current_arg = argarray[i];
2424 if (operand_equal_p (arg, current_arg, 0))
2426 TREE_VISITED (current_arg) = 1;
2427 arg_positions.safe_push (i + 1);
2431 if (arg_positions.is_empty ())
2432 return false;
2434 int pos;
2435 FOR_EACH_VEC_ELT (arg_positions, i, pos)
2437 arg = argarray[pos - 1];
2438 if (EXPR_HAS_LOCATION (arg))
2439 richloc.add_range (EXPR_LOCATION (arg));
2442 return warning_n (&richloc, OPT_Wrestrict, arg_positions.length (),
2443 "passing argument %i to restrict-qualified parameter"
2444 " aliases with argument %Z",
2445 "passing argument %i to restrict-qualified parameter"
2446 " aliases with arguments %Z",
2447 param_pos + 1, arg_positions.address (),
2448 arg_positions.length ());
2451 /* Callback function to determine whether an expression TP or one of its
2452 subexpressions comes from macro expansion. Used to suppress bogus
2453 warnings. */
2455 static tree
2456 expr_from_macro_expansion_r (tree *tp, int *, void *)
2458 if (CAN_HAVE_LOCATION_P (*tp)
2459 && from_macro_expansion_at (EXPR_LOCATION (*tp)))
2460 return integer_zero_node;
2462 return NULL_TREE;
2465 /* Possibly warn when an if-else has identical branches. */
2467 static void
2468 do_warn_duplicated_branches (tree expr)
2470 tree thenb = COND_EXPR_THEN (expr);
2471 tree elseb = COND_EXPR_ELSE (expr);
2473 /* Don't bother if any of the branches is missing. */
2474 if (thenb == NULL_TREE || elseb == NULL_TREE)
2475 return;
2477 /* And don't warn for empty statements. */
2478 if (TREE_CODE (thenb) == NOP_EXPR
2479 && TREE_TYPE (thenb) == void_type_node
2480 && TREE_OPERAND (thenb, 0) == size_zero_node)
2481 return;
2483 /* ... or empty branches. */
2484 if (TREE_CODE (thenb) == STATEMENT_LIST
2485 && STATEMENT_LIST_HEAD (thenb) == NULL)
2486 return;
2488 /* Compute the hash of the then branch. */
2489 inchash::hash hstate0 (0);
2490 inchash::add_expr (thenb, hstate0);
2491 hashval_t h0 = hstate0.end ();
2493 /* Compute the hash of the else branch. */
2494 inchash::hash hstate1 (0);
2495 inchash::add_expr (elseb, hstate1);
2496 hashval_t h1 = hstate1.end ();
2498 /* Compare the hashes. */
2499 if (h0 == h1
2500 && operand_equal_p (thenb, elseb, OEP_LEXICOGRAPHIC)
2501 /* Don't warn if any of the branches or their subexpressions comes
2502 from a macro. */
2503 && !walk_tree_without_duplicates (&thenb, expr_from_macro_expansion_r,
2504 NULL)
2505 && !walk_tree_without_duplicates (&elseb, expr_from_macro_expansion_r,
2506 NULL))
2507 warning_at (EXPR_LOCATION (expr), OPT_Wduplicated_branches,
2508 "this condition has identical branches");
2511 /* Callback for c_genericize to implement -Wduplicated-branches. */
2513 tree
2514 do_warn_duplicated_branches_r (tree *tp, int *, void *)
2516 if (TREE_CODE (*tp) == COND_EXPR)
2517 do_warn_duplicated_branches (*tp);
2518 return NULL_TREE;
2521 /* Implementation of -Wmultistatement-macros. This warning warns about
2522 cases when a macro expands to multiple statements not wrapped in
2523 do {} while (0) or ({ }) and is used as a body of if/else/for/while
2524 conditionals. For example,
2526 #define DOIT x++; y++
2528 if (c)
2529 DOIT;
2531 will increment y unconditionally.
2533 BODY_LOC is the location of the first token in the body after labels
2534 have been parsed, NEXT_LOC is the location of the next token after the
2535 body of the conditional has been parsed, and GUARD_LOC is the location
2536 of the conditional. */
2538 void
2539 warn_for_multistatement_macros (location_t body_loc, location_t next_loc,
2540 location_t guard_loc, enum rid keyword)
2542 if (!warn_multistatement_macros)
2543 return;
2545 /* Ain't got time to waste. We only care about macros here. */
2546 if (!from_macro_expansion_at (body_loc)
2547 || !from_macro_expansion_at (next_loc))
2548 return;
2550 /* Let's skip macros defined in system headers. */
2551 if (in_system_header_at (body_loc)
2552 || in_system_header_at (next_loc))
2553 return;
2555 /* Find the actual tokens in the macro definition. BODY_LOC and
2556 NEXT_LOC have to come from the same spelling location, but they
2557 will resolve to different locations in the context of the macro
2558 definition. */
2559 location_t body_loc_exp
2560 = linemap_resolve_location (line_table, body_loc,
2561 LRK_MACRO_DEFINITION_LOCATION, NULL);
2562 location_t next_loc_exp
2563 = linemap_resolve_location (line_table, next_loc,
2564 LRK_MACRO_DEFINITION_LOCATION, NULL);
2565 location_t guard_loc_exp
2566 = linemap_resolve_location (line_table, guard_loc,
2567 LRK_MACRO_DEFINITION_LOCATION, NULL);
2569 /* These are some funky cases we don't want to warn about. */
2570 if (body_loc_exp == guard_loc_exp
2571 || next_loc_exp == guard_loc_exp
2572 || body_loc_exp == next_loc_exp)
2573 return;
2575 /* Find the macro maps for the macro expansions. */
2576 const line_map *body_map = linemap_lookup (line_table, body_loc);
2577 const line_map *next_map = linemap_lookup (line_table, next_loc);
2578 const line_map *guard_map = linemap_lookup (line_table, guard_loc);
2580 /* Now see if the following token (after the body) is coming from the
2581 same macro expansion. If it is, it might be a problem. */
2582 if (body_map != next_map)
2583 return;
2585 /* The conditional itself must not come from the same expansion, because
2586 we don't want to warn about
2587 #define IF if (x) x++; y++
2588 and similar. */
2589 if (guard_map == body_map)
2590 return;
2592 /* Handle the case where NEXT and BODY come from the same expansion while
2593 GUARD doesn't, yet we shouldn't warn. E.g.
2595 #define GUARD if (...)
2596 #define GUARD2 GUARD
2598 and in the definition of another macro:
2600 GUARD2
2601 foo ();
2602 return 1;
2604 while (linemap_macro_expansion_map_p (guard_map))
2606 const line_map_macro *mm = linemap_check_macro (guard_map);
2607 guard_loc_exp = MACRO_MAP_EXPANSION_POINT_LOCATION (mm);
2608 guard_map = linemap_lookup (line_table, guard_loc_exp);
2609 if (guard_map == body_map)
2610 return;
2613 auto_diagnostic_group d;
2614 if (warning_at (body_loc, OPT_Wmultistatement_macros,
2615 "macro expands to multiple statements"))
2616 inform (guard_loc, "some parts of macro expansion are not guarded by "
2617 "this %qs clause", guard_tinfo_to_string (keyword));