// RUN: %check_clang_tidy %s cert-dcl21-cpp %t class A {}; A operator++(A &, int); // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a non-constant object instead of a constant object type [cert-dcl21-cpp] // CHECK-FIXES: {{^}}const A operator++(A &, int); A operator--(A &, int); // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator--' returns a no // CHECK-FIXES: {{^}}const A operator--(A &, int); class B {}; B &operator++(B &); const B operator++(B &, int); B &operator--(B &); const B operator--(B &, int); class D { D &operator++(); const D operator++(int); D &operator--(); const D operator--(int); }; class C { C operator++(int); // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a no // CHECK-FIXES: {{^}}const C operator++(int); C operator--(int); // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator--' returns a no // CHECK-FIXES: {{^}}const C operator--(int); }; class E {}; E &operator++(E &, int); // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a reference instead of a constant object type [cert-dcl21-cpp] // CHECK-FIXES: {{^}}const E operator++(E &, int); E &operator--(E &, int); // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator--' returns a re // CHECK-FIXES: {{^}}const E operator--(E &, int); class G { G &operator++(int); // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a re // CHECK-FIXES: {{^}}const G operator++(int); G &operator--(int); // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator--' returns a re // CHECK-FIXES: {{^}}const G operator--(int); }; class F {}; const F &operator++(F &, int); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator++' returns a re // CHECK-FIXES: {{^}}const F operator++(F &, int); const F &operator--(F &, int); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator--' returns a re // CHECK-FIXES: {{^}}const F operator--(F &, int); class H { const H &operator++(int); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator++' returns a re // CHECK-FIXES: {{^}}const H operator++(int); const H &operator--(int); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator--' returns a re // CHECK-FIXES: {{^}}const H operator--(int); }; #define FROM_MACRO P& class P { const FROM_MACRO operator++(int); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator++' returns a re // CHECK-FIXES: {{^}}const FROM_MACRO operator++(int); }; template class Q { const Q &operator++(int); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator++' returns a re // CHECK-FIXES: {{^}}const Q operator++(int); const Q &operator--(int); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator--' returns a re // CHECK-FIXES: {{^}}const Q operator--(int); }; void foobar() { Q a; Q b; (void)a; (void)b; } struct S {}; typedef S& SRef; SRef operator++(SRef, int); // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a re // CHECK-FIXES: {{^}}SRef operator++(SRef, int); struct T { typedef T& TRef; TRef operator++(int); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: overloaded 'operator++' returns a re // CHECK-FIXES: {{^}} TRef operator++(int); }; struct U { typedef const U& ConstURef; ConstURef& operator++(int); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: overloaded 'operator++' returns a re // CHECK-FIXES: {{^}} ConstURef& operator++(int); }; struct V { V *operator++(int); V *const operator--(int); };