xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/bugprone/reserved-identifier-invert.cpp (revision e8a3ddafe063c970df9c23e803812369abde4c82)
189a1d03eSRichard // RUN: %check_clang_tidy %s bugprone-reserved-identifier %t -- \
2*e8a3ddafSNathan James // RUN:   -config='{CheckOptions: { \
3*e8a3ddafSNathan James // RUN:     bugprone-reserved-identifier.Invert: true, \
4*e8a3ddafSNathan James // RUN:     bugprone-reserved-identifier.AllowedIdentifiers: "std;reference_wrapper;ref;^c?ref;type;get" \
5*e8a3ddafSNathan James // RUN:   }}' -- \
689a1d03eSRichard // RUN:   -I%S/Inputs/reserved-identifier \
789a1d03eSRichard // RUN:   -isystem %S/Inputs/reserved-identifier/system
889a1d03eSRichard 
989a1d03eSRichard namespace std {
1089a1d03eSRichard 
__f()1189a1d03eSRichard void __f() {}
1289a1d03eSRichard 
1389a1d03eSRichard void f();
1489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration uses identifier 'f', which is not a reserved identifier [bugprone-reserved-identifier]
1589a1d03eSRichard // CHECK-FIXES: {{^}}void __f();{{$}}
1689a1d03eSRichard struct helper {};
1789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: declaration uses identifier 'helper', which is not a reserved identifier [bugprone-reserved-identifier]
1889a1d03eSRichard // CHECK-FIXES: {{^}}struct __helper {};{{$}}
1989a1d03eSRichard struct Helper {};
2089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: declaration uses identifier 'Helper', which is not a reserved identifier [bugprone-reserved-identifier]
2189a1d03eSRichard // CHECK-FIXES: {{^}}struct _Helper {};{{$}}
2289a1d03eSRichard struct _helper2 {};
2389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: declaration uses identifier '_helper2', which is not a reserved identifier [bugprone-reserved-identifier]
2489a1d03eSRichard // CHECK-FIXES: {{^}}struct __helper2 {};{{$}}
2589a1d03eSRichard 
2689a1d03eSRichard template <class _Tp>
2789a1d03eSRichard class reference_wrapper {
2889a1d03eSRichard public:
2989a1d03eSRichard   typedef _Tp type;
3089a1d03eSRichard 
3189a1d03eSRichard private:
3289a1d03eSRichard   type *__f_;
3389a1d03eSRichard 
3489a1d03eSRichard public:
reference_wrapper(type & __f)3589a1d03eSRichard   reference_wrapper(type &__f)
3689a1d03eSRichard       : __f_(&__f) {}
3789a1d03eSRichard   // access
operator type&() const3889a1d03eSRichard   operator type &() const { return *__f_; }
get() const3989a1d03eSRichard   type &get() const { return *__f_; }
4089a1d03eSRichard };
4189a1d03eSRichard 
4289a1d03eSRichard template <class _Tp>
4389a1d03eSRichard inline reference_wrapper<_Tp>
ref(_Tp & __t)4489a1d03eSRichard ref(_Tp &__t) noexcept {
4589a1d03eSRichard   return reference_wrapper<_Tp>(__t);
4689a1d03eSRichard }
4789a1d03eSRichard 
4889a1d03eSRichard template <class _Tp>
4989a1d03eSRichard inline reference_wrapper<_Tp>
ref(reference_wrapper<_Tp> __t)5089a1d03eSRichard ref(reference_wrapper<_Tp> __t) noexcept {
5189a1d03eSRichard   return ref(__t.get());
5289a1d03eSRichard }
5389a1d03eSRichard 
5489a1d03eSRichard template <class Up>
5589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: declaration uses identifier 'Up', which is not a reserved identifier [bugprone-reserved-identifier]
5689a1d03eSRichard // CHECK-FIXES: {{^}}template <class _Up>{{$}}
5789a1d03eSRichard inline reference_wrapper<const Up>
cref(const Up & u)5889a1d03eSRichard cref(const Up &u) noexcept {
5989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: declaration uses identifier 'u', which is not a reserved identifier [bugprone-reserved-identifier]
6089a1d03eSRichard   // CHECK-FIXES: {{^}}cref(const _Up &__u) noexcept {{{$}}
6189a1d03eSRichard   return reference_wrapper<const Up>(u);
6289a1d03eSRichard }
6389a1d03eSRichard 
6489a1d03eSRichard template <class _Tp>
6589a1d03eSRichard inline reference_wrapper<_Tp>
cref(reference_wrapper<const _Tp> __t)6689a1d03eSRichard cref(reference_wrapper<const _Tp> __t) noexcept {
6789a1d03eSRichard   return cref(__t.get());
6889a1d03eSRichard }
6989a1d03eSRichard 
7089a1d03eSRichard } // namespace std
71