On Thu, 2020-11-05 at 11:03 -0500, Marek Polacek via Gcc-patches wrote: > This PR asks that we add a warning option for an existing (very old) > warning, so that it can be disabled selectively. clang++ uses > -Wexceptions for this, so I added this new option rather than using > e.g. -Wnoexcept. > > gcc/c-family/ChangeLog: > > PR c++/97675 > * c.opt (Wexceptions): New option. > > gcc/cp/ChangeLog: > > PR c++/97675 > * except.c (check_handlers_1): Use OPT_Wexceptions for the > warning. Use inform for the second part of the warning. > > gcc/ChangeLog: > > PR c++/97675 > * doc/invoke.texi: Document -Wexceptions. > > gcc/testsuite/ChangeLog: > > PR c++/97675 > * g++.old-deja/g++.eh/catch10.C: Adjust dg-warning. > * g++.dg/warn/Wexceptions1.C: New test. > * g++.dg/warn/Wexceptions2.C: New test. > --- > gcc/c-family/c.opt | 4 ++++ > gcc/cp/except.c | 9 ++++----- > gcc/doc/invoke.texi | 8 +++++++- > gcc/testsuite/g++.dg/warn/Wexceptions1.C | 9 +++++++++ > gcc/testsuite/g++.dg/warn/Wexceptions2.C | 10 ++++++++++ > gcc/testsuite/g++.old-deja/g++.eh/catch10.C | 4 ++-- > 6 files changed, 36 insertions(+), 8 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/warn/Wexceptions1.C > create mode 100644 gcc/testsuite/g++.dg/warn/Wexceptions2.C > > diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt > index 426636be839..9493acb82ff 100644 > --- a/gcc/c-family/c.opt > +++ b/gcc/c-family/c.opt > @@ -579,6 +579,10 @@ Werror-implicit-function-declaration > C ObjC RejectNegative Warning Alias(Werror=, implicit-function- > declaration) > This switch is deprecated; use -Werror=implicit-function-declaration > instead. > > +Wexceptions > +C++ ObjC++ Var(warn_exceptions) Init(1) > +Warn when an exception handler is shadowed by another handler. > + > Wextra > C ObjC C++ ObjC++ Warning > ; in common.opt > diff --git a/gcc/cp/except.c b/gcc/cp/except.c > index cb1a4105dae..985206f6a64 100644 > --- a/gcc/cp/except.c > +++ b/gcc/cp/except.c > @@ -975,11 +975,10 @@ check_handlers_1 (tree master, > tree_stmt_iterator i) > tree handler = tsi_stmt (i); > if (TREE_TYPE (handler) && can_convert_eh (type, TREE_TYPE > (handler))) > {
Can you add an auto_diagnostic_group here please. > - warning_at (EXPR_LOCATION (handler), 0, > - "exception of type %qT will be caught", > - TREE_TYPE (handler)); > - warning_at (EXPR_LOCATION (master), 0, > - " by earlier handler for %qT", type); > + if (warning_at (EXPR_LOCATION (handler), OPT_Wexceptions, > + "exception of type %qT will be caught by > earlier " > + "handler", TREE_TYPE (handler))) > + inform (EXPR_LOCATION (master), "for type %qT", type); > break; > } > } Thanks Dave