From 41968f1999e97e6982f06318a5bb226ef1a14ada Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Wed, 9 Jul 2014 21:21:39 +0000 Subject: Removed the "-fix" suffix from tests that verify both fixes and messages. git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@212658 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/clang-tidy/redundant-smartptr-get-fix.cpp | 131 --------------- test/clang-tidy/redundant-smartptr-get.cpp | 131 +++++++++++++++ test/clang-tidy/use-override-fix.cpp | 224 ------------------------- test/clang-tidy/use-override.cpp | 224 +++++++++++++++++++++++++ 4 files changed, 355 insertions(+), 355 deletions(-) delete mode 100644 test/clang-tidy/redundant-smartptr-get-fix.cpp create mode 100644 test/clang-tidy/redundant-smartptr-get.cpp delete mode 100644 test/clang-tidy/use-override-fix.cpp create mode 100644 test/clang-tidy/use-override.cpp diff --git a/test/clang-tidy/redundant-smartptr-get-fix.cpp b/test/clang-tidy/redundant-smartptr-get-fix.cpp deleted file mode 100644 index 63b08f6f..00000000 --- a/test/clang-tidy/redundant-smartptr-get-fix.cpp +++ /dev/null @@ -1,131 +0,0 @@ -// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-redundant-smartptr-get %t -// REQUIRES: shell - -// CHECK-MESSAGES-NOT: warning - -namespace std { - -template -class unique_ptr { - T& operator*() const; - T* operator->() const; - T* get() const; -}; - -template -class shared_ptr { - T& operator*() const; - T* operator->() const; - T* get() const; -}; - -} // namespace std - -struct Bar { - void Do(); - void ConstDo() const; -}; -struct BarPtr { - Bar* operator->(); - Bar& operator*(); - Bar* get(); -}; -struct int_ptr { - int* get(); - int* operator->(); - int& operator*(); -}; - -struct Fail1 { - Bar* get(); -}; -struct Fail2 { - Bar* get(); - int* operator->(); - int& operator*(); -}; - -void Positive() { - BarPtr u; - // CHECK-FIXES: BarPtr u; - BarPtr().get()->Do(); - // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: Redundant get() call on smart pointer. [misc-redundant-smartptr-get] - // CHECK-MESSAGES: BarPtr().get()->Do(); - // CHECK-FIXES: BarPtr()->Do(); - - u.get()->ConstDo(); - // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: Redundant get() call on smart pointer. - // CHECK-MESSAGES: u.get()->ConstDo(); - // CHECK-FIXES: u->ConstDo(); - - Bar& b = *BarPtr().get(); - // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: Redundant get() call on smart pointer. - // CHECK-MESSAGES: Bar& b = *BarPtr().get(); - // CHECK-FIXES: Bar& b = *BarPtr(); - - Bar& b2 = *std::unique_ptr().get(); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: Redundant get() call on smart pointer. - // CHECK-MESSAGES: Bar& b2 = *std::unique_ptr().get(); - // CHECK-FIXES: Bar& b2 = *std::unique_ptr(); - - (*BarPtr().get()).ConstDo(); - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. - // CHECK-MESSAGES: (*BarPtr().get()).ConstDo(); - // CHECK-FIXES: (*BarPtr()).ConstDo(); - - (*std::unique_ptr().get()).ConstDo(); - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. - // CHECK-MESSAGES: (*std::unique_ptr().get()).ConstDo(); - // CHECK-FIXES: (*std::unique_ptr()).ConstDo(); - - std::unique_ptr* up; - (*up->get()).Do(); - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. - // CHECK-MESSAGES: (*up->get()).Do(); - // CHECK-FIXES: (**up).Do(); - - int_ptr ip; - int i = *ip.get(); - // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: Redundant get() call on smart pointer. - // CHECK-MESSAGES: int i = *ip.get(); - // CHECK-FIXES: int i = *ip; - - std::unique_ptr uu; - std::shared_ptr *ss; - bool bb = uu.get() == nullptr; - // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: Redundant get() call on smart pointer. - // CHECK-MESSAGES: uu.get() == nullptr; - // CHECK-FIXES: bool bb = uu == nullptr; - - bb = nullptr != ss->get(); - // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: Redundant get() call on smart pointer. - // CHECK-MESSAGES: nullptr != ss->get(); - // CHECK-FIXES: bb = nullptr != *ss; -} - -// CHECK-MESSAGES-NOT: warning: - -void Negative() { - struct NegPtr { - int* get(); - int* operator->() { - return &*this->get(); - } - int& operator*() { - return *get(); - } - }; - - std::unique_ptr* u; - u->get()->Do(); - - Fail1().get()->Do(); - Fail2().get()->Do(); - const Bar& b = *Fail1().get(); - (*Fail2().get()).Do(); - - int_ptr ip; - bool bb = std::unique_ptr().get() == NULL; - bb = ip.get() == nullptr; - bb = u->get() == NULL; -} diff --git a/test/clang-tidy/redundant-smartptr-get.cpp b/test/clang-tidy/redundant-smartptr-get.cpp new file mode 100644 index 00000000..63b08f6f --- /dev/null +++ b/test/clang-tidy/redundant-smartptr-get.cpp @@ -0,0 +1,131 @@ +// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-redundant-smartptr-get %t +// REQUIRES: shell + +// CHECK-MESSAGES-NOT: warning + +namespace std { + +template +class unique_ptr { + T& operator*() const; + T* operator->() const; + T* get() const; +}; + +template +class shared_ptr { + T& operator*() const; + T* operator->() const; + T* get() const; +}; + +} // namespace std + +struct Bar { + void Do(); + void ConstDo() const; +}; +struct BarPtr { + Bar* operator->(); + Bar& operator*(); + Bar* get(); +}; +struct int_ptr { + int* get(); + int* operator->(); + int& operator*(); +}; + +struct Fail1 { + Bar* get(); +}; +struct Fail2 { + Bar* get(); + int* operator->(); + int& operator*(); +}; + +void Positive() { + BarPtr u; + // CHECK-FIXES: BarPtr u; + BarPtr().get()->Do(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: Redundant get() call on smart pointer. [misc-redundant-smartptr-get] + // CHECK-MESSAGES: BarPtr().get()->Do(); + // CHECK-FIXES: BarPtr()->Do(); + + u.get()->ConstDo(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: u.get()->ConstDo(); + // CHECK-FIXES: u->ConstDo(); + + Bar& b = *BarPtr().get(); + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: Bar& b = *BarPtr().get(); + // CHECK-FIXES: Bar& b = *BarPtr(); + + Bar& b2 = *std::unique_ptr().get(); + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: Bar& b2 = *std::unique_ptr().get(); + // CHECK-FIXES: Bar& b2 = *std::unique_ptr(); + + (*BarPtr().get()).ConstDo(); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: (*BarPtr().get()).ConstDo(); + // CHECK-FIXES: (*BarPtr()).ConstDo(); + + (*std::unique_ptr().get()).ConstDo(); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: (*std::unique_ptr().get()).ConstDo(); + // CHECK-FIXES: (*std::unique_ptr()).ConstDo(); + + std::unique_ptr* up; + (*up->get()).Do(); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: (*up->get()).Do(); + // CHECK-FIXES: (**up).Do(); + + int_ptr ip; + int i = *ip.get(); + // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: int i = *ip.get(); + // CHECK-FIXES: int i = *ip; + + std::unique_ptr uu; + std::shared_ptr *ss; + bool bb = uu.get() == nullptr; + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: uu.get() == nullptr; + // CHECK-FIXES: bool bb = uu == nullptr; + + bb = nullptr != ss->get(); + // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: nullptr != ss->get(); + // CHECK-FIXES: bb = nullptr != *ss; +} + +// CHECK-MESSAGES-NOT: warning: + +void Negative() { + struct NegPtr { + int* get(); + int* operator->() { + return &*this->get(); + } + int& operator*() { + return *get(); + } + }; + + std::unique_ptr* u; + u->get()->Do(); + + Fail1().get()->Do(); + Fail2().get()->Do(); + const Bar& b = *Fail1().get(); + (*Fail2().get()).Do(); + + int_ptr ip; + bool bb = std::unique_ptr().get() == NULL; + bb = ip.get() == nullptr; + bb = u->get() == NULL; +} diff --git a/test/clang-tidy/use-override-fix.cpp b/test/clang-tidy/use-override-fix.cpp deleted file mode 100644 index 83368191..00000000 --- a/test/clang-tidy/use-override-fix.cpp +++ /dev/null @@ -1,224 +0,0 @@ -// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-use-override %t -// REQUIRES: shell - -// CHECK-MESSAGES-NOT: warning: - -#define ABSTRACT = 0 - -#define OVERRIDE override -#define VIRTUAL virtual -#define NOT_VIRTUAL -#define NOT_OVERRIDE - -#define MUST_USE_RESULT __attribute__((warn_unused_result)) - -struct MUST_USE_RESULT MustUseResultObject {}; - -struct Base { - virtual ~Base() {} - virtual void a(); - virtual void b(); - virtual void c(); - virtual void d(); - virtual void e() = 0; - virtual void f() = 0; - virtual void g() = 0; - - virtual void j() const; - virtual MustUseResultObject k(); - virtual bool l() MUST_USE_RESULT; - - virtual void m(); -}; - -struct SimpleCases : public Base { -public: - virtual ~SimpleCases(); - // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using 'override' or 'final' instead of 'virtual' - // CHECK-FIXES: {{^ ~SimpleCases\(\) override;}} - - void a(); - // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: Use exactly - // CHECK-FIXES: {{^ void a\(\) override;}} - - void b() override; - // CHECK-MESSAGES-NOT: warning: - // CHECK-FIXES: {{^ void b\(\) override;}} - - virtual void c(); - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ void c\(\) override;}} - - virtual void d() override; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly - // CHECK-FIXES: {{^ void d\(\) override;}} - - virtual void e() = 0; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ void e\(\) override = 0;}} - - virtual void f()=0; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ void f\(\)override =0;}} - - virtual void g() ABSTRACT; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ void g\(\) override ABSTRACT;}} - - virtual void j() const; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ void j\(\) const override;}} - - virtual MustUseResultObject k(); // Has an implicit attribute. - // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: Prefer using - // CHECK-FIXES: {{^ MustUseResultObject k\(\) override;}} - - virtual bool l() MUST_USE_RESULT; // Has an explicit attribute - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ bool l\(\) override MUST_USE_RESULT;}} - - virtual void m() override final; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly - // CHECK-FIXES: {{^ void m\(\) final;}} -}; - -// CHECK-MESSAGES-NOT: warning: - -void SimpleCases::i() {} -// CHECK-FIXES: {{^void SimpleCases::i\(\) {}}} - -SimpleCases::~SimpleCases() {} -// CHECK-FIXES: {{^SimpleCases::~SimpleCases\(\) {}}} - -struct DefaultedDestructor : public Base { - DefaultedDestructor() {} - virtual ~DefaultedDestructor() = default; - // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using - // CHECK-FIXES: {{^ ~DefaultedDestructor\(\) override = default;}} -}; - -struct FinalSpecified : public Base { -public: - virtual ~FinalSpecified() final; - // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Use exactly - // CHECK-FIXES: {{^ ~FinalSpecified\(\) final;}} - - void b() final; - // CHECK-MESSAGES-NOT: warning: - // CHECK-FIXES: {{^ void b\(\) final;}} - - virtual void d() final; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly - // CHECK-FIXES: {{^ void d\(\) final;}} - - virtual void e() final = 0; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly - // CHECK-FIXES: {{^ void e\(\) final = 0;}} - - virtual void j() const final; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly - // CHECK-FIXES: {{^ void j\(\) const final;}} - - virtual bool l() final MUST_USE_RESULT; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly - // CHECK-FIXES: {{^ bool l\(\) final MUST_USE_RESULT;}} -}; - -struct InlineDefinitions : public Base { -public: - virtual ~InlineDefinitions() {} - // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using - // CHECK-FIXES: {{^ ~InlineDefinitions\(\) override {}}} - - void a() {} - // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: Use exactly - // CHECK-FIXES: {{^ void a\(\) override {}}} - - void b() override {} - // CHECK-MESSAGES-NOT: warning: - // CHECK-FIXES: {{^ void b\(\) override {}}} - - virtual void c() {} - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ void c\(\) override {}}} - - virtual void d() override {} - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly - // CHECK-FIXES: {{^ void d\(\) override {}}} - - virtual void j() const {} - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ void j\(\) const override {}}} - - virtual MustUseResultObject k() {} // Has an implicit attribute. - // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: Prefer using - // CHECK-FIXES: {{^ MustUseResultObject k\(\) override {}}} - - virtual bool l() MUST_USE_RESULT {} // Has an explicit attribute - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ bool l\(\) override MUST_USE_RESULT {}}} -}; - -struct Macros : public Base { - // Tests for 'virtual' and 'override' being defined through macros. Basically - // give up for now. - NOT_VIRTUAL void a() NOT_OVERRIDE; - // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: Use exactly - // CHECK-FIXES: {{^ NOT_VIRTUAL void a\(\) override NOT_OVERRIDE;}} - - VIRTUAL void b() NOT_OVERRIDE; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using - // CHECK-FIXES: {{^ VIRTUAL void b\(\) override NOT_OVERRIDE;}} - - NOT_VIRTUAL void c() OVERRIDE; - // CHECK-MESSAGES-NOT: warning: - // CHECK-FIXES: {{^ NOT_VIRTUAL void c\(\) OVERRIDE;}} - - VIRTUAL void d() OVERRIDE; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly - // CHECK-FIXES: {{^ VIRTUAL void d\(\) OVERRIDE;}} - -#define FUNC(name, return_type) return_type name() - FUNC(void, e); - // CHECK-FIXES: {{^ FUNC\(void, e\);}} - -#define F virtual void f(); - F - // CHECK-FIXES: {{^ F}} - - VIRTUAL void g() OVERRIDE final; - // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly - // CHECK-FIXES: {{^ VIRTUAL void g\(\) final;}} -}; - -// Tests for templates. -template struct TemplateBase { - virtual void f(T t); -}; - -template struct DerivedFromTemplate : public TemplateBase { - virtual void f(T t); - // CHECK-FIXES: {{^ void f\(T t\) override;}} -}; -void f() { DerivedFromTemplate().f(2); } - -template -struct UnusedMemberInstantiation : public C { - virtual ~UnusedMemberInstantiation() {} - // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using - // CHECK-FIXES: {{^ ~UnusedMemberInstantiation\(\) override {}}} -}; -struct IntantiateWithoutUse : public UnusedMemberInstantiation {}; - -// The OverrideAttr isn't propagated to specializations in all cases. Make sure -// we don't add "override" a second time. -template -struct MembersOfSpecializations : public Base { - void a() override; - // CHECK-MESSAGES-NOT: warning: - // CHECK-FIXES: {{^ void a\(\) override;}} -}; -template <> void MembersOfSpecializations<3>::a() {} -void f() { MembersOfSpecializations<3>().a(); }; - -// CHECK-MESSAGES-NOT: warning: diff --git a/test/clang-tidy/use-override.cpp b/test/clang-tidy/use-override.cpp new file mode 100644 index 00000000..83368191 --- /dev/null +++ b/test/clang-tidy/use-override.cpp @@ -0,0 +1,224 @@ +// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-use-override %t +// REQUIRES: shell + +// CHECK-MESSAGES-NOT: warning: + +#define ABSTRACT = 0 + +#define OVERRIDE override +#define VIRTUAL virtual +#define NOT_VIRTUAL +#define NOT_OVERRIDE + +#define MUST_USE_RESULT __attribute__((warn_unused_result)) + +struct MUST_USE_RESULT MustUseResultObject {}; + +struct Base { + virtual ~Base() {} + virtual void a(); + virtual void b(); + virtual void c(); + virtual void d(); + virtual void e() = 0; + virtual void f() = 0; + virtual void g() = 0; + + virtual void j() const; + virtual MustUseResultObject k(); + virtual bool l() MUST_USE_RESULT; + + virtual void m(); +}; + +struct SimpleCases : public Base { +public: + virtual ~SimpleCases(); + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using 'override' or 'final' instead of 'virtual' + // CHECK-FIXES: {{^ ~SimpleCases\(\) override;}} + + void a(); + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: Use exactly + // CHECK-FIXES: {{^ void a\(\) override;}} + + void b() override; + // CHECK-MESSAGES-NOT: warning: + // CHECK-FIXES: {{^ void b\(\) override;}} + + virtual void c(); + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ void c\(\) override;}} + + virtual void d() override; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly + // CHECK-FIXES: {{^ void d\(\) override;}} + + virtual void e() = 0; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ void e\(\) override = 0;}} + + virtual void f()=0; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ void f\(\)override =0;}} + + virtual void g() ABSTRACT; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ void g\(\) override ABSTRACT;}} + + virtual void j() const; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ void j\(\) const override;}} + + virtual MustUseResultObject k(); // Has an implicit attribute. + // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: Prefer using + // CHECK-FIXES: {{^ MustUseResultObject k\(\) override;}} + + virtual bool l() MUST_USE_RESULT; // Has an explicit attribute + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ bool l\(\) override MUST_USE_RESULT;}} + + virtual void m() override final; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly + // CHECK-FIXES: {{^ void m\(\) final;}} +}; + +// CHECK-MESSAGES-NOT: warning: + +void SimpleCases::i() {} +// CHECK-FIXES: {{^void SimpleCases::i\(\) {}}} + +SimpleCases::~SimpleCases() {} +// CHECK-FIXES: {{^SimpleCases::~SimpleCases\(\) {}}} + +struct DefaultedDestructor : public Base { + DefaultedDestructor() {} + virtual ~DefaultedDestructor() = default; + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using + // CHECK-FIXES: {{^ ~DefaultedDestructor\(\) override = default;}} +}; + +struct FinalSpecified : public Base { +public: + virtual ~FinalSpecified() final; + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Use exactly + // CHECK-FIXES: {{^ ~FinalSpecified\(\) final;}} + + void b() final; + // CHECK-MESSAGES-NOT: warning: + // CHECK-FIXES: {{^ void b\(\) final;}} + + virtual void d() final; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly + // CHECK-FIXES: {{^ void d\(\) final;}} + + virtual void e() final = 0; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly + // CHECK-FIXES: {{^ void e\(\) final = 0;}} + + virtual void j() const final; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly + // CHECK-FIXES: {{^ void j\(\) const final;}} + + virtual bool l() final MUST_USE_RESULT; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly + // CHECK-FIXES: {{^ bool l\(\) final MUST_USE_RESULT;}} +}; + +struct InlineDefinitions : public Base { +public: + virtual ~InlineDefinitions() {} + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using + // CHECK-FIXES: {{^ ~InlineDefinitions\(\) override {}}} + + void a() {} + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: Use exactly + // CHECK-FIXES: {{^ void a\(\) override {}}} + + void b() override {} + // CHECK-MESSAGES-NOT: warning: + // CHECK-FIXES: {{^ void b\(\) override {}}} + + virtual void c() {} + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ void c\(\) override {}}} + + virtual void d() override {} + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly + // CHECK-FIXES: {{^ void d\(\) override {}}} + + virtual void j() const {} + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ void j\(\) const override {}}} + + virtual MustUseResultObject k() {} // Has an implicit attribute. + // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: Prefer using + // CHECK-FIXES: {{^ MustUseResultObject k\(\) override {}}} + + virtual bool l() MUST_USE_RESULT {} // Has an explicit attribute + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ bool l\(\) override MUST_USE_RESULT {}}} +}; + +struct Macros : public Base { + // Tests for 'virtual' and 'override' being defined through macros. Basically + // give up for now. + NOT_VIRTUAL void a() NOT_OVERRIDE; + // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: Use exactly + // CHECK-FIXES: {{^ NOT_VIRTUAL void a\(\) override NOT_OVERRIDE;}} + + VIRTUAL void b() NOT_OVERRIDE; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using + // CHECK-FIXES: {{^ VIRTUAL void b\(\) override NOT_OVERRIDE;}} + + NOT_VIRTUAL void c() OVERRIDE; + // CHECK-MESSAGES-NOT: warning: + // CHECK-FIXES: {{^ NOT_VIRTUAL void c\(\) OVERRIDE;}} + + VIRTUAL void d() OVERRIDE; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly + // CHECK-FIXES: {{^ VIRTUAL void d\(\) OVERRIDE;}} + +#define FUNC(name, return_type) return_type name() + FUNC(void, e); + // CHECK-FIXES: {{^ FUNC\(void, e\);}} + +#define F virtual void f(); + F + // CHECK-FIXES: {{^ F}} + + VIRTUAL void g() OVERRIDE final; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly + // CHECK-FIXES: {{^ VIRTUAL void g\(\) final;}} +}; + +// Tests for templates. +template struct TemplateBase { + virtual void f(T t); +}; + +template struct DerivedFromTemplate : public TemplateBase { + virtual void f(T t); + // CHECK-FIXES: {{^ void f\(T t\) override;}} +}; +void f() { DerivedFromTemplate().f(2); } + +template +struct UnusedMemberInstantiation : public C { + virtual ~UnusedMemberInstantiation() {} + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using + // CHECK-FIXES: {{^ ~UnusedMemberInstantiation\(\) override {}}} +}; +struct IntantiateWithoutUse : public UnusedMemberInstantiation {}; + +// The OverrideAttr isn't propagated to specializations in all cases. Make sure +// we don't add "override" a second time. +template +struct MembersOfSpecializations : public Base { + void a() override; + // CHECK-MESSAGES-NOT: warning: + // CHECK-FIXES: {{^ void a\(\) override;}} +}; +template <> void MembersOfSpecializations<3>::a() {} +void f() { MembersOfSpecializations<3>().a(); }; + +// CHECK-MESSAGES-NOT: warning: -- cgit v1.2.3