thakis created this revision. Makes the warning useful again in a std::unique_ptr world, PR28460.
https://reviews.llvm.org/D37235 Files: include/clang/Basic/DiagnosticSemaKinds.td test/SemaCXX/destructor.cpp Index: test/SemaCXX/destructor.cpp =================================================================== --- test/SemaCXX/destructor.cpp +++ test/SemaCXX/destructor.cpp @@ -1,5 +1,31 @@ // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fsyntax-only -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -fcxx-exceptions -verify %s // RUN: %clang_cc1 -std=c++11 -triple %ms_abi_triple -DMSABI -fsyntax-only -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -verify %s + +#if defined(BE_THE_HEADER) + +// Wdelete-non-virtual-dtor should warn about the delete from smart pointer +// classes in system headers (std::unique_ptr...) too. + +#pragma clang system_header +namespace dnvd { +template <typename T> +class simple_ptr { +public: + simple_ptr(T* t): _ptr(t) {} + ~simple_ptr() { delete _ptr; } // \ + // expected-warning {{delete called on non-final 'dnvd::B' that has virtual functions but non-virtual destructor}} \ + // expected-warning {{delete called on non-final 'dnvd::D' that has virtual functions but non-virtual destructor}} + T& operator*() const { return *_ptr; } +private: + T* _ptr; +}; +} + +#else + +#define BE_THE_HEADER +#include __FILE__ + class A { public: ~A(); @@ -213,18 +239,6 @@ struct VF final: VB {}; template <typename T> -class simple_ptr { -public: - simple_ptr(T* t): _ptr(t) {} - ~simple_ptr() { delete _ptr; } // \ - // expected-warning {{delete called on non-final 'dnvd::B' that has virtual functions but non-virtual destructor}} \ - // expected-warning {{delete called on non-final 'dnvd::D' that has virtual functions but non-virtual destructor}} - T& operator*() const { return *_ptr; } -private: - T* _ptr; -}; - -template <typename T> class simple_ptr2 { public: simple_ptr2(T* t): _ptr(t) {} @@ -451,3 +465,4 @@ x.foo1(); } } +#endif // BE_THE_HEADER Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -6414,12 +6414,12 @@ def warn_delete_non_virtual_dtor : Warning< "%select{delete|destructor}0 called on non-final %1 that has " "virtual functions but non-virtual destructor">, - InGroup<DeleteNonVirtualDtor>, DefaultIgnore; + InGroup<DeleteNonVirtualDtor>, DefaultIgnore, ShowInSystemHeader; def note_delete_non_virtual : Note< "qualify call to silence this warning">; def warn_delete_abstract_non_virtual_dtor : Warning< "%select{delete|destructor}0 called on %1 that is abstract but has " - "non-virtual destructor">, InGroup<DeleteNonVirtualDtor>; + "non-virtual destructor">, InGroup<DeleteNonVirtualDtor>, ShowInSystemHeader; def warn_overloaded_virtual : Warning< "%q0 hides overloaded virtual %select{function|functions}1">, InGroup<OverloadedVirtual>, DefaultIgnore;
Index: test/SemaCXX/destructor.cpp =================================================================== --- test/SemaCXX/destructor.cpp +++ test/SemaCXX/destructor.cpp @@ -1,5 +1,31 @@ // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fsyntax-only -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -fcxx-exceptions -verify %s // RUN: %clang_cc1 -std=c++11 -triple %ms_abi_triple -DMSABI -fsyntax-only -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -verify %s + +#if defined(BE_THE_HEADER) + +// Wdelete-non-virtual-dtor should warn about the delete from smart pointer +// classes in system headers (std::unique_ptr...) too. + +#pragma clang system_header +namespace dnvd { +template <typename T> +class simple_ptr { +public: + simple_ptr(T* t): _ptr(t) {} + ~simple_ptr() { delete _ptr; } // \ + // expected-warning {{delete called on non-final 'dnvd::B' that has virtual functions but non-virtual destructor}} \ + // expected-warning {{delete called on non-final 'dnvd::D' that has virtual functions but non-virtual destructor}} + T& operator*() const { return *_ptr; } +private: + T* _ptr; +}; +} + +#else + +#define BE_THE_HEADER +#include __FILE__ + class A { public: ~A(); @@ -213,18 +239,6 @@ struct VF final: VB {}; template <typename T> -class simple_ptr { -public: - simple_ptr(T* t): _ptr(t) {} - ~simple_ptr() { delete _ptr; } // \ - // expected-warning {{delete called on non-final 'dnvd::B' that has virtual functions but non-virtual destructor}} \ - // expected-warning {{delete called on non-final 'dnvd::D' that has virtual functions but non-virtual destructor}} - T& operator*() const { return *_ptr; } -private: - T* _ptr; -}; - -template <typename T> class simple_ptr2 { public: simple_ptr2(T* t): _ptr(t) {} @@ -451,3 +465,4 @@ x.foo1(); } } +#endif // BE_THE_HEADER Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -6414,12 +6414,12 @@ def warn_delete_non_virtual_dtor : Warning< "%select{delete|destructor}0 called on non-final %1 that has " "virtual functions but non-virtual destructor">, - InGroup<DeleteNonVirtualDtor>, DefaultIgnore; + InGroup<DeleteNonVirtualDtor>, DefaultIgnore, ShowInSystemHeader; def note_delete_non_virtual : Note< "qualify call to silence this warning">; def warn_delete_abstract_non_virtual_dtor : Warning< "%select{delete|destructor}0 called on %1 that is abstract but has " - "non-virtual destructor">, InGroup<DeleteNonVirtualDtor>; + "non-virtual destructor">, InGroup<DeleteNonVirtualDtor>, ShowInSystemHeader; def warn_overloaded_virtual : Warning< "%q0 hides overloaded virtual %select{function|functions}1">, InGroup<OverloadedVirtual>, DefaultIgnore;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits