Home | History | Annotate | Download | only in forward
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // UNSUPPORTED: c++98, c++03
     11 
     12 // test forward
     13 
     14 #include <utility>
     15 #include <type_traits>
     16 #include <cassert>
     17 
     18 #include "test_macros.h"
     19 
     20 struct A
     21 {
     22 };
     23 
     24 A source() noexcept {return A();}
     25 const A csource() noexcept {return A();}
     26 
     27 
     28 constexpr bool test_constexpr_forward() {
     29 #if TEST_STD_VER > 11
     30     int x = 42;
     31     const int cx = 101;
     32     return std::forward<int&>(x)        == 42
     33         && std::forward<int>(x)         == 42
     34         && std::forward<const int&>(x)  == 42
     35         && std::forward<const int>(x)   == 42
     36         && std::forward<int&&>(x)       == 42
     37         && std::forward<const int&&>(x) == 42
     38         && std::forward<const int&>(cx) == 101
     39         && std::forward<const int>(cx)  == 101;
     40 #else
     41     return true;
     42 #endif
     43 }
     44 
     45 int main()
     46 {
     47     A a;
     48     const A ca = A();
     49 
     50     ((void)a); // Prevent unused warning
     51     ((void)ca); // Prevent unused warning
     52 
     53     static_assert(std::is_same<decltype(std::forward<A&>(a)), A&>::value, "");
     54     static_assert(std::is_same<decltype(std::forward<A>(a)), A&&>::value, "");
     55     static_assert(std::is_same<decltype(std::forward<A>(source())), A&&>::value, "");
     56     static_assert(noexcept(std::forward<A&>(a)), "");
     57     static_assert(noexcept(std::forward<A>(a)), "");
     58     static_assert(noexcept(std::forward<A>(source())), "");
     59 
     60     static_assert(std::is_same<decltype(std::forward<const A&>(a)), const A&>::value, "");
     61     static_assert(std::is_same<decltype(std::forward<const A>(a)), const A&&>::value, "");
     62     static_assert(std::is_same<decltype(std::forward<const A>(source())), const A&&>::value, "");
     63     static_assert(noexcept(std::forward<const A&>(a)), "");
     64     static_assert(noexcept(std::forward<const A>(a)), "");
     65     static_assert(noexcept(std::forward<const A>(source())), "");
     66 
     67     static_assert(std::is_same<decltype(std::forward<const A&>(ca)), const A&>::value, "");
     68     static_assert(std::is_same<decltype(std::forward<const A>(ca)), const A&&>::value, "");
     69     static_assert(std::is_same<decltype(std::forward<const A>(csource())), const A&&>::value, "");
     70     static_assert(noexcept(std::forward<const A&>(ca)), "");
     71     static_assert(noexcept(std::forward<const A>(ca)), "");
     72     static_assert(noexcept(std::forward<const A>(csource())), "");
     73 
     74 #if TEST_STD_VER > 11
     75     {
     76     constexpr int i2 = std::forward<int>(42);
     77     static_assert(std::forward<int>(42) == 42, "");
     78     static_assert(std::forward<const int&>(i2) == 42, "");
     79     static_assert(test_constexpr_forward(), "");
     80     }
     81 #endif
     82 #if TEST_STD_VER == 11 && defined(_LIBCPP_VERSION)
     83     // Test that std::forward is constexpr in C++11. This is an extension
     84     // provided by both libc++ and libstdc++.
     85     {
     86     constexpr int i2 = std::forward<int>(42);
     87     static_assert(std::forward<int>(42) == 42, "" );
     88     static_assert(std::forward<const int&>(i2) == 42, "");
     89     }
     90 #endif
     91 }
     92