diff options
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/bugprone-virtual-near-miss.cpp')
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/bugprone-virtual-near-miss.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/bugprone-virtual-near-miss.cpp b/clang-tools-extra/test/clang-tidy/bugprone-virtual-near-miss.cpp new file mode 100644 index 00000000000..553d2f45a98 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/bugprone-virtual-near-miss.cpp @@ -0,0 +1,133 @@ +// RUN: %check_clang_tidy %s bugprone-virtual-near-miss %t + +class NoDefinedClass1; +class NoDefinedClass2; + +struct Base { + virtual void func(); + virtual void gunk(); + virtual ~Base(); + virtual Base &operator=(const Base &); + virtual NoDefinedClass1 *f(); +}; + +struct Derived : Base { + // Should not warn "do you want to override 'gunk'?", because gunk is already + // overriden by this class. + virtual void funk(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Derived::funk' has a similar name and the same signature as virtual method 'Base::func'; did you mean to override it? [bugprone-virtual-near-miss] + // CHECK-FIXES: virtual void func(); + + void func2(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Derived::func2' has {{.*}} 'Base::func' + // CHECK-FIXES: void func(); + + void func22(); // Should not warn. + + void gunk(); // Should not warn: gunk is override. + + void fun(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Derived::fun' has {{.*}} 'Base::func' + // CHECK-FIXES: void func(); + + Derived &operator==(const Base &); // Should not warn: operators are ignored. + + virtual NoDefinedClass2 *f1(); // Should not crash: non-defined class return type is ignored. +}; + +template <typename T> +struct TBase { + virtual void tfunc(T t); +}; + +template <typename T> +struct TDerived : TBase<T> { + virtual void tfunk(T t); + // Should not apply fix for template. + // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: method 'TDerived<double>::tfunk' has {{.*}} 'TBase<double>::tfunc' + // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: method 'TDerived<int>::tfunk' has {{.*}} 'TBase<int>::tfunc' + // CHECK-FIXES: virtual void tfunk(T t); +}; + +TDerived<int> T1; +TDerived<double> T2; + +// Should not fix macro definition +#define MACRO1 void funcM() +// CHECK-FIXES: #define MACRO1 void funcM() +#define MACRO2(m) void m() +// CHECK-FIXES: #define MACRO2(m) void m() + +struct DerivedMacro : Base { + MACRO1; + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'DerivedMacro::funcM' has {{.*}} 'Base::func' + // CHECK-FIXES: MACRO1; + + MACRO2(func3); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'DerivedMacro::func3' has {{.*}} 'Base::func' + // CHECK-FIXES: MACRO2(func); +}; + +typedef Derived derived_type; + +class Father { +public: + Father(); + virtual void func(); + virtual Father *create(int i); + virtual Base &&generate(); + virtual Base *canonical(Derived D); +}; + +class Mother { +public: + Mother(); + static void method(); + virtual int method(int argc, const char **argv); + virtual int method(int argc) const; + virtual int decay(const char *str); +}; + +class Child : private Father, private Mother { +public: + Child(); + + virtual void func2(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::func2' has {{.*}} 'Father::func' + // CHECK-FIXES: virtual void func(); + + int methoe(int x, char **strs); // Should not warn: parameter types don't match. + + int methoe(int x); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::methoe' has {{.*}} 'Mother::method' + // CHECK-FIXES: int method(int x); + + void methof(int x, const char **strs); // Should not warn: return types don't match. + + int methoh(int x, const char **strs); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::methoh' has {{.*}} 'Mother::method' + // CHECK-FIXES: int method(int x, const char **strs); + + virtual Child *creat(int i); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::creat' has {{.*}} 'Father::create' + // CHECK-FIXES: virtual Child *create(int i); + + virtual Derived &&generat(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::generat' has {{.*}} 'Father::generate' + // CHECK-FIXES: virtual Derived &&generate(); + + int decaz(const char str[]); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::decaz' has {{.*}} 'Mother::decay' + // CHECK-FIXES: int decay(const char str[]); + + operator bool(); + + derived_type *canonica(derived_type D); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::canonica' has {{.*}} 'Father::canonical' + // CHECK-FIXES: derived_type *canonical(derived_type D); + +private: + void funk(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: method 'Child::funk' has {{.*}} 'Father::func' + // CHECK-FIXES: void func(); +}; |

