I had compiled a bunch of code with this, but right after I sent this out my local build of something failed with this:
../../buildtools/third_party/libc++/trunk/include/type_traits:2156:51: error: destructor called on non-final 'Ice::VariableDeclaration::RelocInitializer' that has virtual functions but non-virtual destructor [-Werror,-Wdelete-non-virtual-dtor] typename __is_destructible_apply<decltype(_VSTD::declval<_Tp1&>().~_Tp1())>::type ^ ../../buildtools/third_party/libc++/trunk/include/__config:435:15: note: expanded from macro '_VSTD' #define _VSTD std::_LIBCPP_NAMESPACE ^ ../../buildtools/third_party/libc++/trunk/include/type_traits:2156:76: note: qualify call to silence this warning typename __is_destructible_apply<decltype(_VSTD::declval<_Tp1&>().~_Tp1())>::type ^ So I'll have to tweak the warning to not fire in unevaluated contexts first. Feel free to ignore for now. On Mon, Aug 28, 2017 at 6:08 PM, Nico Weber via Phabricator via cfe-commits <cfe-commits@lists.llvm.org> wrote: > 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; > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits