aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2024-06-07 12:12:30 -0400
committerPatrick Palka <ppalka@redhat.com>2024-06-10 10:15:31 -0400
commitff8105b4910f7dbee326cb36b01c16ac9bf10c4b (patch)
treee6418616b3f2dc3f3dc7aa4b4d92202aac9e08c5
parentb5ad4431f97eed60e46fc447fcd1eb4077b3cd80 (diff)
downloadgcc-ff8105b4910f7dbee326cb36b01c16ac9bf10c4b.zip
gcc-ff8105b4910f7dbee326cb36b01c16ac9bf10c4b.tar.gz
gcc-ff8105b4910f7dbee326cb36b01c16ac9bf10c4b.tar.bz2
c++: lambda in pack expansion [PR115378]
Here find_parameter_packs_r is incorrectly treating the 'auto' return type of a lambda as a parameter pack due to Concepts-TS specific logic added in r6-4517, leading to confusion later when expanding the pattern. Since we intend on removing Concepts TS support soon anyway, this patch fixes this by restricting the problematic logic with flag_concepts_ts. Doing so revealed that add_capture was relying on this logic to set TEMPLATE_TYPE_PARAMETER_PACK for the 'auto' type of an pack expansion init-capture, which we now need to do explicitly. PR c++/115378 gcc/cp/ChangeLog: * lambda.cc (lambda_capture_field_type): Set TEMPLATE_TYPE_PARAMETER_PACK on the auto type of an init-capture pack expansion. * pt.cc (find_parameter_packs_r) <case TEMPLATE_TYPE_PARM>: Restrict TEMPLATE_TYPE_PARAMETER_PACK promotion with flag_concepts_ts. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/decltype-auto-103497.C: Adjust expected diagnostic. * g++.dg/template/pr95672.C: Likewise. * g++.dg/cpp2a/lambda-targ5.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com> (cherry picked from commit 5c761395402a730535983a5e49ef1775561ebc61)
-rw-r--r--gcc/cp/lambda.cc3
-rw-r--r--gcc/cp/pt.cc2
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/lambda-targ5.C15
-rw-r--r--gcc/testsuite/g++.dg/template/pr95672.C2
5 files changed, 20 insertions, 4 deletions
diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc
index 4b1f939..5b5e31c 100644
--- a/gcc/cp/lambda.cc
+++ b/gcc/cp/lambda.cc
@@ -223,7 +223,8 @@ lambda_capture_field_type (tree expr, bool explicit_init_p,
outermost CV qualifiers of EXPR. */
type = build_reference_type (type);
if (uses_parameter_packs (expr))
- /* Stick with 'auto' even if the type could be deduced. */;
+ /* Stick with 'auto' even if the type could be deduced. */
+ TEMPLATE_TYPE_PARAMETER_PACK (auto_node) = true;
else
type = do_auto_deduction (type, expr, auto_node);
}
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index d3f61e9..c7aee66 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -3942,7 +3942,7 @@ find_parameter_packs_r (tree *tp, int *walk_subtrees, void* data)
parameter pack (14.6.3), or the type-specifier-seq of a type-id that
is a pack expansion, the invented template parameter is a template
parameter pack. */
- if (ppd->type_pack_expansion_p && is_auto (t)
+ if (flag_concepts_ts && ppd->type_pack_expansion_p && is_auto (t)
&& TEMPLATE_TYPE_LEVEL (t) != 0)
TEMPLATE_TYPE_PARAMETER_PACK (t) = true;
if (TEMPLATE_TYPE_PARAMETER_PACK (t))
diff --git a/gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C b/gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C
index cedd661..4162361 100644
--- a/gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C
+++ b/gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C
@@ -1,7 +1,7 @@
// PR c++/103497
// { dg-do compile { target c++14 } }
-void foo(decltype(auto)... args); // { dg-error "cannot declare a parameter with .decltype.auto.." }
+void foo(decltype(auto)... args); // { dg-error "contains no parameter packs" }
int main() {
foo();
diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-targ5.C b/gcc/testsuite/g++.dg/cpp2a/lambda-targ5.C
new file mode 100644
index 0000000..efd4bb4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/lambda-targ5.C
@@ -0,0 +1,15 @@
+// PR c++/115378
+// { dg-do compile { target c++20 } }
+
+struct tt {};
+
+template<class Slot, auto Tag = []{}>
+constexpr auto __counter = 1;
+
+template <class Child, int Counter>
+using _as_base = tt;
+
+template <class... Envs>
+struct env : _as_base<Envs, __counter<int>>... {};
+
+env<int> t;
diff --git a/gcc/testsuite/g++.dg/template/pr95672.C b/gcc/testsuite/g++.dg/template/pr95672.C
index c752b4a..d97b8db 100644
--- a/gcc/testsuite/g++.dg/template/pr95672.C
+++ b/gcc/testsuite/g++.dg/template/pr95672.C
@@ -1,3 +1,3 @@
// PR c++/95672
// { dg-do compile { target c++14 } }
-struct g_class : decltype (auto) ... { }; // { dg-error "invalid use of pack expansion" }
+struct g_class : decltype (auto) ... { }; // { dg-error "contains no parameter packs" }