blob: 46c4500cc69c25b5b9acb7aac415457fedc37213 [file] [log] [blame]
// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-use-override %t
// REQUIRES: shell
#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::c() {}
// CHECK-FIXES: {{^void SimpleCases::c\(\) {}}}
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(return_type, name) 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 <typename T> struct TemplateBase {
virtual void f(T t);
};
template <typename T> struct DerivedFromTemplate : public TemplateBase<T> {
virtual void f(T t);
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using
// CHECK-FIXES: {{^ void f\(T t\) override;}}
};
void f() { DerivedFromTemplate<int>().f(2); }
template <class C>
struct UnusedMemberInstantiation : public C {
virtual ~UnusedMemberInstantiation() {}
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using
// CHECK-FIXES: {{^ ~UnusedMemberInstantiation\(\) override {}}}
};
struct IntantiateWithoutUse : public UnusedMemberInstantiation<Base> {};
struct Base2 {
virtual ~Base2() {}
virtual void a();
};
// The OverrideAttr isn't propagated to specializations in all cases. Make sure
// we don't add "override" a second time.
template <int I>
struct MembersOfSpecializations : public Base2 {
void a() override;
// CHECK-MESSAGES-NOT: warning:
// CHECK-FIXES: {{^ void a\(\) override;}}
};
template <> void MembersOfSpecializations<3>::a() {}
void ff() { MembersOfSpecializations<3>().a(); };