159e26308SLouis Dionne //===----------------------------------------------------------------------===//
259e26308SLouis Dionne //
359e26308SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
459e26308SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
559e26308SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
659e26308SLouis Dionne //
759e26308SLouis Dionne //===----------------------------------------------------------------------===//
859e26308SLouis Dionne 
9*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03
1059e26308SLouis Dionne 
1159e26308SLouis Dionne // <tuple>
1259e26308SLouis Dionne 
1359e26308SLouis Dionne // template <class... Types> class tuple;
1459e26308SLouis Dionne 
1559e26308SLouis Dionne // template <class Alloc>
1659e26308SLouis Dionne //   explicit(see-below) tuple(allocator_arg_t, const Alloc& a);
1759e26308SLouis Dionne 
1859e26308SLouis Dionne // Make sure we get the explicit-ness of the constructor right.
1959e26308SLouis Dionne // This is LWG 3158.
2059e26308SLouis Dionne 
2159e26308SLouis Dionne #include <tuple>
2259e26308SLouis Dionne #include <memory>
2359e26308SLouis Dionne 
2459e26308SLouis Dionne 
ExplicitDefaultExplicitDefault2559e26308SLouis Dionne struct ExplicitDefault { explicit ExplicitDefault() { } };
2659e26308SLouis Dionne 
explicit_default_test()2759e26308SLouis Dionne std::tuple<ExplicitDefault> explicit_default_test() {
2859e26308SLouis Dionne     return {std::allocator_arg, std::allocator<int>()}; // expected-error {{chosen constructor is explicit in copy-initialization}}
2959e26308SLouis Dionne }
3059e26308SLouis Dionne 
main(int,char **)3159e26308SLouis Dionne int main(int, char**) {
3259e26308SLouis Dionne     return 0;
3359e26308SLouis Dionne }
34