Chromium Code Reviews| Index: tools/clang/plugins/tests/virtual_bodies.h |
| diff --git a/tools/clang/plugins/tests/virtual_bodies.h b/tools/clang/plugins/tests/virtual_bodies.h |
| index fb971c3f1e89dd0d8f7d8cced841dff0b7f4e288..3f7898540907735f603eed153df39a1e8066d536 100644 |
| --- a/tools/clang/plugins/tests/virtual_bodies.h |
| +++ b/tools/clang/plugins/tests/virtual_bodies.h |
| @@ -8,43 +8,133 @@ |
| // Note: This is not actual windows.h but the stub file in system/windows.h |
| #include <windows.h> |
| -#define CR_BEGIN_MSG_MAP_EX(theClass) virtual int f() { return 4; } |
| -#define BEGIN_SAFE_MSG_MAP_EX(theClass) virtual int g() { return 4; } |
| - |
| -// Should warn about virtual method usage. |
| -class VirtualMethodsInHeaders { |
| - public: |
| - // Don't complain about these. |
| - virtual void MethodIsAbstract() = 0; |
| - virtual void MethodHasNoArguments(); |
| - virtual void MethodHasEmptyDefaultImpl() {} |
| - |
| - // But complain about this: |
| - virtual bool ComplainAboutThis() { return true; } |
| - |
| - SYSTEM_INLINE_VIRTUAL |
| - CR_BEGIN_MSG_MAP_EX(Sub) |
| - BEGIN_SAFE_MSG_MAP_EX(Sub) |
| +struct NonTrivial { |
| + NonTrivial(); |
| + ~NonTrivial(); |
| }; |
| -// Complain on missing 'virtual' keyword in overrides. |
| -class WarnOnMissingVirtual : public VirtualMethodsInHeaders { |
| +// Should warn about inline constructors with too many inline virtual methods. |
| +class InlineVirtualMethodsInHeaders { |
| public: |
| - void MethodHasNoArguments() override; |
| + // Complain about the inline/missing constructor. |
| + virtual void Method1() {} |
| + virtual bool Method2() { return true; } |
| + virtual void Method3() {} |
| + virtual bool Method4() { return true; } |
| + virtual void Method5() {} |
| }; |
| -// Don't complain about things in a 'testing' namespace. |
| -namespace testing { |
| -struct TestStruct {}; |
| -} // namespace testing |
| - |
| -class VirtualMethodsInHeadersTesting : public VirtualMethodsInHeaders { |
| +// Should warn about inline constructors with long inline virtual methods. |
| +class LongInlineVirtualMethods { |
| public: |
| - // Don't complain about no virtual testing methods. |
| - void MethodHasNoArguments(); |
| + // Complain about the inline/missing constructor. |
| + virtual int LongMethod() { |
| + int x = 1; |
| + int y = x * x; |
| + int w = 73; |
| + int u = 1; |
| + for (int z = 7; z < 8; ++z) { |
| + if (z > x) { |
| + return x + 1; |
| + } else { |
| + return z - 1; |
| + } |
| + } |
| + return 1; |
| + } |
| +}; |
| + |
| +// Should not warn if enough virtual methods are out-of-line. |
|
dcheng
2016/03/24 17:37:25
Nit: I find this comment a bit confusing because t
|
| +class OutoflineVirtualMethodsInHeaders { |
| + public: |
| + // Complain about the inline/missing constructor. |
| + virtual void Method1(); |
| + virtual bool Method2() { return true; } |
| + virtual void Method3() {} |
| + virtual bool Method4() { return true; } |
| + virtual void Method5() {} |
| +}; |
| + |
| +class InlineVirtualMethodsInAbstractClass { |
| + public: |
| + // Accept an inline constructor for a base class. |
| + virtual void Abstract() = 0; |
| + virtual void Method1() {} |
| + virtual bool Method2() { return true; } |
| + virtual void Method3() {} |
| + virtual bool Method4() { return true; } |
| + virtual void Method5() {} |
| +}; |
| + |
| +class InlineVirtualMethodsWithProtectedConstructor { |
| + protected: |
| + // Accept an inline constructor for a base class. |
| + InlineVirtualMethodsWithProtectedConstructor() {} |
| + |
| + public: |
| + virtual void Method1() {} |
| + virtual bool Method2() { return true; } |
| + virtual void Method3() {} |
| + virtual bool Method4() { return true; } |
| + virtual void Method5() {} |
| +}; |
| + |
| +// Complain for leaf classes even if they inherit their inline virtual methods. |
| +class InlineVirtualMethodsInLeafClass |
| + : public InlineVirtualMethodsInAbstractClass { |
| + public: |
| + void Abstract() override; |
| +}; |
| + |
| +class DtorInlineVirtualMethodsInHeaders { |
| + public: |
| + DtorInlineVirtualMethodsInHeaders(); |
| + // Complain about the inline destructor. |
|
dcheng
2016/03/24 17:37:25
Nit: non-virtual inline
|
| + ~DtorInlineVirtualMethodsInHeaders() {} |
| + |
| + virtual void Method1() {} |
| + virtual bool Method2() { return true; } |
| + virtual void Method3() {} |
| + virtual bool Method4() { return true; } |
| + virtual void Method5() {} |
| private: |
| - testing::TestStruct tester_; |
| + NonTrivial non_trivial; |
| +}; |
| + |
| +class VirtualDtorInlineVirtualMethodsInHeaders { |
| + public: |
| + VirtualDtorInlineVirtualMethodsInHeaders(); |
| + // Don't complain about the inline virtual destructor. |
| + virtual ~VirtualDtorInlineVirtualMethodsInHeaders() {} |
| + |
| + virtual void Method1() {} |
| + virtual bool Method2() { return true; } |
| + virtual void Method3() {} |
| + virtual bool Method4() { return true; } |
| + virtual void Method5() {} |
| + |
| + private: |
| + NonTrivial non_trivial; |
| +}; |
| + |
| +// Check for a bug in which the inline destructor for the most-derived class is |
| +// re-counted for each base class whose destructor it overrides. |
| +struct Base1 { |
| + virtual ~Base1(); |
| + virtual void Abstract() = 0; |
| +}; |
| +struct Base2 : Base1 {}; |
| +struct Base3 : Base2 {}; |
| +struct Base4 : Base3 {}; |
| +struct Base5 : Base4 {}; |
| +struct Base6 : Base5 {}; |
| +struct Base7 : Base6 {}; |
| +struct Base8 : Base7 {}; |
| +struct Base9 : Base8 {}; |
| +struct Derived : Base9 { |
| + ~Derived() override {} |
| + void Abstract() override; |
| }; |
| #endif // VIRTUAL_METHODS_H_ |