On 24 May, Jason Merrill wrote: > On Mon, May 15, 2017 at 3:58 PM, Martin Sebor <mse...@gmail.com> wrote: >>> So how about the following then? I stayed with the catch part and added >>> a parameter to the warning to let the user decide on the warnings she/he >>> wants to get: -Wcatch-value=n. >>> -Wcatch-value=1 only warns for polymorphic classes that are caught by >>> value (to avoid slicing), -Wcatch-value=2 warns for all classes that >>> are caught by value (to avoid copies). And finally -Wcatch-value=3 >>> warns for everything not caught by reference to find typos (like pointer >>> instead of reference) and bad coding practices. >> >> It seems reasonable to me. I'm not too fond of multi-level >> warnings since few users take advantage of anything but the >> default, but this case is simple and innocuous enough that >> I don't think it can do harm. > >>> Bootstrapped and regtested on x86_64-pc-linux-gnu. >>> OK for trunk? > > OK.
Committed. >>> If so, would it make sense to add -Wcatch-value=1 to -Wextra or even -Wall? >>> I would do this in a seperate patch, becuase I haven't checked what that >>> would mean for the testsuite. >> >> I can't think of a use case for polymorphic slicing that's not >> harmful so unless there is a common one that escapes me, I'd say >> -Wall. > > Agreed. But then you'll probably want to allow -Wno-catch-value to turn it > off. > > Jason So how about the following then? Bootstrapped and regtested on x86_64-pc-linux-gnu. OK for trunk? Regards, Volker 2017-05-30 Volker Reichelt <v.reich...@netcologne.de> * doc/invoke.texi (-Wcatch-value): Document new shortcut. Add to -Wall section. Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi (revision 248585) +++ gcc/doc/invoke.texi (working copy) @@ -265,8 +265,8 @@ -Wno-builtin-declaration-mismatch @gol -Wno-builtin-macro-redefined -Wc90-c99-compat -Wc99-c11-compat @gol -Wc++-compat -Wc++11-compat -Wc++14-compat -Wcast-align -Wcast-qual @gol --Wchar-subscripts -Wchkp -Wcatch-value=@var{n} -Wclobbered -Wcomment @gol --Wconditionally-supported @gol +-Wchar-subscripts -Wchkp -Wcatch-value -Wcatch-value=@var{n} @gol +-Wclobbered -Wcomment -Wconditionally-supported @gol -Wconversion -Wcoverage-mismatch -Wno-cpp -Wdangling-else -Wdate-time @gol -Wdelete-incomplete @gol -Wno-deprecated -Wno-deprecated-declarations -Wno-designated-init @gol @@ -3757,6 +3757,7 @@ -Wbool-compare @gol -Wbool-operation @gol -Wc++11-compat -Wc++14-compat @gol +-Wcatch-value @r{(C++ and Objective-C++ only)} @gol -Wchar-subscripts @gol -Wcomment @gol -Wduplicate-decl-specifier @r{(C and Objective-C only)} @gol @@ -5834,13 +5835,16 @@ literals to @code{char *}. This warning is enabled by default for C++ programs. -@item -Wcatch-value=@var{n} @r{(C++ and Objective-C++ only)} +@item -Wcatch-value +@itemx -Wcatch-value=@var{n} @r{(C++ and Objective-C++ only)} @opindex Wcatch-value +@opindex Wno-catch-value Warn about catch handlers that do not catch via reference. -With @option{-Wcatch-value=1} warn about polymorphic class types that -are caught by value. With @option{-Wcatch-value=2} warn about all class -types that are caught by value. With @option{-Wcatch-value=3} warn about -all types that are not caught by reference. +With @option{-Wcatch-value=1} (or @option{-Wcatch-value} for short) +warn about polymorphic class types that are caught by value. +With @option{-Wcatch-value=2} warn about all class types that are caught +by value. With @option{-Wcatch-value=3} warn about all types that are +not caught by reference. @option{-Wcatch-value} is enabled by @option{-Wall}. @item -Wclobbered @opindex Wclobbered =================================================================== 2017-05-30 Volker Reichelt <v.reich...@netcologne.de> * c.opt (Wcatch-value): New shortcut for Wcatch-value=1. (Wcatch-value=1): Enable by -Wall. Index: gcc/c-family/c.opt =================================================================== --- gcc/c-family/c.opt (revision 248585) +++ gcc/c-family/c.opt (working copy) @@ -388,8 +388,12 @@ C ObjC C++ ObjC++ Var(warn_cast_qual) Warning Warn about casts which discard qualifiers. +Wcatch-value +C++ ObjC++ Warning Alias(Wcatch-value=, 1, 0) +Warn about catch handlers of non-reference type. + Wcatch-value= -C++ ObjC++ Var(warn_catch_value) Warning Joined RejectNegative UInteger +C++ ObjC++ Var(warn_catch_value) Warning Joined RejectNegative UInteger LangEnabledBy(C++ ObjC++,Wall, 1, 0) Warn about catch handlers of non-reference type. Wchar-subscripts ===================================================================