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()1189a1d03eSRichardvoid __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)4489a1d03eSRichardref(_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)5089a1d03eSRichardref(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)5889a1d03eSRichardcref(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)6689a1d03eSRichardcref(reference_wrapper<const _Tp> __t) noexcept { 6789a1d03eSRichard return cref(__t.get()); 6889a1d03eSRichard } 6989a1d03eSRichard 7089a1d03eSRichard } // namespace std 71