brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 689e330 Raw
91 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++0310 11// test forward12 13#include <utility>14#include <type_traits>15#include <cassert>16 17#include "test_macros.h"18 19struct A20{21};22 23A source() TEST_NOEXCEPT {return A();}24const A csource() TEST_NOEXCEPT {return A();}25 26 27#if TEST_STD_VER > 1128constexpr bool test_constexpr_forward() {29    int x = 42;30    const int cx = 101;31    return std::forward<int&>(x)        == 4232        && std::forward<int>(x)         == 4233        && std::forward<const int&>(x)  == 4234        && std::forward<const int>(x)   == 4235        && std::forward<int&&>(x)       == 4236        && std::forward<const int&&>(x) == 4237        && std::forward<const int&>(cx) == 10138        && std::forward<const int>(cx)  == 101;39}40#endif41 42int main(int, char**)43{44    A a;45    const A ca = A();46 47    ((void)a); // Prevent unused warning48    ((void)ca); // Prevent unused warning49 50    static_assert(std::is_same<decltype(std::forward<A&>(a)), A&>::value, "");51    static_assert(std::is_same<decltype(std::forward<A>(a)), A&&>::value, "");52    static_assert(std::is_same<decltype(std::forward<A>(source())), A&&>::value, "");53    ASSERT_NOEXCEPT(std::forward<A&>(a));54    ASSERT_NOEXCEPT(std::forward<A>(a));55    ASSERT_NOEXCEPT(std::forward<A>(source()));56 57    static_assert(std::is_same<decltype(std::forward<const A&>(a)), const A&>::value, "");58    static_assert(std::is_same<decltype(std::forward<const A>(a)), const A&&>::value, "");59    static_assert(std::is_same<decltype(std::forward<const A>(source())), const A&&>::value, "");60    ASSERT_NOEXCEPT(std::forward<const A&>(a));61    ASSERT_NOEXCEPT(std::forward<const A>(a));62    ASSERT_NOEXCEPT(std::forward<const A>(source()));63 64    static_assert(std::is_same<decltype(std::forward<const A&>(ca)), const A&>::value, "");65    static_assert(std::is_same<decltype(std::forward<const A>(ca)), const A&&>::value, "");66    static_assert(std::is_same<decltype(std::forward<const A>(csource())), const A&&>::value, "");67    ASSERT_NOEXCEPT(std::forward<const A&>(ca));68    ASSERT_NOEXCEPT(std::forward<const A>(ca));69    ASSERT_NOEXCEPT(std::forward<const A>(csource()));70 71#if TEST_STD_VER > 1172    {73    constexpr int i2 = std::forward<int>(42);74    static_assert(std::forward<int>(42) == 42, "");75    static_assert(std::forward<const int&>(i2) == 42, "");76    static_assert(test_constexpr_forward(), "");77    }78#endif79#if TEST_STD_VER == 11 && defined(_LIBCPP_VERSION)80    // Test that std::forward is constexpr in C++11. This is an extension81    // provided by both libc++ and libstdc++.82    {83    constexpr int i2 = std::forward<int>(42);84    static_assert(std::forward<int>(42) == 42, "" );85    static_assert(std::forward<const int&>(i2) == 42, "");86    }87#endif88 89  return 0;90}91