15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03
1095f8e6aaSEric Fiselier 
115a83710eSEric Fiselier // <utility>
125a83710eSEric Fiselier 
135a83710eSEric Fiselier // template <class T1, class T2> struct pair
145a83710eSEric Fiselier 
15e16f2cb6SLouis Dionne // struct piecewise_construct_t { explicit piecewise_construct_t() = default; };
165a83710eSEric Fiselier // constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();
175a83710eSEric Fiselier 
185a83710eSEric Fiselier #include <utility>
195a83710eSEric Fiselier #include <tuple>
205a83710eSEric Fiselier #include <cassert>
215a83710eSEric Fiselier 
227fc6a556SMarshall Clow #include "test_macros.h"
237fc6a556SMarshall Clow 
245a83710eSEric Fiselier class A
255a83710eSEric Fiselier {
265a83710eSEric Fiselier     int i_;
275a83710eSEric Fiselier     char c_;
285a83710eSEric Fiselier public:
A(int i,char c)29*06e2b737SArthur O'Dwyer     constexpr A(int i, char c) : i_(i), c_(c) {}
get_i() const30*06e2b737SArthur O'Dwyer     constexpr int get_i() const {return i_;}
get_c() const31*06e2b737SArthur O'Dwyer     constexpr char get_c() const {return c_;}
325a83710eSEric Fiselier };
335a83710eSEric Fiselier 
345a83710eSEric Fiselier class B
355a83710eSEric Fiselier {
365a83710eSEric Fiselier     double d_;
375a83710eSEric Fiselier     unsigned u1_;
385a83710eSEric Fiselier     unsigned u2_;
395a83710eSEric Fiselier public:
B(double d,unsigned u1,unsigned u2)40*06e2b737SArthur O'Dwyer     constexpr explicit B(double d, unsigned u1, unsigned u2) : d_(d), u1_(u1), u2_(u2) {}
get_d() const41*06e2b737SArthur O'Dwyer     constexpr double get_d() const {return d_;}
get_u1() const42*06e2b737SArthur O'Dwyer     constexpr unsigned get_u1() const {return u1_;}
get_u2() const43*06e2b737SArthur O'Dwyer     constexpr unsigned get_u2() const {return u2_;}
445a83710eSEric Fiselier };
455a83710eSEric Fiselier 
46*06e2b737SArthur O'Dwyer TEST_CONSTEXPR_CXX20
test()47*06e2b737SArthur O'Dwyer bool test()
485a83710eSEric Fiselier {
495a83710eSEric Fiselier     std::pair<A, B> p(std::piecewise_construct,
505a83710eSEric Fiselier                       std::make_tuple(4, 'a'),
515a83710eSEric Fiselier                       std::make_tuple(3.5, 6u, 2u));
525a83710eSEric Fiselier     assert(p.first.get_i() == 4);
535a83710eSEric Fiselier     assert(p.first.get_c() == 'a');
545a83710eSEric Fiselier     assert(p.second.get_d() == 3.5);
555a83710eSEric Fiselier     assert(p.second.get_u1() == 6u);
565a83710eSEric Fiselier     assert(p.second.get_u2() == 2u);
572df59c50SJF Bastien 
58*06e2b737SArthur O'Dwyer     return true;
59*06e2b737SArthur O'Dwyer }
60*06e2b737SArthur O'Dwyer 
main(int,char **)61*06e2b737SArthur O'Dwyer int main(int, char**)
62*06e2b737SArthur O'Dwyer {
63*06e2b737SArthur O'Dwyer     test();
64*06e2b737SArthur O'Dwyer #if TEST_STD_VER >= 20
65*06e2b737SArthur O'Dwyer     static_assert(test());
66*06e2b737SArthur O'Dwyer #endif
67*06e2b737SArthur O'Dwyer 
682df59c50SJF Bastien     return 0;
695a83710eSEric Fiselier }
70