// RUN: %check_clang_tidy %s bugprone-reserved-identifier %t -- \
// RUN:   -config='{CheckOptions: [ \
// RUN:     {key: bugprone-reserved-identifier.Invert, value: true}, \
// RUN:     {key: bugprone-reserved-identifier.AllowedIdentifiers, value: std;reference_wrapper;ref;cref;type;get}, \
// RUN:   ]}' -- \
// RUN:   -I%S/Inputs/bugprone-reserved-identifier \
// RUN:   -isystem %S/Inputs/bugprone-reserved-identifier/system

namespace std {

void __f() {}

void f();
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration uses identifier 'f', which is not a reserved identifier [bugprone-reserved-identifier]
// CHECK-FIXES: {{^}}void __f();{{$}}
struct helper {};
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: declaration uses identifier 'helper', which is not a reserved identifier [bugprone-reserved-identifier]
// CHECK-FIXES: {{^}}struct __helper {};{{$}}
struct Helper {};
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: declaration uses identifier 'Helper', which is not a reserved identifier [bugprone-reserved-identifier]
// CHECK-FIXES: {{^}}struct _Helper {};{{$}}
struct _helper2 {};
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: declaration uses identifier '_helper2', which is not a reserved identifier [bugprone-reserved-identifier]
// CHECK-FIXES: {{^}}struct __helper2 {};{{$}}

template <class _Tp>
class reference_wrapper {
public:
  typedef _Tp type;

private:
  type *__f_;

public:
  reference_wrapper(type &__f)
      : __f_(&__f) {}
  // access
  operator type &() const { return *__f_; }
  type &get() const { return *__f_; }
};

template <class _Tp>
inline reference_wrapper<_Tp>
ref(_Tp &__t) noexcept {
  return reference_wrapper<_Tp>(__t);
}

template <class _Tp>
inline reference_wrapper<_Tp>
ref(reference_wrapper<_Tp> __t) noexcept {
  return ref(__t.get());
}

template <class Up>
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: declaration uses identifier 'Up', which is not a reserved identifier [bugprone-reserved-identifier]
// CHECK-FIXES: {{^}}template <class _Up>{{$}}
inline reference_wrapper<const Up>
cref(const Up &u) noexcept {
  // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: declaration uses identifier 'u', which is not a reserved identifier [bugprone-reserved-identifier]
  // CHECK-FIXES: {{^}}cref(const _Up &__u) noexcept {{{$}}
  return reference_wrapper<const Up>(u);
}

template <class _Tp>
inline reference_wrapper<_Tp>
cref(reference_wrapper<const _Tp> __t) noexcept {
  return cref(__t.get());
}

} // namespace std
