aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-family
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2022-05-07 16:15:49 -0400
committerMarek Polacek <polacek@redhat.com>2022-05-18 10:34:30 -0400
commit60fdce11dc9e5ddf671b07a3fc6ed70476860b22 (patch)
treec8f625cb6000e14bf77d49ce48b2683660526034 /gcc/c-family
parentdfe38b8d5dbfe3dd5209aece4ce2f7a6b303a2f9 (diff)
downloadgcc-60fdce11dc9e5ddf671b07a3fc6ed70476860b22.zip
gcc-60fdce11dc9e5ddf671b07a3fc6ed70476860b22.tar.gz
gcc-60fdce11dc9e5ddf671b07a3fc6ed70476860b22.tar.bz2
c, c++: -Wswitch warning on [[maybe_unused]] enumerator [PR105497]
This PR complains that we emit the "enumeration value not handled in switch" warning even though the enumerator was marked with the [[maybe_unused]] attribute. I couldn't just check TREE_USED, because the enumerator could have been used earlier in the function, which doesn't play well with the c_do_switch_warnings warning. Instead, I had to check the attributes on the CONST_DECL. This is easy since the TYPE_VALUES of an enum type are now consistent between C and C++, both of which store the CONST_DECL in its TREE_VALUE. PR c++/105497 gcc/c-family/ChangeLog: * c-warn.cc (c_do_switch_warnings): Don't warn about unhandled enumerator when it was marked with attribute unused. gcc/testsuite/ChangeLog: * c-c++-common/Wswitch-1.c: New test. * g++.dg/warn/Wswitch-4.C: New test.
Diffstat (limited to 'gcc/c-family')
-rw-r--r--gcc/c-family/c-warn.cc11
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc
index cae8929..ea7335f 100644
--- a/gcc/c-family/c-warn.cc
+++ b/gcc/c-family/c-warn.cc
@@ -1738,8 +1738,8 @@ c_do_switch_warnings (splay_tree cases, location_t switch_location,
for (chain = TYPE_VALUES (type); chain; chain = TREE_CHAIN (chain))
{
tree value = TREE_VALUE (chain);
- if (TREE_CODE (value) == CONST_DECL)
- value = DECL_INITIAL (value);
+ tree attrs = DECL_ATTRIBUTES (value);
+ value = DECL_INITIAL (value);
node = splay_tree_lookup (cases, (splay_tree_key) value);
if (node)
{
@@ -1769,6 +1769,13 @@ c_do_switch_warnings (splay_tree cases, location_t switch_location,
/* We've now determined that this enumerated literal isn't
handled by the case labels of the switch statement. */
+ /* Don't warn if the enumerator was marked as unused. We can't use
+ TREE_USED here: it could have been set on the enumerator if the
+ enumerator was used earlier. */
+ if (lookup_attribute ("unused", attrs)
+ || lookup_attribute ("maybe_unused", attrs))
+ continue;
+
/* If the switch expression is a constant, we only really care
about whether that constant is handled by the switch. */
if (cond && tree_int_cst_compare (cond, value))