c++: Fix up user_provided_p [PR81349]
authorJakub Jelinek <jakub@redhat.com>
Thu, 26 Mar 2020 08:31:15 +0000 (09:31 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 26 Mar 2020 08:31:15 +0000 (09:31 +0100)
The standard says: "A function is user-provided if it is user-declared and
not explicitly defaulted or deleted on its first declaration."
I don't see anything about function templates having different rules here,
but user_provided_p does return true for all TEMPLATE_DECLs.

The following patch fixes it by treating as user-provided only templates
that aren't deleted.

2020-03-26  Jakub Jelinek  <jakub@redhat.com>

PR c++/81349
* class.c (user_provided_p): Use STRIP_TEMPLATE instead of returning
true for all TEMPLATE_DECLs.

* g++.dg/cpp1z/pr81349.C: New test.

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1z/pr81349.C [new file with mode: 0644]

index 9ff2525f83dbea385e7d6fc11c89f0de4c3c34d8..af8f49bd0318a6c89ef9fd48fc22542f48d84282 100644 (file)
@@ -1,5 +1,9 @@
 2020-03-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/81349
+       * class.c (user_provided_p): Use STRIP_TEMPLATE instead of returning
+       true for all TEMPLATE_DECLs.
+
        PR c++/94272
        * cp-gimplify.c (cp_genericize_r): Handle STATEMENT_LIST.
 
index 5340799fdd3587ee0513120fdbe977c43fa07480..41f52e5a5a0e3413166f741377808f284d13052a 100644 (file)
@@ -5159,12 +5159,10 @@ in_class_defaulted_default_constructor (tree t)
 bool
 user_provided_p (tree fn)
 {
-  if (TREE_CODE (fn) == TEMPLATE_DECL)
-    return true;
-  else
-    return (!DECL_ARTIFICIAL (fn)
-           && !(DECL_INITIALIZED_IN_CLASS_P (fn)
-                && (DECL_DEFAULTED_FN (fn) || DECL_DELETED_FN (fn))));
+  fn = STRIP_TEMPLATE (fn);
+  return (!DECL_ARTIFICIAL (fn)
+         && !(DECL_INITIALIZED_IN_CLASS_P (fn)
+              && (DECL_DEFAULTED_FN (fn) || DECL_DELETED_FN (fn))));
 }
 
 /* Returns true iff class T has a user-provided constructor.  */
index 6d5c12f20a3fa3705afeb8656e80351be0e00db6..6091bcc1f0589c813f7a358618b10387d13e2fe9 100644 (file)
@@ -1,5 +1,8 @@
 2020-03-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/81349
+       * g++.dg/cpp1z/pr81349.C: New test.
+
        PR c++/94272
        * g++.dg/debug/pr94272.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/cpp1z/pr81349.C b/gcc/testsuite/g++.dg/cpp1z/pr81349.C
new file mode 100644 (file)
index 0000000..5195d19
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/81349
+// { dg-do compile { target c++17_only } }
+
+#include <type_traits>
+
+struct A {
+  A (int) = delete;
+};
+
+struct B {
+  template <typename T>
+  B (T) = delete;
+};
+
+template <typename U>
+struct C {
+  C (U) = delete;
+};
+
+template <typename U>
+struct D {
+  template <typename T>
+  D (T, U) = delete;
+};
+
+static_assert (std::is_aggregate_v<A>);
+static_assert (std::is_aggregate_v<B>);
+static_assert (std::is_aggregate_v<C<int>>);
+static_assert (std::is_aggregate_v<D<int>>);