PR c++/90449 - add -Winaccessible-base option.
authorMatthew Beliveau <mbelivea@redhat.com>
Tue, 11 Jun 2019 15:03:21 +0000 (15:03 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Tue, 11 Jun 2019 15:03:21 +0000 (15:03 +0000)
       * doc/invoke.texi (Winaccessible-base): Document.

       * c.opt (Winaccessible-base): Added new option.

       * class.c (warn_about_ambiguous_bases): Changed name to:
       maybe_warn_about_inaccessible_bases.
       (maybe_warn_about_inaccessible_bases):  Implemented new
       Winaccessible-base warning option for both direct and virtual
       base warnings.
       (layout_class_type): Call to warn_about_ambiguous_bases changed to fit
       new name.

        * 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.

From-SVN: r272157

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Winaccessible-base-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Winaccessible-base-2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-2.C [new file with mode: 0644]

index 211a55db079d35fbd6e8aef3a2cb22a3822891e6..0c5cf700f58df731bbaeceb3bf9a6d7cd08fc8c5 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-11  Matthew Beliveau  <mbelivea@redhat.com>
+
+       PR c++/90449 - add -Winaccessible-base option.
+       * doc/invoke.texi (Winaccessible-base): Document.
+
 2019-06-11  Marc Glisse  <marc.glisse@inria.fr>
 
        PR tree-optimization/62041
index 589e4a12932faaa63aaa9b23a49d2fb1c7e5917a..42247182f118833158b42a358ba2a17beeb0976b 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-11  Matthew Beliveau  <mbelivea@redhat.com>
+
+       PR c++/90449 - add -Winaccessible-base option.
+       * c.opt (Winaccessible-base): New option.
+
 2019-06-10  Jakub Jelinek  <jakub@redhat.com>
 
        * c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_SCAN.
index 6c247779af6a8a6266f7dee2c687596bd661e49b..572cf1862629b676bd7b2987d61ce7b65c89cefb 100644 (file)
@@ -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.
index e067ff7a0e092fb6c18659295298bd0aee891d74..5e8fd69487d1ccc1ca0c21c3c3e870c238d974e0 100644 (file)
@@ -1,3 +1,14 @@
+2019-06-11  Matthew Beliveau  <mbelivea@redhat.com>
+
+       PR c++/90449 - add -Winaccessible-base option.
+       * class.c (warn_about_ambiguous_bases): Changed name to:
+       maybe_warn_about_inaccessible_bases.
+       (maybe_warn_about_inaccessible_bases):  Implemented new
+       Winaccessible-base warning option for both direct and virtual
+       base warnings.
+       (layout_class_type): Call to warn_about_ambiguous_bases changed to fit
+       new name.
+
 2019-06-11  Richard Biener  <rguenther@suse.de>
 
        PR c++/90801
index d6ac6ce5c9a9055febcde3c4de97d1d366f8d1b3..4fdb0f328cc0e22a5f2140fe76b06bf507e42bc0 100644 (file)
@@ -199,7 +199,7 @@ static int walk_subobject_offsets (tree, subobject_offset_fn,
 static int layout_conflict_p (tree, tree, splay_tree, int);
 static int splay_tree_compare_integer_csts (splay_tree_key k1,
                                            splay_tree_key k2);
-static void warn_about_ambiguous_bases (tree);
+static void maybe_warn_about_inaccessible_bases (tree);
 static bool type_requires_array_cookie (tree);
 static bool base_derived_from (tree, tree);
 static int empty_base_at_nonzero_offset_p (tree, tree, splay_tree);
@@ -6018,7 +6018,7 @@ end_of_class (tree t, bool include_virtuals_p)
    subobjects of U.  */
 
 static void
-warn_about_ambiguous_bases (tree t)
+maybe_warn_about_inaccessible_bases (tree t)
 {
   int i;
   vec<tree, va_gc> *vbases;
@@ -6026,6 +6026,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;
@@ -6037,8 +6041,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.  */
@@ -6049,8 +6053,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);
       }
 }
 
@@ -6456,7 +6460,7 @@ layout_class_type (tree t, tree *virtuals_p)
     error ("size of type %qT is too large (%qE bytes)", t, TYPE_SIZE_UNIT (t));
 
   /* Warn about bases that can't be talked about due to ambiguity.  */
-  warn_about_ambiguous_bases (t);
+  maybe_warn_about_inaccessible_bases (t);
 
   /* Now that we're done with layout, give the base fields the real types.  */
   for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field))
index f18d225e5b5ab9dc0bac5fc96e67f830f0b72981..1520b2cbb9f544f9f3cc080aef76284b5435f6f5 100644 (file)
@@ -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 class is inaccessible in a class derived from it 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
index beecd96eab56b7c12d16b866b4fac7cb4b6d419d..21b5d83336c389007e9bd8d7c45b0f21b7b2de19 100644 (file)
@@ -1,3 +1,11 @@
+2019-06-11  Matthew Beliveau  <mbelivea@redhat.com>
+
+       PR c++/90449 - add -Winaccessible-base option.
+       * 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.
+
 2019-06-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/90810
diff --git a/gcc/testsuite/g++.dg/warn/Winaccessible-base-1.C b/gcc/testsuite/g++.dg/warn/Winaccessible-base-1.C
new file mode 100644 (file)
index 0000000..2e32b0b
--- /dev/null
@@ -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 a/gcc/testsuite/g++.dg/warn/Winaccessible-base-2.C b/gcc/testsuite/g++.dg/warn/Winaccessible-base-2.C
new file mode 100644 (file)
index 0000000..67bd740
--- /dev/null
@@ -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 a/gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-1.C b/gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-1.C
new file mode 100644 (file)
index 0000000..051fcc6
--- /dev/null
@@ -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 a/gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-2.C b/gcc/testsuite/g++.dg/warn/Winaccessible-virtual-base-2.C
new file mode 100644 (file)
index 0000000..eab9ec0
--- /dev/null
@@ -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" }