From 51c9a8ac2caa0432730c78d00989fd01f3ac6fe5 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Mon, 30 Aug 2021 22:36:47 +0200
Subject: [PATCH 3/3] Don't maintain a warning spec for
'UNKNOWN_LOCATION'/'BUILTINS_LOCATION' [PR101574]
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This resolves PR101574 "gcc/sparseset.h:215:20: error: suggest parentheses
around assignment used as truth value [-Werror=parentheses]", as (bogusly)
reported at commit a61f6afbee370785cf091fe46e2e022748528307:
In file included from [...]/source-gcc/gcc/lra-lives.c:43:
[...]/source-gcc/gcc/lra-lives.c: In function ‘void make_hard_regno_dead(int)’:
[...]/source-gcc/gcc/sparseset.h:215:20: error: suggest parentheses around assignment used as truth value [-Werror=parentheses]
215 | && (((ITER) = sparseset_iter_elm (SPARSESET)) || 1); \
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[...]/source-gcc/gcc/lra-lives.c:304:3: note: in expansion of macro ‘EXECUTE_IF_SET_IN_SPARSESET’
304 | EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, i)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
gcc/
PR bootstrap/101574
* diagnostic-spec.c (warning_suppressed_at, copy_warning): Handle
'RESERVED_LOCATION_P' locations.
* warning-control.cc (get_nowarn_spec, suppress_warning)
(copy_warning): Likewise.
---
gcc/diagnostic-spec.c | 22 ++++++++++++++++---
gcc/warning-control.cc | 48 +++++++++++++++++++++++++++---------------
2 files changed, 50 insertions(+), 20 deletions(-)
@@ -115,6 +115,8 @@ GTY(()) xint_hash_map_t *nowarn_map;
bool
warning_suppressed_at (location_t loc, opt_code opt /* = all_warnings */)
{
+ gcc_checking_assert (!RESERVED_LOCATION_P (loc));
+
if (!nowarn_map)
return false;
@@ -137,6 +139,8 @@ bool
suppress_warning_at (location_t loc, opt_code opt /* = all_warnings */,
bool supp /* = true */)
{
+ gcc_checking_assert (!RESERVED_LOCATION_P (loc));
+
const nowarn_spec_t optspec (supp ? opt : opt_code ());
if (nowarn_spec_t *pspec = nowarn_map ? nowarn_map->get (loc) : NULL)
@@ -173,8 +177,20 @@ copy_warning (location_t to, location_t from)
if (!nowarn_map)
return;
- if (nowarn_spec_t *pspec = nowarn_map->get (from))
- nowarn_map->put (to, *pspec);
+ nowarn_spec_t *from_spec;
+ if (RESERVED_LOCATION_P (from))
+ from_spec = NULL;
+ else
+ from_spec = nowarn_map->get (from);
+ if (RESERVED_LOCATION_P (to))
+ /* We cannot set no-warning dispositions for 'to', so we have no chance but
+ lose those potentially set for 'from'. */
+ ;
else
- nowarn_map->remove (to);
+ {
+ if (from_spec)
+ nowarn_map->put (to, *from_spec);
+ else
+ nowarn_map->remove (to);
+ }
}
@@ -89,7 +89,7 @@ get_nowarn_spec (const_tree expr)
{
const location_t loc = get_location (expr);
- if (loc == UNKNOWN_LOCATION)
+ if (RESERVED_LOCATION_P (loc))
return NULL;
if (!get_no_warning_bit (expr))
@@ -105,6 +105,9 @@ get_nowarn_spec (const gimple *stmt)
{
const location_t loc = get_location (stmt);
+ if (RESERVED_LOCATION_P (loc))
+ return NULL;
+
if (!get_no_warning_bit (stmt))
return NULL;
@@ -158,7 +161,8 @@ suppress_warning (tree expr, opt_code opt /* = all_warnings */,
const location_t loc = get_location (expr);
- supp = suppress_warning_at (loc, opt, supp) || supp;
+ if (!RESERVED_LOCATION_P (loc))
+ supp = suppress_warning_at (loc, opt, supp) || supp;
set_no_warning_bit (expr, supp);
}
@@ -174,7 +178,8 @@ suppress_warning (gimple *stmt, opt_code opt /* = all_warnings */,
const location_t loc = get_location (stmt);
- supp = suppress_warning_at (loc, opt, supp) || supp;
+ if (!RESERVED_LOCATION_P (loc))
+ supp = suppress_warning_at (loc, opt, supp) || supp;
set_no_warning_bit (stmt, supp);
}
@@ -186,24 +191,33 @@ void copy_warning (ToType to, FromType from)
{
const location_t to_loc = get_location (to);
- if (nowarn_spec_t *from_map = get_nowarn_spec (from))
- {
- /* If there's an entry in the map the no-warning bit must be set. */
- gcc_assert (get_no_warning_bit (from));
+ bool supp = get_no_warning_bit (from);
- gcc_checking_assert (nowarn_map);
- nowarn_map->put (to_loc, *from_map);
- set_no_warning_bit (to, true);
- }
+ nowarn_spec_t *from_spec = get_nowarn_spec (from);
+ if (RESERVED_LOCATION_P (to_loc))
+ /* We cannot set no-warning dispositions for 'to', so we have no chance but
+ lose those potentially set for 'from'. */
+ ;
else
{
- if (nowarn_map)
- nowarn_map->remove (to_loc);
-
- /* The no-warning bit might be set even if there's no entry
- in the map. */
- set_no_warning_bit (to, get_no_warning_bit (from));
+ if (from_spec)
+ {
+ /* If there's an entry in the map the no-warning bit must be set. */
+ gcc_assert (supp);
+
+ gcc_checking_assert (nowarn_map);
+ nowarn_map->put (to_loc, *from_spec);
+ }
+ else
+ {
+ if (nowarn_map)
+ nowarn_map->remove (to_loc);
+ }
}
+
+ /* The no-warning bit might be set even if the map has not been consulted, or
+ otherwise if there's no entry in the map. */
+ set_no_warning_bit (to, supp);
}
/* Copy the warning disposition mapping from one expression to another. */
--
2.25.1