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" }

Reply via email to