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()20void 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