xref: /llvm-project/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/test_lazy_sfinae.pass.cpp (revision a3ab5120fd572215afeac190757834a041dda73a)
17b60958aSEric Fiselier //===----------------------------------------------------------------------===//
27b60958aSEric 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
67b60958aSEric Fiselier //
77b60958aSEric Fiselier //===----------------------------------------------------------------------===//
87b60958aSEric Fiselier 
97b60958aSEric Fiselier // <tuple>
107b60958aSEric Fiselier 
117b60958aSEric Fiselier // template <class... Types> class tuple;
127b60958aSEric Fiselier 
1331cbe0f2SLouis Dionne // UNSUPPORTED: c++03
147b60958aSEric Fiselier 
15*a3ab5120SLouis Dionne // Test the following constructors:
16*a3ab5120SLouis Dionne // (1) tuple(Types const&...)
17*a3ab5120SLouis Dionne // (2) tuple(UTypes&&...)
18*a3ab5120SLouis Dionne // Test that (1) short circuits before evaluating the copy constructor of the
19*a3ab5120SLouis Dionne // second argument. Constructor (2) should be selected.
20*a3ab5120SLouis Dionne 
217b60958aSEric Fiselier #include <tuple>
227b60958aSEric Fiselier #include <utility>
237b60958aSEric Fiselier #include <cassert>
247b60958aSEric Fiselier 
257fc6a556SMarshall Clow #include "test_macros.h"
267fc6a556SMarshall Clow 
277b60958aSEric Fiselier struct NonConstCopyable {
287b60958aSEric Fiselier   NonConstCopyable() = default;
NonConstCopyableNonConstCopyable297b60958aSEric Fiselier   explicit NonConstCopyable(int v) : value(v) {}
307b60958aSEric Fiselier   NonConstCopyable(NonConstCopyable&) = default;
317b60958aSEric Fiselier   NonConstCopyable(NonConstCopyable const&) = delete;
327b60958aSEric Fiselier   int value;
337b60958aSEric Fiselier };
347b60958aSEric Fiselier 
357b60958aSEric Fiselier template <class T>
367b60958aSEric Fiselier struct BlowsUpOnConstCopy {
377b60958aSEric Fiselier   BlowsUpOnConstCopy() = default;
BlowsUpOnConstCopyBlowsUpOnConstCopy387b60958aSEric Fiselier   constexpr BlowsUpOnConstCopy(BlowsUpOnConstCopy const&) {
397b60958aSEric Fiselier       static_assert(!std::is_same<T, T>::value, "");
407b60958aSEric Fiselier   }
417b60958aSEric Fiselier   BlowsUpOnConstCopy(BlowsUpOnConstCopy&) = default;
427b60958aSEric Fiselier };
437b60958aSEric Fiselier 
main(int,char **)44*a3ab5120SLouis Dionne int main(int, char**) {
457b60958aSEric Fiselier   NonConstCopyable v(42);
467b60958aSEric Fiselier   BlowsUpOnConstCopy<int> b;
477b60958aSEric Fiselier   std::tuple<NonConstCopyable, BlowsUpOnConstCopy<int>> t(v, b);
487b60958aSEric Fiselier   assert(std::get<0>(t).value == 42);
492df59c50SJF Bastien 
502df59c50SJF Bastien   return 0;
517b60958aSEric Fiselier }
52