summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2017-01-04 02:59:16 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2017-01-04 02:59:16 +0000
commitb576c17417d2168960141242c9393d9386e566c8 (patch)
treecbed02962be6de6c31c941cb813400544c2602af /clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
parent578af61b0946b21ad82f09379f9326459b31a823 (diff)
downloadbcm5719-llvm-b576c17417d2168960141242c9393d9386e566c8.tar.gz
bcm5719-llvm-b576c17417d2168960141242c9393d9386e566c8.zip
Fix deduction of pack elements after a braced-init-list.
Previously, if the arguments for a parameter pack contained a braced-init-list, we would abort deduction (keeping the pack deductions from prior arguments) at the point when we reached the braced-init-list, resulting in wrong deductions and rejects-valids. We now just leave a "hole" in the pack for such an argument, which needs to be filled by another deduction of the same pack. llvm-svn: 290933
Diffstat (limited to 'clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp')
-rw-r--r--clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
index 060a0f236b4..c8595d2e364 100644
--- a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
+++ b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
@@ -103,6 +103,12 @@ T deduce(std::initializer_list<T>); // expected-note {{conflicting types for par
template <typename T>
T deduce_ref(const std::initializer_list<T>&); // expected-note {{conflicting types for parameter 'T' ('int' vs. 'double')}}
+template<typename T, typename U> struct pair { pair(...); };
+template<typename T> void deduce_pairs(std::initializer_list<pair<T, typename T::type>>);
+struct WithIntType { typedef int type; };
+
+template<typename ...T> void deduce_after_init_list_in_pack(void (*)(T...), T...); // expected-note {{<int, int> vs. <(no value), double>}}
+
void argument_deduction() {
static_assert(same_type<decltype(deduce({1, 2, 3})), int>::value, "bad deduction");
static_assert(same_type<decltype(deduce({1.0, 2.0, 3.0})), double>::value, "bad deduction");
@@ -113,6 +119,14 @@ void argument_deduction() {
static_assert(same_type<decltype(deduce_ref({1.0, 2.0, 3.0})), double>::value, "bad deduction");
deduce_ref({1, 2.0}); // expected-error {{no matching function}}
+
+ pair<WithIntType, int> pi;
+ pair<WithIntType, float> pf;
+ deduce_pairs({pi, pi, pi}); // ok
+ deduce_pairs({pi, pf, pi}); // FIXME: This should be rejected, as we fail to produce a type that exactly matches the argument type.
+
+ deduce_after_init_list_in_pack((void(*)(int,int))0, {}, 0);
+ deduce_after_init_list_in_pack((void(*)(int,int))0, {}, 0.0); // expected-error {{no matching function}}
}
void auto_deduction() {
OpenPOWER on IntegriCloud