// RUN: %check_clang_tidy %s zircon-fbl-move %t

// CHECK-FIXES: #include <utility>

namespace fbl {

template <typename T>
struct remove_reference {
    using type = T;
};

template <typename T>
struct remove_reference<T&> {
    using type = T;
};

template <typename T>
struct remove_reference<T&&> {
    using type = T;
};

template <typename T>
typename remove_reference<T>::type&& move(T&& t) {
    return static_cast<typename remove_reference<T>::type&&>(t);
}

template <typename T>
T&& forward(typename remove_reference<T>::type& t) {
    return static_cast<T&&>(t);
}

template <typename T>
T&& forward(typename remove_reference<T>::type&& t) {
    return static_cast<T&&>(t);
}

} // namespace fbl

namespace std {

template <class _Tp> struct remove_reference        {typedef _Tp type;};
template <class _Tp> struct remove_reference<_Tp&>  {typedef _Tp type;};

template <class T> T&& forward(typename remove_reference<T>::type& t) {}
template <class T> T&& forward(typename remove_reference<T>::type&& t) {}
template <class T> typename remove_reference<T>::type&& move(T&&) {}

} // namespace std

#define MOVE(i) fbl::move(i); fbl::forward<int>(i);
// CHECK-NOTES: [[@LINE-1]]:17: warning: fbl::move is deprecated, use std::move instead
// CHECK-NOTES: [[@LINE-2]]:31: warning: fbl::forward is deprecated, use std::forward instead
// CHECK-FIXES: #define MOVE(i) std::move(i); std::forward<int>(i);

int main() {
  int i = 0;
  fbl::move(i);
  // CHECK-NOTES: [[@LINE-1]]:3: warning: fbl::move is deprecated, use std::move instead
  // CHECK-FIXES: std::move(i)

  fbl::forward<int>(i);
  // CHECK-NOTES: [[@LINE-1]]:3: warning: fbl::forward is deprecated, use std::forward instead
  // CHECK-FIXES: std::forward<int>(i)

  int j = 0;
  std::move(j);
  std::forward<int>(j);

  int k = 0;
  MOVE(k);
}
