]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: #pragma doesn't disable -Wunused-label [PR113582]
authorMarek Polacek <polacek@redhat.com>
Wed, 24 Jan 2024 23:06:48 +0000 (18:06 -0500)
committerMarek Polacek <polacek@redhat.com>
Wed, 8 May 2024 16:22:05 +0000 (12:22 -0400)
commitd9318caed3bbff8136d13e00dcfc020a59d10f78
tree30c1fe8184bce80b96b0af66c0e4c90d7b7561d3
parent5726de79e2154a16d8a045567d2cfad035f7ed19
c++: #pragma doesn't disable -Wunused-label [PR113582]

The PR complains that

  void do_something(){
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-label"
    start:;
    #pragma GCC diagnostic pop
  } #1

doesn't work.  That's because we warn_for_unused_label only while we're
in finish_function, meaning we're at #1 where we're outside the #pragma
region.  We can use suppress_warning + warning_suppressed_p to fix this.

Note that I'm not using TREE_USED.  Propagating it in tsubst_stmt/LABEL_EXPR
from decl to label would mean that we don't warn in do_something2, but
I think we want the warning there: we're in a template and the goto is
a discarded statement.

PR c++/113582

gcc/c-family/ChangeLog:

* c-warn.cc (warn_for_unused_label): Don't warn if -Wunused-label has
been suppressed for the label.

gcc/cp/ChangeLog:

* parser.cc (cp_parser_label_for_labeled_statement): suppress_warning
if it's not enabled at input_location.
* pt.cc (tsubst_stmt): Call copy_warning.

gcc/testsuite/ChangeLog:

* g++.dg/warn/Wunused-label-4.C: New test.
gcc/c-family/c-warn.cc
gcc/cp/parser.cc
gcc/cp/pt.cc
gcc/testsuite/g++.dg/warn/Wunused-label-4.C [new file with mode: 0644]