summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2016-06-21 23:19:13 +0000
committerEric Fiselier <eric@efcs.ca>2016-06-21 23:19:13 +0000
commit092386771dbebffbf1d2752cdaee4be577239e9b (patch)
tree967ae72f161fbeefe67c6802c398734c0faaa9f1 /libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp
parent62ef3bfd3d93c64da58a72c27d08353829c6be9a (diff)
downloadbcm5719-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.cpp25
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
OpenPOWER on IntegriCloud