[clang] [Sema] Restructure and extend the testing of template pack deduction (PR #79881)
Gábor Spaits via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 29 10:29:59 PST 2024
https://github.com/spaits created https://github.com/llvm/llvm-project/pull/79881
Previously I worked on #78449 . I added tests in my solution #79371, but I think there should be other scenarios that should be tested and these tests deserve their namespace. In this PR I would like to make these changes.
>From f017c299d3edbd8ec06da1d5882aebbb0f6dd4c9 Mon Sep 17 00:00:00 2001
From: Gabor Spaits <gaborspaits1 at gmail.com>
Date: Mon, 29 Jan 2024 08:38:12 +0100
Subject: [PATCH] Restructure tests
---
clang/test/SemaTemplate/deduction.cpp | 51 +++++++++++++++------------
1 file changed, 28 insertions(+), 23 deletions(-)
diff --git a/clang/test/SemaTemplate/deduction.cpp b/clang/test/SemaTemplate/deduction.cpp
index e18551bf030222..a209615c364799 100644
--- a/clang/test/SemaTemplate/deduction.cpp
+++ b/clang/test/SemaTemplate/deduction.cpp
@@ -414,6 +414,34 @@ namespace deduction_substitution_failure {
int bi = B<char, char>; // expected-note {{during template argument deduction for variable template partial specialization 'B<T, typename Fail<T>::error>' [with T = char]}}
}
+namespace deduce_pack_from_argument {
+ template <typename... T>
+ void separator(args_tag<T...>, T..., int, T...) {}
+ template <typename... T>
+ void separator_dependent(args_tag<T...>, type_identity_t<T>..., int, type_identity_t<T>...) {}
+ template <typename... Y, typename... T>
+ void separator_multiple_parameters(args_tag<Y...>, args_tag<T...>, type_identity_t<T>..., int mid, type_identity_t<T>...) {}
+
+ void test_separator() {
+ separator(args_tag<int, int>{}, 4, 8, 42, 16, 25);
+ separator(args_tag<>{}, 42);
+ separator_dependent(args_tag<int, int>{}, 4, 8, 42, 16, 25);
+ separator_dependent(args_tag<>{}, 42);
+ separator_multiple_parameters(args_tag<const int, const int>{}, args_tag<int, int>{}, 8, 9, 15, 16, 23);
+ }
+
+ template <typename... Y, typename... T> void no_separator(args_tag<T...>, T..., T...) {}
+ template <typename... Y, typename... T>
+ void no_separator_dependent(args_tag<Y...>, args_tag<T...>, type_identity_t<T>..., type_identity_t<T>...) {}
+
+ void test_no_separator() {
+ no_separator(args_tag<int, int>{}, 1, 2, 3, 4);
+ no_separator(args_tag<>{});
+ no_separator_dependent(args_tag<const int, const int>{}, args_tag<int, int>{}, 8, 9, 15, 16);
+ no_separator_dependent(args_tag<>{}, args_tag<>{});
+ }
+}
+
namespace deduction_after_explicit_pack {
template<typename ...T, typename U> int *f(T ...t, int &r, U *u) {
return u;
@@ -442,29 +470,6 @@ namespace deduction_after_explicit_pack {
i<int, int>(0, 1, 2, 3, 4, 5); // expected-error {{no match}}
}
- template <typename... T>
- void bar(args_tag<T...>, type_identity_t<T>..., int mid, type_identity_t<T>...) {}
- void call_bar() {
- bar(args_tag<int, int>{}, 4, 8, 1001, 16, 23);
- }
-
- template <typename... Y, typename... T>
- void foo(args_tag<Y...>, args_tag<T...>, type_identity_t<T>..., int mid, type_identity_t<T>...) {}
- void call_foo() {
- foo(args_tag<const int,const int, const int>{}, args_tag<int, int, int>{}, 4, 8, 9, 15, 16, 23, 1);
- }
-
- template <typename... Y, typename... T>
- void foo2(args_tag<Y...>, args_tag<T...>, type_identity_t<T>..., type_identity_t<T>...) {}
- void call_foo2() {
- foo2(args_tag<const int,const int, const int>{}, args_tag<int, int, int>{}, 4, 8, 9, 15, 16, 23);
- }
-
- template <typename... Y, typename... T> void baz(args_tag<T...>, T..., T...) {}
- void call_baz() {
- baz(args_tag<int, int>{}, 1, 2, 3, 4);
- }
-
// GCC alarmingly accepts this by deducing T={int} by matching the second
// parameter against the first argument, then passing the first argument
// through the first parameter.
More information about the cfe-commits
mailing list