35 lines · cpp
1// RUN: %clang_cc1 -load %llvmshlibdir/CallSuperAttr%pluginext -fsyntax-only -verify=callsuper %s2// RUN: %clang_cc1 -load %llvmshlibdir/CallSuperAttr%pluginext -DBAD_CALLSUPER -fsyntax-only -verify=badcallsuper %s3// REQUIRES: plugins, examples4 5// callsuper-no-diagnostics6struct Base1 {7 [[clang::call_super]] virtual void Test() {}8};9struct Base2 {10 [[clang::call_super]] virtual void Test() {}11};12struct Derive : public Base1, public Base2 {13#ifndef BAD_CALLSUPER14 void Test() override;15#else16 [[clang::call_super]] virtual void Test() override final;17 // badcallsuper-warning@16 {{'call_super' attribute marked on a final method}}18#endif19};20void Derive::Test() {21 Base1::Test();22#ifndef BAD_CALLSUPER23 Base2::Test();24#else25 // 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#endif28}29struct Derive2 : public Base1, public Base2 {30 void Test() override {31 Base1::Test();32 Base2::Test();33 }34};35