1*3e67cf21STimm Bäder // RUN: %clang_cc1 -load %llvmshlibdir/CallSuperAttr%pluginext -fsyntax-only -verify=callsuper %s 2*3e67cf21STimm Bäder // RUN: %clang_cc1 -load %llvmshlibdir/CallSuperAttr%pluginext -DBAD_CALLSUPER -fsyntax-only -verify=badcallsuper %s 32ce6352eSYafei Liu // REQUIRES: plugins, examples 42ce6352eSYafei Liu 52ce6352eSYafei Liu // callsuper-no-diagnostics 62ce6352eSYafei Liu struct Base1 { TestBase172ce6352eSYafei Liu [[clang::call_super]] virtual void Test() {} 82ce6352eSYafei Liu }; 92ce6352eSYafei Liu struct Base2 { TestBase2102ce6352eSYafei Liu [[clang::call_super]] virtual void Test() {} 112ce6352eSYafei Liu }; 122ce6352eSYafei Liu struct Derive : public Base1, public Base2 { 132ce6352eSYafei Liu #ifndef BAD_CALLSUPER 142ce6352eSYafei Liu void Test() override; 152ce6352eSYafei Liu #else 162ce6352eSYafei Liu [[clang::call_super]] virtual void Test() override final; 172ce6352eSYafei Liu // badcallsuper-warning@16 {{'call_super' attribute marked on a final method}} 182ce6352eSYafei Liu #endif 192ce6352eSYafei Liu }; Test()202ce6352eSYafei Liuvoid Derive::Test() { 212ce6352eSYafei Liu Base1::Test(); 222ce6352eSYafei Liu #ifndef BAD_CALLSUPER 232ce6352eSYafei Liu Base2::Test(); 242ce6352eSYafei Liu #else 252ce6352eSYafei Liu // badcallsuper-warning@20 {{virtual function 'Base2::Test' is marked as 'call_super' but this overriding method does not call the base version}} 262ce6352eSYafei Liu // badcallsuper-note@10 {{function marked 'call_super' here}} 272ce6352eSYafei Liu #endif 282ce6352eSYafei Liu } 292ce6352eSYafei Liu struct Derive2 : public Base1, public Base2 { TestDerive2302ce6352eSYafei Liu void Test() override { 312ce6352eSYafei Liu Base1::Test(); 322ce6352eSYafei Liu Base2::Test(); 332ce6352eSYafei Liu } 342ce6352eSYafei Liu }; 35