Index: tools/clang/plugins/tests/virtual_specifiers.cpp |
diff --git a/tools/clang/plugins/tests/virtual_specifiers.cpp b/tools/clang/plugins/tests/virtual_specifiers.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f566ac4f2a6cd205c493f8446803f7f397d29ab2 |
--- /dev/null |
+++ b/tools/clang/plugins/tests/virtual_specifiers.cpp |
@@ -0,0 +1,132 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+// |
+// Tests for chromium style checks for virtual/override/final specifiers on |
+// virtual methods. |
+ |
+// Note: This is not actual windows.h but the stub file in system/windows.h |
+#include <windows.h> |
+ |
+// Purposely use macros to test that the FixIt hints don't try to remove the |
+// macro body. |
+#define OVERRIDE override |
+#define FINAL final |
+ |
+// Base class can only use virtual. |
+class Base { |
+ public: |
+ virtual ~Base() {} |
+ virtual void F() = 0; |
+}; |
+ |
+// Derived classes correctly use only override or final specifier. |
+class CorrectOverride : public Base { |
+ public: |
+ ~CorrectOverride() OVERRIDE {} |
+ void F() OVERRIDE {} |
+}; |
+ |
+class CorrectFinal : public CorrectOverride { |
+ public: |
+ ~CorrectFinal() FINAL {} |
+ void F() FINAL {} |
+}; |
+ |
+// No override on an overridden method should trigger a diagnostic. |
+class MissingOverride : public Base { |
+ public: |
+ ~MissingOverride() {} |
+ void F() {} |
+}; |
+ |
+// Redundant specifiers should trigger a diagnostic. |
+class VirtualAndOverride : public Base { |
+ public: |
+ virtual ~VirtualAndOverride() OVERRIDE {} |
+ virtual void F() OVERRIDE {} |
+}; |
+ |
+class VirtualAndFinal : public Base { |
+ public: |
+ virtual ~VirtualAndFinal() FINAL {} |
+ virtual void F() FINAL {} |
+}; |
+ |
+class VirtualAndOverrideFinal : public Base { |
+ public: |
+ virtual ~VirtualAndOverrideFinal() OVERRIDE FINAL {} |
+ virtual void F() OVERRIDE FINAL {} |
+}; |
+ |
+class OverrideAndFinal : public Base { |
+ public: |
+ ~OverrideAndFinal() OVERRIDE FINAL {} |
+ void F() OVERRIDE FINAL {} |
+}; |
+ |
+// Also warn on pure functions. |
+class CorrectPureVirtual : public Base { |
+ virtual void F() = 0; |
+}; |
+ |
+class Pure : public Base { |
+ void F() = 0; |
+}; |
+ |
+class PureOverride : public Base { |
+ void F() override = 0; |
+}; |
+ |
+class PureVirtualOverride : public Base { |
+ virtual void F() override = 0; |
+}; |
+ |
+// Test that the redundant virtual warning is suppressed when the virtual |
+// keyword comes from a macro in a system header. |
+class COMIsAwesome : public Base { |
+ STDMETHOD(F)() override = 0; |
+}; |
+ |
+// Some tests that overrides in the testing namespace |
+// don't trigger warnings, except for testing::Test. |
+namespace testing { |
+ |
+class Test { |
+ public: |
+ virtual ~Test(); |
+ virtual void SetUp(); |
+}; |
+ |
+class NotTest { |
+ public: |
+ virtual ~NotTest(); |
+ virtual void SetUp(); |
+}; |
+ |
+} // namespace |
+ |
+class MyTest : public testing::Test { |
+ public: |
+ virtual ~MyTest(); |
+ virtual void SetUp() override; |
+}; |
+ |
+class MyNotTest : public testing::NotTest { |
+ public: |
+ virtual ~MyNotTest(); |
+ virtual void SetUp() override; |
+}; |
+ |
+class MacroBase { |
+ public: |
+ virtual void AddRef() = 0; |
+ virtual void Virtual() {} |
+}; |
+ |
+class Sub : public MacroBase { |
+ // Shouldn't warn. |
+ END_COM_MAP() |
+ SYSTEM_REDUNDANT1; |
+ SYSTEM_REDUNDANT2; |
+}; |