1cd1493b0829b48407887844921ef0e040c0f485alakedaemon//===----------------------------------------------------------------------===//
220c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen//
320c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen//                     The LLVM Compiler Infrastructure
420c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen//
520c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen// This file is dual licensed under the MIT and the University of Illinois Open
620c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen// Source Licenses. See LICENSE.TXT for details.
720c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen//
820c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen//===----------------------------------------------------------------------===//
920c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen
10f98870715a56875616b9a476a5fd21f05264b445Wouter van Oortmerssen// <tuple>
11f98870715a56875616b9a476a5fd21f05264b445Wouter van Oortmerssen
12f98870715a56875616b9a476a5fd21f05264b445Wouter van Oortmerssen// template <class... Types> class tuple;
13f98870715a56875616b9a476a5fd21f05264b445Wouter van Oortmerssen
14f98870715a56875616b9a476a5fd21f05264b445Wouter van Oortmerssen// template <class Alloc, class ...UTypes>
15f98870715a56875616b9a476a5fd21f05264b445Wouter van Oortmerssen//   tuple(allocator_arg_t, const Alloc& a, tuple<UTypes...> const&);
16f98870715a56875616b9a476a5fd21f05264b445Wouter van Oortmerssen
1720c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen// UNSUPPORTED: c++98, c++03
1820c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen
1920c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen#include <tuple>
2020c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen#include <memory>
2120c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen
2220c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssenstruct ExplicitCopy {
2320c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen  explicit ExplicitCopy(int) {}
2420c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen  explicit ExplicitCopy(ExplicitCopy const&) {}
2520c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen
2620c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen};
2720c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen
2820c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssenstd::tuple<ExplicitCopy> const_explicit_copy_test() {
2920c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen    const std::tuple<int> t1(42);
3020c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen    return {std::allocator_arg, std::allocator<void>{}, t1};
3120c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen    // expected-error@-1 {{chosen constructor is explicit in copy-initialization}}
3220c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen}
3320c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssen
3420c0082ee5bfeeecaa443c001a89934e9448ffa4Wouter van Oortmerssenstd::tuple<ExplicitCopy> non_const_explicit_copy_test() {
35    std::tuple<int> t1(42);
36    return {std::allocator_arg, std::allocator<void>{}, t1};
37    // expected-error@-1 {{chosen constructor is explicit in copy-initialization}}
38}
39
40int main()
41{
42
43}
44