The attached patch replaces the uses of TREE_NO_WARNING in the C
family common subset of the C and C++ front ends.
Add support for per-location warning groups.
gcc/c-family/ChangeLog:
* c-common.c (c_wrap_maybe_const): Remove TREE_NO_WARNING.
(c_common_truthvalue_conversion): Replace direct uses of
TREE_NO_WARNING with get_no_warning, set_no_warning, and
copy_no_warning.
(check_function_arguments_recurse): Same.
* c-gimplify.c (c_gimplify_expr): Same.
* c-warn.c (overflow_warning): Same.
(warn_logical_operator): Same.
(warn_if_unused_value): Same.
(do_warn_unused_parameter): Same.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index b7daa2e2654..a97376c5fd1 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -3236,7 +3236,6 @@ pointer_int_sum (location_t loc, enum tree_code resultcode,
tree
c_wrap_maybe_const (tree expr, bool non_const)
{
- bool nowarning = TREE_NO_WARNING (expr);
location_t loc = EXPR_LOCATION (expr);
/* This should never be called for C++. */
@@ -3247,8 +3246,6 @@ c_wrap_maybe_const (tree expr, bool non_const)
STRIP_TYPE_NOPS (expr);
expr = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (expr), NULL, expr);
C_MAYBE_CONST_EXPR_NON_CONST (expr) = non_const;
- if (nowarning)
- TREE_NO_WARNING (expr) = 1;
protected_set_expr_location (expr, loc);
return expr;
@@ -3494,12 +3491,12 @@ c_common_truthvalue_conversion (location_t location, tree expr)
break;
case MODIFY_EXPR:
- if (!TREE_NO_WARNING (expr)
+ if (!get_no_warning (expr, OPT_Wparentheses)
&& warn_parentheses
&& warning_at (location, OPT_Wparentheses,
"suggest parentheses around assignment used as "
"truth value"))
- TREE_NO_WARNING (expr) = 1;
+ set_no_warning (expr, OPT_Wparentheses);
break;
case CONST_DECL:
@@ -5880,7 +5877,7 @@ check_function_arguments_recurse (void (*callback)
void *ctx, tree param,
unsigned HOST_WIDE_INT param_num)
{
- if (TREE_NO_WARNING (param))
+ if (get_no_warning (param))
return;
if (CONVERT_EXPR_P (param)
diff --git a/gcc/c-family/c-gimplify.c b/gcc/c-family/c-gimplify.c
index 39c969d8f40..8a6b36fc846 100644
--- a/gcc/c-family/c-gimplify.c
+++ b/gcc/c-family/c-gimplify.c
@@ -713,7 +713,7 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED,
&& !TREE_STATIC (DECL_EXPR_DECL (*expr_p))
&& (DECL_INITIAL (DECL_EXPR_DECL (*expr_p)) == DECL_EXPR_DECL (*expr_p))
&& !warn_init_self)
- TREE_NO_WARNING (DECL_EXPR_DECL (*expr_p)) = 1;
+ set_no_warning (DECL_EXPR_DECL (*expr_p), OPT_Winit_self);
break;
case PREINCREMENT_EXPR:
diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c
index c48dc2e6d24..2af2bc0a43f 100644
--- a/gcc/c-family/c-warn.c
+++ b/gcc/c-family/c-warn.c
@@ -155,7 +155,7 @@ overflow_warning (location_t loc, tree value, tree expr)
value);
if (warned)
- TREE_NO_WARNING (value) = 1;
+ set_no_warning (value, OPT_Woverflow);
}
/* Helper function for walk_tree. Unwrap C_MAYBE_CONST_EXPRs in an expression
@@ -219,7 +219,7 @@ warn_logical_operator (location_t location, enum tree_code code, tree type,
&& INTEGRAL_TYPE_P (TREE_TYPE (op_left))
&& !CONSTANT_CLASS_P (stripped_op_left)
&& TREE_CODE (stripped_op_left) != CONST_DECL
- && !TREE_NO_WARNING (op_left)
+ && !get_no_warning (op_left, OPT_Wlogical_op)
&& TREE_CODE (op_right) == INTEGER_CST
&& !integer_zerop (op_right)
&& !integer_onep (op_right))
@@ -234,7 +234,7 @@ warn_logical_operator (location_t location, enum tree_code code, tree type,
= warning_at (location, OPT_Wlogical_op,
"logical %<and%> applied to non-boolean constant");
if (warned)
- TREE_NO_WARNING (op_left) = true;
+ set_no_warning (op_left, OPT_Wlogical_op);
return;
}
@@ -588,7 +588,7 @@ bool
warn_if_unused_value (const_tree exp, location_t locus, bool quiet)
{
restart:
- if (TREE_USED (exp) || TREE_NO_WARNING (exp))
+ if (TREE_USED (exp) || get_no_warning (exp, OPT_Wunused_value))
return false;
/* Don't warn about void constructs. This includes casting to void,
@@ -2422,7 +2422,7 @@ do_warn_unused_parameter (tree fn)
decl; decl = DECL_CHAIN (decl))
if (!TREE_USED (decl) && TREE_CODE (decl) == PARM_DECL
&& DECL_NAME (decl) && !DECL_ARTIFICIAL (decl)
- && !TREE_NO_WARNING (decl))
+ && !get_no_warning (decl, OPT_Wunused_parameter))
warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wunused_parameter,
"unused parameter %qD", decl);
}