PR libstdc++/85843 - warning in logic_error copy constructor.
authorJason Merrill <jason@redhat.com>
Mon, 21 May 2018 03:53:00 +0000 (23:53 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 21 May 2018 03:53:00 +0000 (23:53 -0400)
* class.c (type_has_user_nondefault_constructor): Check for a
user-provided ctor, not user-declared.

From-SVN: r260432

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

index 92039fa8e9a837a7ec45af9e9f582d49b286f0c2..29edd5f247b8663c2c4d7d2aeac5e7d7d50657ef 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-20  Jason Merrill  <jason@redhat.com>
+
+       PR libstdc++/85843 - warning in logic_error copy constructor.
+       * class.c (type_has_user_nondefault_constructor): Check for a
+       user-provided ctor, not user-declared.
+
 2018-05-19  Jason Merrill  <jason@redhat.com>
 
        * pt.c (tsubst_pack_expansion): Sorry rather than abort
index 4960b4b5593b8fb9f0fcddd56fd12479ade69927..a9a0fa927270badf7cf05d469d3d24efe9eb4d20 100644 (file)
@@ -4884,7 +4884,7 @@ default_ctor_p (tree fn)
          && sufficient_parms_p (FUNCTION_FIRST_USER_PARMTYPE (fn)));
 }
 
-/* Returns true iff class T has a user-defined constructor that can be called
+/* Returns true iff class T has a user-provided constructor that can be called
    with more than zero arguments.  */
 
 bool
@@ -4896,7 +4896,7 @@ type_has_user_nondefault_constructor (tree t)
   for (ovl_iterator iter (CLASSTYPE_CONSTRUCTORS (t)); iter; ++iter)
     {
       tree fn = *iter;
-      if (!DECL_ARTIFICIAL (fn)
+      if (user_provided_p (fn)
          && (TREE_CODE (fn) == TEMPLATE_DECL
              || (skip_artificial_parms_for (fn, DECL_ARGUMENTS (fn))
                  != NULL_TREE)))
diff --git a/gcc/testsuite/g++.dg/warn/Wextra-4.C b/gcc/testsuite/g++.dg/warn/Wextra-4.C
new file mode 100644 (file)
index 0000000..5c33c27
--- /dev/null
@@ -0,0 +1,15 @@
+// PR libstdc++/85843
+// { dg-do compile { target c++11 } }
+// { dg-additional-options -Wextra }
+
+struct A
+{
+  A();
+  A(const A&) = default;
+};
+
+struct B : A
+{
+  B(): A() { }
+  B(const B&) { }
+};