PR c++/85792 -Wctor-dtor-privacy and inherited constructor.
authorJason Merrill <jason@redhat.com>
Mon, 11 Jun 2018 21:49:36 +0000 (17:49 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 11 Jun 2018 21:49:36 +0000 (17:49 -0400)
* class.c (maybe_warn_about_overly_private_class): Handle inherited
constructors.

From-SVN: r261459

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/g++.dg/warn/Wctor-dtor2.C [new file with mode: 0644]

index 2424a3f6479cf7f462d65d67a5dec4e5ad00f232..585f111655af8a02570fed398140e10ee4a490ec 100644 (file)
@@ -1,5 +1,9 @@
 2018-06-11  Jason Merrill  <jason@redhat.com>
 
+       PR c++/85792 -Wctor-dtor-privacy and inherited constructor.
+       * class.c (maybe_warn_about_overly_private_class): Handle inherited
+       constructors.
+
        PR c++/85963 - -Wunused-but-set with ?: in template.
        * pt.c (tsubst_copy_and_build) [COND_EXPR]: Call mark_rvalue_use.
 
index ab68b9be42a661c18feb4c159d1854f05c1279a0..fbf39035e18f1ced006d4623e9ee2b4307d56247 100644 (file)
@@ -2034,6 +2034,7 @@ maybe_warn_about_overly_private_class (tree t)
 {
   int has_member_fn = 0;
   int has_nonprivate_method = 0;
+  bool nonprivate_ctor = false;
 
   if (!warn_ctor_dtor_privacy
       /* If the class has friends, those entities might create and
@@ -2064,7 +2065,11 @@ maybe_warn_about_overly_private_class (tree t)
      non-private statics, we can't ever call any of the private member
      functions.)  */
   for (tree fn = TYPE_FIELDS (t); fn; fn = DECL_CHAIN (fn))
-    if (!DECL_DECLARES_FUNCTION_P (fn))
+    if (TREE_CODE (fn) == USING_DECL
+       && DECL_NAME (fn) == ctor_identifier
+       && !TREE_PRIVATE (fn))
+      nonprivate_ctor = true;
+    else if (!DECL_DECLARES_FUNCTION_P (fn))
       /* Not a function.  */;
     else if (DECL_ARTIFICIAL (fn))
       /* We're not interested in compiler-generated methods; they don't
@@ -2126,7 +2131,6 @@ maybe_warn_about_overly_private_class (tree t)
       /* Implicitly generated constructors are always public.  */
       && !CLASSTYPE_LAZY_DEFAULT_CTOR (t))
     {
-      bool nonprivate_ctor = false;
       tree copy_or_move = NULL_TREE;
 
       /* If a non-template class does not define a copy
diff --git a/gcc/testsuite/g++.dg/warn/Wctor-dtor2.C b/gcc/testsuite/g++.dg/warn/Wctor-dtor2.C
new file mode 100644 (file)
index 0000000..4813785
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/85792
+// { dg-do compile { target c++11 } }
+// { dg-additional-options -Wctor-dtor-privacy }
+
+template<typename T> struct A { };
+
+template<typename T> struct B : A<T> {
+  using A<T>::A;
+
+  B(const B&) { }
+};