xref: /llvm-project/clang/test/Frontend/plugin-call-super.cpp (revision 3e67cf21a19a0e8917bdbab6f0cecd4880f3fbe2)
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 Liu void 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