This patch adds a new warning option: Winaccessible-base, so that users are able to selectively control the warning. The warning is enabled by default; however, for the virtual bases' warning, it only triggers with -Wextra flag.
Bootstrapped/regtested on x86_64-linux, ok for trunk?
2019-06-07 Matthew Beliveau <mbeli...@redhat.com> PR c++/90449 - add -Winaccessible-base option. * doc/invoke.texi (Winaccessible-base): Document. * c.opt (Winaccessible-base): Added new option. * class.c (warn_about_ambiguous_bases): Implemented new Winaccessible-base warning option for both direct and virtual base warnings. * g++.dg/warn/Winaccessible-base-1.C: New file. * g++.dg/warn/Winaccessible-base-2.C: New file. * g++.dg/warn/Winaccessible-virtual-base-1.C: New file. * g++.dg/warn/Winaccessible-virtual-base-2.C: New file. diff --git gcc/c-family/c.opt gcc/c-family/c.opt index 046d489f7eb..144f6da15d6 100644 --- gcc/c-family/c.opt +++ gcc/c-family/c.opt @@ -625,6 +625,10 @@ Wignored-attributes C C++ Var(warn_ignored_attributes) Init(1) Warning Warn whenever attributes are ignored. +Winaccessible-base +C++ ObjC++ Var(warn_inaccessible_base) Init(1) Warning +Warn when a base is inaccessible in derived due to ambiguity. + Wincompatible-pointer-types C ObjC Var(warn_incompatible_pointer_types) Init(1) Warning Warn when there is a conversion between pointers that have incompatible types. diff --git gcc/cp/class.c gcc/cp/class.c index a2585a61f96..0f26b34e38e 100644 --- gcc/cp/class.c +++ gcc/cp/class.c @@ -6025,6 +6025,10 @@ warn_about_ambiguous_bases (tree t) tree binfo; tree base_binfo; + /* If not checking for warning then return early. */ + if (!warn_inaccessible_base) + return; + /* If there are no repeated bases, nothing can be ambiguous. */ if (!CLASSTYPE_REPEATED_BASE_P (t)) return; @@ -6036,8 +6040,8 @@ warn_about_ambiguous_bases (tree t) basetype = BINFO_TYPE (base_binfo); if (!uniquely_derived_from_p (basetype, t)) - warning (0, "direct base %qT inaccessible in %qT due to ambiguity", - basetype, t); + warning (OPT_Winaccessible_base, "direct base %qT inaccessible " + "in %qT due to ambiguity", basetype, t); } /* Check for ambiguous virtual bases. */ @@ -6048,8 +6052,8 @@ warn_about_ambiguous_bases (tree t) basetype = BINFO_TYPE (binfo); if (!uniquely_derived_from_p (basetype, t)) - warning (OPT_Wextra, "virtual base %qT inaccessible in %qT due " - "to ambiguity", basetype, t); + warning (OPT_Winaccessible_base, "virtual base %qT inaccessible in " + "%qT due to ambiguity", basetype, t); } } diff --git gcc/doc/invoke.texi gcc/doc/invoke.texi index 3e4f012b4fa..862ee794773 100644 --- gcc/doc/invoke.texi +++ gcc/doc/invoke.texi @@ -317,6 +317,7 @@ Objective-C and Objective-C++ Dialects}. -Wignored-qualifiers -Wignored-attributes -Wincompatible-pointer-types @gol -Wimplicit -Wimplicit-fallthrough -Wimplicit-fallthrough=@var{n} @gol -Wimplicit-function-declaration -Wimplicit-int @gol +-Winaccessible-base @gol -Winit-self -Winline -Wno-int-conversion -Wint-in-bool-context @gol -Wno-int-to-pointer-cast -Winvalid-memory-model -Wno-invalid-offsetof @gol -Winvalid-pch -Wlarger-than=@var{byte-size} @gol @@ -4800,6 +4801,22 @@ is only active when @option{-fdelete-null-pointer-checks} is active, which is enabled by optimizations in most targets. The precision of the warnings depends on the optimization options used. +@item -Winaccessible-base @r{(C++, Objective-C++ only)} +@opindex Winaccessible-base +@opindex Wno-inaccessible-base +Warn when a base is inaccessible in derived due to ambiguity. The warning is +enabled by default. Note the warning for virtual bases is enabled by the +@option{-Wextra} option. +@smallexample +@group +struct A @{ int a; @}; + +struct B : A @{ @}; + +struct C : B, A @{ @}; +@end group +@end smallexample + @item -Winit-self @r{(C, C++, Objective-C and Objective-C++ only)} @opindex Winit-self @opindex Wno-init-self diff --git gcc/testsuite/g++.dg/warn/Winaccessible-base-1.C gcc/testsuite/g++.dg/warn/Winaccessible-base-1.C new file mode 100644 index 00000000000..2e32b0b119f --- /dev/null +++ gcc/testsuite/g++.dg/warn/Winaccessible-base-1.C @@ -0,0 +1,7 @@ +// PR c++/90449 + +struct A { int a; }; + +struct B : A { }; + +struct C : B, A { }; // { dg-warning "direct base 'A' inaccessible in 'C' due to ambiguity" } diff --git gcc/testsuite/g++.dg/warn/Winaccessible-base-2.C gcc/testsuite/g++.dg/warn/Winaccessible-base-2.C new file mode 100644 index 00000000000..67bd740a763 --- /dev/null +++ gcc/testsuite/g++.dg/warn/Winaccessible-base-2.C @@ -0,0 +1,8 @@ +// PR c++/90449 +// { dg-options -Wno-inaccessible-base } + +struct A { int a; }; + +struct B : A { }; + +struct C : B, A { }; // { dg-bogus "direct base 'A' inaccessible in 'C' due to ambiguity" } diff --git gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-1.C gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-1.C new file mode 100644 index 00000000000..051fcc695fe --- /dev/null +++ gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-1.C @@ -0,0 +1,10 @@ +// PR c++/90449 +// { dg-options -Wextra } + +struct A { }; + +struct B : virtual A { }; + +struct C : A { }; + +struct D : B, C { }; // { dg-warning "virtual base 'A' inaccessible in 'D' due to ambiguity" } diff --git gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-2.C gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-2.C new file mode 100644 index 00000000000..eab9ec0e3d7 --- /dev/null +++ gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-2.C @@ -0,0 +1,10 @@ +// PR c++/90449 +// { dg-options "-Wextra -Wno-inaccessible-base" } + +struct A { }; + +struct B : virtual A { }; + +struct C : A { }; + +struct D : B, C { }; // { dg-bogus "virtual base 'A' inaccessible in 'D' due to ambiguity" }