From: Jason Merrill Date: Mon, 11 Jun 2018 21:49:36 +0000 (-0400) Subject: PR c++/85792 -Wctor-dtor-privacy and inherited constructor. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ee7ae7ae1bf4271dd7e9c255c8a61a7adc188c7a;p=gcc.git PR c++/85792 -Wctor-dtor-privacy and inherited constructor. * class.c (maybe_warn_about_overly_private_class): Handle inherited constructors. From-SVN: r261459 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2424a3f6479..585f111655a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-06-11 Jason Merrill + 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. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index ab68b9be42a..fbf39035e18 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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 index 00000000000..48137851f05 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wctor-dtor2.C @@ -0,0 +1,11 @@ +// PR c++/85792 +// { dg-do compile { target c++11 } } +// { dg-additional-options -Wctor-dtor-privacy } + +template struct A { }; + +template struct B : A { + using A::A; + + B(const B&) { } +};