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; // expected-note {{during template argument deduction for variable template partial specialization 'B::error>' [with T = char]}} } +namespace deduce_pack_from_argument { + template + void separator(args_tag, T..., int, T...) {} + template + void separator_dependent(args_tag, type_identity_t..., int, type_identity_t...) {} + template + void separator_multiple_parameters(args_tag, args_tag, type_identity_t..., int mid, type_identity_t...) {} + + void test_separator() { + separator(args_tag{}, 4, 8, 42, 16, 25); + separator(args_tag<>{}, 42); + separator_dependent(args_tag{}, 4, 8, 42, 16, 25); + separator_dependent(args_tag<>{}, 42); + separator_multiple_parameters(args_tag{}, args_tag{}, 8, 9, 15, 16, 23); + } + + template void no_separator(args_tag, T..., T...) {} + template + void no_separator_dependent(args_tag, args_tag, type_identity_t..., type_identity_t...) {} + + void test_no_separator() { + no_separator(args_tag{}, 1, 2, 3, 4); + no_separator(args_tag<>{}); + no_separator_dependent(args_tag{}, args_tag{}, 8, 9, 15, 16); + no_separator_dependent(args_tag<>{}, args_tag<>{}); + } +} + namespace deduction_after_explicit_pack { template int *f(T ...t, int &r, U *u) { return u; @@ -442,29 +470,6 @@ namespace deduction_after_explicit_pack { i(0, 1, 2, 3, 4, 5); // expected-error {{no match}} } - template - void bar(args_tag, type_identity_t..., int mid, type_identity_t...) {} - void call_bar() { - bar(args_tag{}, 4, 8, 1001, 16, 23); - } - - template - void foo(args_tag, args_tag, type_identity_t..., int mid, type_identity_t...) {} - void call_foo() { - foo(args_tag{}, args_tag{}, 4, 8, 9, 15, 16, 23, 1); - } - - template - void foo2(args_tag, args_tag, type_identity_t..., type_identity_t...) {} - void call_foo2() { - foo2(args_tag{}, args_tag{}, 4, 8, 9, 15, 16, 23); - } - - template void baz(args_tag, T..., T...) {} - void call_baz() { - baz(args_tag{}, 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.