diff options
author | Eric Fiselier <eric@efcs.ca> | 2016-06-21 23:19:13 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2016-06-21 23:19:13 +0000 |
commit | 092386771dbebffbf1d2752cdaee4be577239e9b (patch) | |
tree | 967ae72f161fbeefe67c6802c398734c0faaa9f1 /libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp | |
parent | 62ef3bfd3d93c64da58a72c27d08353829c6be9a (diff) | |
download | bcm5719-llvm-092386771dbebffbf1d2752cdaee4be577239e9b.tar.gz bcm5719-llvm-092386771dbebffbf1d2752cdaee4be577239e9b.zip |
Fix PR27684 - std::tuple no longer accepts reference to incomplete type in some cases.
Libc++ has to deduce the 'allocator_arg_t' parameter as 'AllocArgT' for the
following constructor:
template <class Alloc> tuple(allocator_arg_t, Alloc const&)
Previously libc++ has tried to support tags derived from 'allocator_arg_t' by
using 'is_base_of<AllocArgT, allocator_arg_t>'. However this breaks whenever a
2-tuple contains a reference to an incomplete type as its first parameter.
See https://llvm.org/bugs/show_bug.cgi?id=27684
llvm-svn: 273334
Diffstat (limited to 'libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp')
-rw-r--r-- | libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp | 25 |
1 files changed, 5 insertions, 20 deletions
diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp index c69163de1fd..4da5fc7f839 100644 --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +// UNSUPPORTED: c++98, c++03 + // <tuple> // template <class... Types> class tuple; @@ -14,7 +16,9 @@ // template <class Alloc> // tuple(allocator_arg_t, const Alloc& a); -// UNSUPPORTED: c++98, c++03 +// NOTE: this constructor does not currently support tags derived from +// allocator_arg_t because libc++ has to deduce the parameter as a template +// argument. See PR27684 (https://llvm.org/bugs/show_bug.cgi?id=27684) #include <tuple> #include <cassert> @@ -42,10 +46,6 @@ int main() std::tuple<> t(std::allocator_arg, A1<int>()); } { - DerivedFromAllocArgT tag; - std::tuple<> t(tag, A1<int>()); - } - { std::tuple<int> t(std::allocator_arg, A1<int>()); assert(std::get<0>(t) == 0); } @@ -95,21 +95,6 @@ int main() assert(std::get<2>(t) == alloc_last()); } { - // Test that allocator construction is selected when the user provides - // a custom tag type which derives from allocator_arg_t. - DerivedFromAllocArgT tag; - alloc_first::allocator_constructed = false; - alloc_last::allocator_constructed = false; - - std::tuple<DefaultOnly, alloc_first, alloc_last> t(tag, A1<int>(5)); - - assert(std::get<0>(t) == DefaultOnly()); - assert(alloc_first::allocator_constructed); - assert(std::get<1>(t) == alloc_first()); - assert(alloc_last::allocator_constructed); - assert(std::get<2>(t) == alloc_last()); - } - { // Test that the uses-allocator default constructor does not evaluate // it's SFINAE when it otherwise shouldn't be selected. Do this by // using 'NonDefaultConstructible' which will cause a compile error |