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