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 Dionneint 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