diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/warn')
-rw-r--r-- | gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C | 30 | ||||
-rw-r--r-- | gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C | 75 | ||||
-rw-r--r-- | gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C | 75 | ||||
-rw-r--r-- | gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C | 1 | ||||
-rw-r--r-- | gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C | 11 |
5 files changed, 188 insertions, 4 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C index d40de3d7c..9f2e4bea4 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C @@ -6,18 +6,18 @@ // 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 // { dg-bogus "non-virtual destructor" } +struct A { protected: - ~A(); + ~A(); // inaccessible - no warning public: virtual void f() = 0; }; -struct B // { dg-bogus "non-virtual destructor" } +struct B { private: - ~B(); + ~B(); // inaccessible - no warning public: virtual void f() = 0; }; @@ -52,3 +52,25 @@ private: 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 // { dg-warning "accessible non-virtual destructor" } +{ + virtual void k (); +}; + +struct L1 : K // { dg-warning "accessible non-virtual destructor" } +{virtual ~L1 ();}; +struct L2 : private K +{virtual ~L2 ();}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C new file mode 100644 index 000000000..e83134b06 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C @@ -0,0 +1,75 @@ +// { dg-do compile } +// { dg-options "-Weffc++" } + +// 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(); // inaccessible - no warning +public: + virtual void f() = 0; +}; + +struct B +{ +private: + ~B(); // inaccessible - no warning +public: + virtual void f() = 0; +}; + +struct C // { dg-warning "non-virtual destructor" } +{ + virtual void f() = 0; +}; + +struct D // { dg-warning "non-virtual destructor" } +{ + ~D(); + virtual void f() = 0; +}; + +struct E; + +struct F // { dg-warning "non-virtual destructor" } +{ +protected: + friend class E; + ~F(); +public: + virtual void f() = 0; +}; + +struct G // { dg-warning "non-virtual destructor" } +{ +private: + friend class E; + ~G(); +public: + virtual void f() = 0; +}; + +struct H {}; + +struct I1 : H +{}; +struct I2 : private H +{}; + +struct J1 : H // { dg-warning "accessible non-virtual destructor" } +{ virtual ~J1 ();}; +struct J2 : private H +{ virtual ~J2 ();}; + +struct K // { dg-warning "accessible non-virtual destructor" } +{ + virtual void k (); +}; + +struct L1 : K // { dg-warning "accessible non-virtual destructor" } +{virtual ~L1 ();}; +struct L2 : private K +{virtual ~L2 ();}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C new file mode 100644 index 000000000..dd6d9d768 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C @@ -0,0 +1,75 @@ +// { 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 ();}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C index b04fdcbe6..f03cff5b3 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C @@ -8,3 +8,4 @@ extern "Java" virtual void bar( void); }; } + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C new file mode 100644 index 000000000..c483601e6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C @@ -0,0 +1,11 @@ +// PR c++/44859 + +struct Base2 { int m_foo; }; +struct Derived2 : public Base2 {}; + +const Base2& f8() { return Derived2(); } // { dg-warning "reference to temporary" } + +struct foo { }; +struct bar { foo base; }; + +const foo& f9() { return bar().base; } // { dg-warning "reference to temporary" } |