diff options
author | Louis Dionne <ldionne@apple.com> | 2019-09-27 15:06:52 +0000 |
---|---|---|
committer | Louis Dionne <ldionne@apple.com> | 2019-09-27 15:06:52 +0000 |
commit | 59e26308e60a08a5a4534ba827744564c71d7aff (patch) | |
tree | 153a8db3ca1c30a66342e5a40c01cd1861508c5c /libcxx/test/std/utilities/tuple/tuple.tuple | |
parent | 7ca15ba73f67f1d3b6652cb19bbf78731e3b128d (diff) | |
download | bcm5719-llvm-59e26308e60a08a5a4534ba827744564c71d7aff.tar.gz bcm5719-llvm-59e26308e60a08a5a4534ba827744564c71d7aff.zip |
[libc++] Take 2: Implement LWG 3158
Summary:
LWG 3158 marks the allocator_arg_t constructor of std::tuple as
conditionnally explicit based on whether the default constructors
of the tuple's members are explicitly default constructible.
This was previously committed as r372778 and reverted in r372832 due to
the commit breaking LLVM's build in C++14 mode. This issue has now been
addressed.
Reviewers: mclow.lists
Subscribers: christof, jkorous, dexonsmith, libcxx-commits
Tags: #libc
Differential Revision: https://reviews.llvm.org/D65232
llvm-svn: 373092
Diffstat (limited to 'libcxx/test/std/utilities/tuple/tuple.tuple')
-rw-r--r-- | libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.fail.cpp | 33 | ||||
-rw-r--r-- | libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp | 2 |
2 files changed, 34 insertions, 1 deletions
diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.fail.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.fail.cpp new file mode 100644 index 00000000000..abb8073a6a5 --- /dev/null +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.fail.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03 + +// <tuple> + +// template <class... Types> class tuple; + +// template <class Alloc> +// explicit(see-below) tuple(allocator_arg_t, const Alloc& a); + +// Make sure we get the explicit-ness of the constructor right. +// This is LWG 3158. + +#include <tuple> +#include <memory> + + +struct ExplicitDefault { explicit ExplicitDefault() { } }; + +std::tuple<ExplicitDefault> explicit_default_test() { + return {std::allocator_arg, std::allocator<int>()}; // expected-error {{chosen constructor is explicit in copy-initialization}} +} + +int main(int, char**) { + return 0; +} 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 b0f957e3a37..13511fa5148 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 @@ -13,7 +13,7 @@ // template <class... Types> class tuple; // template <class Alloc> -// tuple(allocator_arg_t, const Alloc& a); +// explicit(see-below) tuple(allocator_arg_t, const Alloc& a); // NOTE: this constructor does not currently support tags derived from // allocator_arg_t because libc++ has to deduce the parameter as a template |