Author: Gábor Spaits Date: 2024-01-30T10:46:02+01:00 New Revision: e9e1a72c22181993edf5bd0b660538081c2cdfb5
URL: https://github.com/llvm/llvm-project/commit/e9e1a72c22181993edf5bd0b660538081c2cdfb5 DIFF: https://github.com/llvm/llvm-project/commit/e9e1a72c22181993edf5bd0b660538081c2cdfb5.diff LOG: [Sema] Restructure and extend the testing of template pack deduction (#79881) Add tests for empty pack deduction from function arguments. Added: Modified: clang/test/SemaTemplate/deduction.cpp Removed: ################################################################################ diff --git a/clang/test/SemaTemplate/deduction.cpp b/clang/test/SemaTemplate/deduction.cpp index e18551bf03022..a209615c36479 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. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits