| // { dg-do compile } |
| // { dg-options "-Weffc++ -Wno-non-virtual-dtor" } |
| |
| // Warn when a class has virtual functions and accessible non-virtual |
| // destructor, in which case it would be possible but unsafe to delete |
| // an instance of a derived class through a pointer to the base class. |
| |
| struct A |
| { |
| protected: |
| ~A(); |
| public: |
| virtual void f() = 0; |
| }; |
| |
| struct B |
| { |
| private: |
| ~B(); |
| public: |
| virtual void f() = 0; |
| }; |
| |
| struct C |
| { |
| virtual void f() = 0; |
| }; |
| |
| struct D |
| { |
| ~D(); |
| virtual void f() = 0; |
| }; |
| |
| struct E; |
| |
| struct F |
| { |
| protected: |
| friend class E; |
| ~F(); |
| public: |
| virtual void f() = 0; |
| }; |
| |
| struct G |
| { |
| private: |
| friend class E; |
| ~G(); |
| public: |
| virtual void f() = 0; |
| }; |
| |
| struct H {}; |
| |
| struct I1 : H |
| {}; |
| struct I2 : private H |
| {}; |
| |
| struct J1 : H |
| { virtual ~J1 ();}; |
| struct J2 : private H |
| { virtual ~J2 ();}; |
| |
| struct K |
| { |
| virtual void k (); |
| }; |
| |
| struct L1 : K |
| {virtual ~L1 ();}; |
| struct L2 : private K |
| {virtual ~L2 ();}; |