TestMustOverride.cpp (2441B)
1 #define MOZ_MUST_OVERRIDE __attribute__((annotate("moz_must_override"))) 2 // Ignore warnings not related to static analysis here 3 #pragma GCC diagnostic ignored "-Woverloaded-virtual" 4 5 struct S { 6 virtual void f() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 7 virtual void g() MOZ_MUST_OVERRIDE; 8 virtual void h() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 9 }; 10 struct C : S { // expected-error {{'C' must override 'f'}} expected-error {{'C' must override 'h'}} 11 virtual void g() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 12 virtual void h(int); 13 void q() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 14 }; 15 struct D : C { // expected-error {{'D' must override 'g'}} expected-error {{'D' must override 'q'}} 16 virtual void f(); 17 }; 18 19 struct Base { 20 virtual void VirtMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 21 void NonVirtMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 22 static void StaticMethod() MOZ_MUST_OVERRIDE; 23 }; 24 25 struct DoesNotPropagate : Base { 26 virtual void VirtMethod(); 27 void NonVirtMethod(); 28 static void StaticMethod(); 29 }; 30 31 struct Final : DoesNotPropagate { }; 32 33 struct Propagates : Base { 34 virtual void VirtMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 35 void NonVirtMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 36 static void StaticMethod() MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 37 }; 38 39 struct FailsFinal : Propagates { }; // expected-error {{'FailsFinal' must override 'VirtMethod'}} expected-error {{'FailsFinal' must override 'NonVirtMethod'}} expected-error {{'FailsFinal' must override 'StaticMethod'}} 40 41 struct WrongOverload : Base { // expected-error {{'WrongOverload' must override 'VirtMethod'}} expected-error {{'WrongOverload' must override 'NonVirtMethod'}} 42 virtual void VirtMethod() const; 43 void NonVirtMethod(int param); 44 static void StaticMethod(); 45 }; 46 47 namespace A { namespace B { namespace C { 48 struct Param {}; 49 struct Base { 50 void f(Param p) MOZ_MUST_OVERRIDE; // expected-note {{function to override is here}} 51 }; 52 }}} 53 54 struct Param {}; 55 56 struct Derived : A::B::C::Base { 57 typedef A::B::C::Param Typedef; 58 void f(Typedef t); 59 }; 60 61 struct BadDerived : A::B::C::Base { // expected-error {{'BadDerived' must override 'f'}} 62 void f(Param p); 63 };