| #define MOZ_MUST_OVERRIDE __attribute__((annotate("moz_must_override"))) |
| // Ignore warnings not related to static analysis here |
| #pragma GCC diagnostic ignored "-Woverloaded-virtual" |
| |
| struct S { |
| virtual void f() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| virtual void g() MOZ_MUST_OVERRIDE; |
| virtual void h() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| }; |
| struct C : S { // expected-error {{'C' must override 'f'}} expected-error {{'C' must override 'h'}} |
| virtual void g() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| virtual void h(int); |
| void q() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| }; |
| struct D : C { // expected-error {{'D' must override 'g'}} expected-error {{'D' must override 'q'}} |
| virtual void f(); |
| }; |
| |
| struct Base { |
| virtual void VirtMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| void NonVirtMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| static void StaticMethod() MOZ_MUST_OVERRIDE; |
| }; |
| |
| struct DoesNotPropagate : Base { |
| virtual void VirtMethod(); |
| void NonVirtMethod(); |
| static void StaticMethod(); |
| }; |
| |
| struct Final : DoesNotPropagate { }; |
| |
| struct Propagates : Base { |
| virtual void VirtMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| void NonVirtMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| static void StaticMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| }; |
| |
| struct FailsFinal : Propagates { }; // expected-error {{'FailsFinal' must override 'VirtMethod'}} expected-error {{'FailsFinal' must override 'NonVirtMethod'}} expected-error {{'FailsFinal' must override 'StaticMethod'}} |
| |
| struct WrongOverload : Base { // expected-error {{'WrongOverload' must override 'VirtMethod'}} expected-error {{'WrongOverload' must override 'NonVirtMethod'}} |
| virtual void VirtMethod() const; |
| void NonVirtMethod(int param); |
| static void StaticMethod(); |
| }; |
| |
| namespace A { namespace B { namespace C { |
| struct Param {}; |
| struct Base { |
| void f(Param p) MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} |
| }; |
| }}} |
| |
| struct Param {}; |
| |
| struct Derived : A::B::C::Base { |
| typedef A::B::C::Param Typedef; |
| void f(Typedef t); |
| }; |
| |
| struct BadDerived : A::B::C::Base { // expected-error {{'BadDerived' must override 'f'}} |
| void f(Param p); |
| }; |