• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang -fplugin=%llvmshlibdir/CallSuperAttr%pluginext -fsyntax-only -Xclang -verify=callsuper %s
2 // RUN: %clang -fplugin=%llvmshlibdir/CallSuperAttr%pluginext -DBAD_CALLSUPER -fsyntax-only -Xclang -verify=badcallsuper %s
3 // REQUIRES: plugins, examples
4 
5 // callsuper-no-diagnostics
6 struct Base1 {
TestBase17   [[clang::call_super]] virtual void Test() {}
8 };
9 struct Base2 {
TestBase210   [[clang::call_super]] virtual void Test() {}
11 };
12 struct Derive : public Base1, public Base2 {
13 #ifndef BAD_CALLSUPER
14   void Test() override;
15 #else
16   [[clang::call_super]] virtual void Test() override final;
17   // badcallsuper-warning@16 {{'call_super' attribute marked on a final method}}
18 #endif
19 };
Test()20 void Derive::Test() {
21   Base1::Test();
22 #ifndef BAD_CALLSUPER
23   Base2::Test();
24 #else
25   // badcallsuper-warning@20 {{virtual function 'Base2::Test' is marked as 'call_super' but this overriding method does not call the base version}}
26   // badcallsuper-note@10 {{function marked 'call_super' here}}
27 #endif
28 }
29 struct Derive2 : public Base1, public Base2 {
TestDerive230   void Test() override {
31     Base1::Test();
32     Base2::Test();
33   }
34 };
35