This revision was automatically updated to reflect the committed changes. Closed by commit rC350856: Split -Wdelete-non-virtual-dtor into two groups (authored by epilk, committed by ).
Changed prior to commit: https://reviews.llvm.org/D56405?vs=180690&id=181081#toc Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D56405/new/ https://reviews.llvm.org/D56405 Files: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td test/SemaCXX/delete-non-virtual-dtor.cpp Index: test/SemaCXX/delete-non-virtual-dtor.cpp =================================================================== --- test/SemaCXX/delete-non-virtual-dtor.cpp +++ test/SemaCXX/delete-non-virtual-dtor.cpp @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 %s -verify -DDIAG1 +// RUN: %clang_cc1 %s -verify -DDIAG1 -DDIAG2 -Wdelete-non-virtual-dtor +// RUN: %clang_cc1 %s -verify -DDIAG1 -Wmost -Wno-delete-non-abstract-non-virtual-dtor +// RUN: %clang_cc1 %s -verify -DDIAG2 -Wmost -Wno-delete-abstract-non-virtual-dtor +// RUN: %clang_cc1 %s -verify -Wmost -Wno-delete-non-virtual-dtor + +#ifndef DIAG1 +#ifndef DIAG2 +// expected-no-diagnostics +#endif +#endif + +struct S1 { + ~S1() {} + virtual void abs() = 0; +}; + +void f1(S1 *s1) { delete s1; } +#ifdef DIAG1 +// expected-warning@-2 {{delete called on 'S1' that is abstract but has non-virtual destructor}} +#endif + +struct S2 { + ~S2() {} + virtual void real() {} +}; +void f2(S2 *s2) { delete s2; } +#ifdef DIAG2 +// expected-warning@-2 {{delete called on non-final 'S2' that has virtual functions but non-virtual destructor}} +#endif Index: include/clang/Basic/DiagnosticGroups.td =================================================================== --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -104,7 +104,11 @@ def MissingNoEscape : DiagGroup<"missing-noescape">; def DeleteIncomplete : DiagGroup<"delete-incomplete">; -def DeleteNonVirtualDtor : DiagGroup<"delete-non-virtual-dtor">; +def DeleteNonAbstractNonVirtualDtor : DiagGroup<"delete-non-abstract-non-virtual-dtor">; +def DeleteAbstractNonVirtualDtor : DiagGroup<"delete-abstract-non-virtual-dtor">; +def DeleteNonVirtualDtor : DiagGroup<"delete-non-virtual-dtor", + [DeleteNonAbstractNonVirtualDtor, + DeleteAbstractNonVirtualDtor]>; def AbstractFinalClass : DiagGroup<"abstract-final-class">; def CXX11CompatDeprecatedWritableStr : Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -6455,12 +6455,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, ShowInSystemHeader; + InGroup<DeleteNonAbstractNonVirtualDtor>, 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>, ShowInSystemHeader; + "non-virtual destructor">, InGroup<DeleteAbstractNonVirtualDtor>, ShowInSystemHeader; def warn_overloaded_virtual : Warning< "%q0 hides overloaded virtual %select{function|functions}1">, InGroup<OverloadedVirtual>, DefaultIgnore;
Index: test/SemaCXX/delete-non-virtual-dtor.cpp =================================================================== --- test/SemaCXX/delete-non-virtual-dtor.cpp +++ test/SemaCXX/delete-non-virtual-dtor.cpp @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 %s -verify -DDIAG1 +// RUN: %clang_cc1 %s -verify -DDIAG1 -DDIAG2 -Wdelete-non-virtual-dtor +// RUN: %clang_cc1 %s -verify -DDIAG1 -Wmost -Wno-delete-non-abstract-non-virtual-dtor +// RUN: %clang_cc1 %s -verify -DDIAG2 -Wmost -Wno-delete-abstract-non-virtual-dtor +// RUN: %clang_cc1 %s -verify -Wmost -Wno-delete-non-virtual-dtor + +#ifndef DIAG1 +#ifndef DIAG2 +// expected-no-diagnostics +#endif +#endif + +struct S1 { + ~S1() {} + virtual void abs() = 0; +}; + +void f1(S1 *s1) { delete s1; } +#ifdef DIAG1 +// expected-warning@-2 {{delete called on 'S1' that is abstract but has non-virtual destructor}} +#endif + +struct S2 { + ~S2() {} + virtual void real() {} +}; +void f2(S2 *s2) { delete s2; } +#ifdef DIAG2 +// expected-warning@-2 {{delete called on non-final 'S2' that has virtual functions but non-virtual destructor}} +#endif Index: include/clang/Basic/DiagnosticGroups.td =================================================================== --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -104,7 +104,11 @@ def MissingNoEscape : DiagGroup<"missing-noescape">; def DeleteIncomplete : DiagGroup<"delete-incomplete">; -def DeleteNonVirtualDtor : DiagGroup<"delete-non-virtual-dtor">; +def DeleteNonAbstractNonVirtualDtor : DiagGroup<"delete-non-abstract-non-virtual-dtor">; +def DeleteAbstractNonVirtualDtor : DiagGroup<"delete-abstract-non-virtual-dtor">; +def DeleteNonVirtualDtor : DiagGroup<"delete-non-virtual-dtor", + [DeleteNonAbstractNonVirtualDtor, + DeleteAbstractNonVirtualDtor]>; def AbstractFinalClass : DiagGroup<"abstract-final-class">; def CXX11CompatDeprecatedWritableStr : Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -6455,12 +6455,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, ShowInSystemHeader; + InGroup<DeleteNonAbstractNonVirtualDtor>, 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>, ShowInSystemHeader; + "non-virtual destructor">, InGroup<DeleteAbstractNonVirtualDtor>, 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