aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@codesourcery.com>2021-08-30 22:36:47 +0200
committerThomas Schwinge <thomas@codesourcery.com>2021-09-13 18:38:52 +0200
commit6c79057fae6bbb36c4a4fd61c5b7107a16b71b17 (patch)
treedb148081651c13c52fd54fc81d33e58c00857d61 /gcc
parent1985392242d9a6bf8b091f78143d3c1fa9ccd284 (diff)
downloadgcc-6c79057fae6bbb36c4a4fd61c5b7107a16b71b17.zip
gcc-6c79057fae6bbb36c4a4fd61c5b7107a16b71b17.tar.gz
gcc-6c79057fae6bbb36c4a4fd61c5b7107a16b71b17.tar.bz2
Don't maintain a warning spec for 'UNKNOWN_LOCATION'/'BUILTINS_LOCATION' [PR101574]
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/diagnostic-spec.c22
-rw-r--r--gcc/warning-control.cc48
2 files changed, 50 insertions, 20 deletions
diff --git a/gcc/diagnostic-spec.c b/gcc/diagnostic-spec.c
index eac5a33..85ffb72 100644
--- a/gcc/diagnostic-spec.c
+++ b/gcc/diagnostic-spec.c
@@ -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);
+ }
}
diff --git a/gcc/warning-control.cc b/gcc/warning-control.cc
index 8d6c082..36a47ab 100644
--- a/gcc/warning-control.cc
+++ b/gcc/warning-control.cc
@@ -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. */