//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // // LWG-3382 NTTP for pair and array: // Two values p1 and p2 of type pair are template-argument-equivalent ([temp.type]) if and only if // p1.first and p2.first are template-argument-equivalent and p1.second and p2.second are template-argument-equivalent. // This deprecated ABI switch makes pair a non-structural type. // XFAIL: libcpp-deprecated-abi-disable-pair-trivial-copy-ctor #include #include int i = 0; int j = 1; namespace test_full_type { template P> struct test : std::false_type {}; template <> struct test{i, 5}> : std::true_type {}; static_assert(!test{}>::value); static_assert(!test{}>::value); static_assert(!test{i, nullptr}>::value); static_assert(!test{j, 0}>::value); static_assert(!test{j, 5}>::value); static_assert(!test{i, 0}>::value); static_assert(!test{j, 0}>::value); static_assert(test{i, 5}>::value); } // namespace test_full_type namespace test_ctad { template struct test : std::false_type {}; template <> struct test{i, 10}> : std::true_type {}; static_assert(!test{}>::value); static_assert(!test{}>::value); static_assert(!test{i, nullptr}>::value); static_assert(!test{j, 0}>::value); static_assert(!test{j, 10}>::value); static_assert(!test{i, 0}>::value); static_assert(!test{j, 0}>::value); static_assert(test{i, 10}>::value); } // namespace test_ctad namespace test_auto { template struct test : std::false_type {}; template <> struct test{i, 15}> : std::true_type {}; static_assert(!test{}>::value); static_assert(!test{}>::value); static_assert(!test{i, nullptr}>::value); static_assert(!test{j, 0}>::value); static_assert(!test{j, 15}>::value); static_assert(!test{i, 0}>::value); static_assert(!test{j, 0}>::value); static_assert(test{i, 15}>::value); } // namespace test_auto