189a1d03eSRichard // RUN: %check_clang_tidy %s modernize-use-override %t -- \
2*e8a3ddafSNathan James // RUN:   -config="{CheckOptions: {modernize-use-override.AllowOverrideAndFinal: true}}"
389a1d03eSRichard 
489a1d03eSRichard struct Base {
589a1d03eSRichard   virtual ~Base();
689a1d03eSRichard   virtual void a();
789a1d03eSRichard   virtual void b();
889a1d03eSRichard   virtual void c();
989a1d03eSRichard   virtual void d();
1089a1d03eSRichard   virtual void e();
1189a1d03eSRichard   virtual void f();
1289a1d03eSRichard   virtual void g();
1389a1d03eSRichard   virtual void h();
1489a1d03eSRichard   virtual void i();
1589a1d03eSRichard };
1689a1d03eSRichard 
1789a1d03eSRichard struct Simple : public Base {
1889a1d03eSRichard   virtual ~Simple();
1989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: prefer using 'override' or (rarely) 'final' instead of 'virtual' [modernize-use-override]
2089a1d03eSRichard   // CHECK-FIXES: {{^}}  ~Simple() override;
2189a1d03eSRichard   virtual void a() override;
2289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: 'virtual' is redundant since the function is already declared 'override' [modernize-use-override]
2389a1d03eSRichard   // CHECK-FIXES: {{^}}  void a() override;
2489a1d03eSRichard   virtual void b() final;
2589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: 'virtual' is redundant since the function is already declared 'final' [modernize-use-override]
2689a1d03eSRichard   // CHECK-FIXES: {{^}}  void b() final;
2789a1d03eSRichard   virtual void c() final override;
2889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: 'virtual' is redundant since the function is already declared 'final' [modernize-use-override]
2989a1d03eSRichard   // CHECK-FIXES: {{^}}  void c() final override;
3089a1d03eSRichard   virtual void d() override final;
3189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: 'virtual' is redundant since the function is already declared 'final' [modernize-use-override]
3289a1d03eSRichard   // CHECK-FIXES: {{^}}  void d() override final;
3389a1d03eSRichard   void e() final override;
3489a1d03eSRichard   void f() override final;
3589a1d03eSRichard   void g() final;
3689a1d03eSRichard   void h() override;
3789a1d03eSRichard   void i();
3889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: annotate this function with 'override' or (rarely) 'final' [modernize-use-override]
3989a1d03eSRichard   // CHECK-FIXES: {{^}}  void i() override;
4089a1d03eSRichard };
41