From 9e81c820a3e48ead478dabbd6988482747f7a521 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Fri, 22 May 2020 10:28:19 -0400 Subject: [PATCH] c++: P0848R3 and member function templates [PR95181] When comparing two special member function templates to see if one hides the other (as per P0848R3), we need to check satisfaction which we can't do on templates. So this patch makes add_method skip the eligibility test on member function templates and just lets them coexist. gcc/cp/ChangeLog: PR c++/95181 * class.c (add_method): Let special member function templates coexist if they are not equivalently constrained, or in a class template. gcc/testsuite/ChangeLog: PR c++/95181 * g++.dg/concepts/pr95181.C: New test. * g++.dg/concepts/pr95181-2.C: New test. Co-authored-by: Jason Merrill (cherry picked from commit 6b449b74c590f5a6f66c73aed894e5b5b36aa59d) --- gcc/cp/class.c | 15 +++++++++++---- gcc/testsuite/g++.dg/concepts/pr95181-2.C | 8 ++++++++ gcc/testsuite/g++.dg/concepts/pr95181.C | 9 +++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/concepts/pr95181-2.C create mode 100644 gcc/testsuite/g++.dg/concepts/pr95181.C diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 1f524a319174..5b52a2a1f0a6 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1077,12 +1077,19 @@ add_method (tree type, tree method, bool via_using) { if (!equivalently_constrained (fn, method)) { + if (processing_template_decl) + /* We can't check satisfaction in dependent context, wait until + the class is instantiated. */ + continue; + special_function_kind sfk = special_memfn_p (method); - if (sfk == sfk_none || DECL_INHERITED_CTOR (fn)) - /* Non-special member functions coexist if they are not - equivalently constrained. A member function is not hidden - by an inherited constructor. */ + if (sfk == sfk_none + || DECL_INHERITED_CTOR (fn) + || TREE_CODE (fn) == TEMPLATE_DECL) + /* Member function templates and non-special member functions + coexist if they are not equivalently constrained. A member + function is not hidden by an inherited constructor. */ continue; /* P0848: For special member functions, deleted, unsatisfied, or diff --git a/gcc/testsuite/g++.dg/concepts/pr95181-2.C b/gcc/testsuite/g++.dg/concepts/pr95181-2.C new file mode 100644 index 000000000000..6d67350e58f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/pr95181-2.C @@ -0,0 +1,8 @@ +// { dg-do compile { target concepts } } + +template struct g { + g() requires B && false; + g() requires B; +}; + +g b; // error diff --git a/gcc/testsuite/g++.dg/concepts/pr95181.C b/gcc/testsuite/g++.dg/concepts/pr95181.C new file mode 100644 index 000000000000..0185c86b4382 --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/pr95181.C @@ -0,0 +1,9 @@ +// PR c++/95181 +// { dg-do compile { target concepts } } + +template struct f { + template f(); + template requires false f(); +}; + +f a; -- 2.47.2