public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-7920] c++: placeholder type constraint and argument pack [PR99815]
@ 2021-03-31  2:58 Patrick Palka
  0 siblings, 0 replies; only message in thread
From: Patrick Palka @ 2021-03-31  2:58 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:0bbf0edbfc782f8e4e416d5fbd1b52a515adb585

commit r11-7920-g0bbf0edbfc782f8e4e416d5fbd1b52a515adb585
Author: Patrick Palka <ppalka@redhat.com>
Date:   Tue Mar 30 22:54:37 2021 -0400

    c++: placeholder type constraint and argument pack [PR99815]
    
    When checking dependence of a placeholder type constraint, if the first
    template argument of the constraint is an argument pack, we need to
    expand it in order to properly separate the implicit 'auto' argument
    from the rest.
    
    gcc/cp/ChangeLog:
    
            PR c++/99815
            * pt.c (placeholder_type_constraint_dependent_p): Expand
            argument packs to separate the first non-pack argument
            from the rest.
    
    gcc/testsuite/ChangeLog:
    
            PR c++/99815
            * g++.dg/cpp2a/concepts-placeholder5.C: New test.

Diff:
---
 gcc/cp/pt.c                                        |  5 ++++
 gcc/testsuite/g++.dg/cpp2a/concepts-placeholder5.C | 32 ++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index a056ecefd1d..dc6f2f37f9b 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -28189,6 +28189,11 @@ placeholder_type_constraint_dependent_p (tree t)
   tree id = unpack_concept_check (t);
   tree args = TREE_OPERAND (id, 1);
   tree first = TREE_VEC_ELT (args, 0);
+  if (ARGUMENT_PACK_P (first))
+    {
+      args = expand_template_argument_pack (args);
+      first = TREE_VEC_ELT (args, 0);
+    }
   gcc_checking_assert (TREE_CODE (first) == WILDCARD_DECL
 		       || is_auto (first));
   for (int i = 1; i < TREE_VEC_LENGTH (args); ++i)
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder5.C b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder5.C
new file mode 100644
index 00000000000..eaea41a36eb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder5.C
@@ -0,0 +1,32 @@
+// PR c++/99815
+// { dg-do compile { target c++20 } }
+
+template <class T, class U>
+struct is_same { static constexpr bool value = false; };
+
+template <class T>
+struct is_same<T, T> { static constexpr bool value = true; };
+
+template <class... Ts>
+concept C = is_same<Ts...>::value; // { dg-error "wrong number" }
+
+template <class... Ts> void f() {
+  C<Ts...> auto x = 0; // { dg-error "constraints" }
+}
+
+template void f<int>(); // { dg-bogus "" }
+template void f<char>(); // { dg-message "required from here" }
+template void f<>(); // { dg-message "required from here" }
+template void f<int, int>(); // { dg-message "required from here" }
+
+template <class... Ts> void g() {
+  C<Ts..., int> auto x = 0; // { dg-error "constraints" }
+}
+
+template void g<>(); // { dg-bogus "" }
+template void g<int>(); // { dg-message "required from here" }
+
+template <class> void h() {
+  C<char> auto x = 0; // { dg-error "constraints" }
+  C<int> auto y = 0;
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-03-31  2:58 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-31  2:58 [gcc r11-7920] c++: placeholder type constraint and argument pack [PR99815] Patrick Palka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).