/* PR c++/98646 - spurious -Wnonnull calling a member on the result of static_cast { dg-do compile } { dg-options "-O2 -Wall" } */ struct A { virtual ~A (); }; struct B { virtual ~B (); B* bptr (); B& bref (); }; struct C: A, B { virtual ~C (); void g () const; }; void c_cast_C_ptr (B *p) { ((C*)p->bptr ())->g (); } void c_cast_const_C_ptr (B *p) { ((const C*)p->bptr ())->g (); } void static_cast_C_ptr (B *p) { static_cast(p->bptr ())->g (); } void static_cast_const_C_ptr (B *p) { /* The static_cast can't fail so verify that no warning is issued here, even though GCC emits a null check for its argument. */ static_cast(p->bptr ())->g (); // { dg-bogus "\\\[-Wnonnull" } } void dynamic_cast_C_ptr (B *p) { /* Unlike static_cast, dynamic cast may return null even for a nonnull operand but detecting assumptions to the contrary isn't -Wnonnull's purpose. Verify -Wnonnull isn't issued, either for the implicitly emitted null check or for other reasons (the latter may be worth warning for by some other warning). See also pr99251. */ dynamic_cast(p->bptr ())->g (); // { dg-bogus "\\\[-Wnonnull" } } void dynamic_cast_const_C_ptr (B *p) { dynamic_cast(p->bptr ())->g (); // { dg-bogus "\\\[-Wnonnull" } } void c_cast_C_ref (B *p) { ((C&)p->bref ()).g (); } void c_cast_const_C_ref (B *p) { ((const C&)p->bref ()).g (); } void static_cast_C_ref (B *p) { static_cast(p->bref ()).g (); } void static_cast_const_C_ref (B *p) { static_cast(p->bref ()).g (); } void dynamic_cast_C_ref (B *p) { /* The dynamic_cast fails by throwing an exception so verify that no warning is issued. */ dynamic_cast(p->bref ()).g (); } void dynamic_cast_const_C_ref (B *p) { dynamic_cast(p->bref ()).g (); } struct D: B, A { virtual ~D (); void g () const; }; void c_cast_D_ptr (B *p) { ((D*)p->bptr ())->g (); } void c_cast_const_D_ptr (B *p) { ((const D*)p->bptr ())->g (); } void static_cast_D_ptr (B *p) { static_cast(p->bptr ())->g (); } void static_cast_const_D_ptr (B *p) { /* The static_cast can't fail so verify that no warning is issued here, even though GCC emits a null check for its argument. */ static_cast(p->bptr ())->g (); // { dg-bogus "\\\[-Wnonnull" } } void dynamic_cast_D_ptr (B *p) { /* Unlike static_cast, dynamic cast may return null even for a nonnull operand but detecting assumptions to the contrary isn't -Wnonnull's purpose. Verify -Wnonnull isn't issued, either for the implicitly emitted null check or for other reasons (the latter may be worth warning for by some other warning). See also pr99251. */ dynamic_cast(p->bptr ())->g (); // { dg-bogus "\\\[-Wnonnull" } } void dynamic_cast_const_D_ptr (B *p) { dynamic_cast(p->bptr ())->g (); // { dg-bogus "\\\[-Wnonnull" } }