| 1 | // RUN: %check_clang_tidy -std=c++14 %s cppcoreguidelines-missing-std-forward %t -- \ |
| 2 | // RUN: -config="{CheckOptions: {cppcoreguidelines-missing-std-forward.ForwardFunction: custom_forward}}" -- -fno-delayed-template-parsing |
| 3 | |
| 4 | // NOLINTBEGIN |
| 5 | namespace std { |
| 6 | |
| 7 | template <typename T> struct remove_reference { using type = T; }; |
| 8 | template <typename T> struct remove_reference<T&> { using type = T; }; |
| 9 | template <typename T> struct remove_reference<T&&> { using type = T; }; |
| 10 | |
| 11 | template <typename T> using remove_reference_t = typename remove_reference<T>::type; |
| 12 | |
| 13 | template <typename T> constexpr T &&forward(remove_reference_t<T> &t) noexcept; |
| 14 | template <typename T> constexpr T &&forward(remove_reference_t<T> &&t) noexcept; |
| 15 | template <typename T> constexpr remove_reference_t<T> &&move(T &&x); |
| 16 | |
| 17 | } // namespace std |
| 18 | // NOLINTEND |
| 19 | |
| 20 | template<class T> |
| 21 | constexpr decltype(auto) custom_forward(std::remove_reference_t<T>& tmp) noexcept |
| 22 | { |
| 23 | return static_cast<T&&>(tmp); |
| 24 | } |
| 25 | |
| 26 | template<class T> |
| 27 | constexpr decltype(auto) custom_forward(std::remove_reference_t<T>&& tmp) noexcept |
| 28 | { |
| 29 | return static_cast<T&&>(tmp); |
| 30 | } |
| 31 | |
| 32 | template<class T> |
| 33 | void forward_with_std(T&& t) { |
| 34 | // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: forwarding reference parameter 't' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward] |
| 35 | |
| 36 | T other{std::forward<T>(t)}; |
| 37 | } |
| 38 | |
| 39 | template<class T> |
| 40 | void move_with_custom(T&& t) { |
| 41 | T other{custom_forward<T>(t)}; |
| 42 | } |
| 43 | |