Added fixit notes for -Wfinal-dtor-non-final-class

llvm-svn: 370737
This commit is contained in:
David Bolvansky 2019-09-03 10:32:21 +00:00
parent 25d5b54542
commit c50da3d052
2 changed files with 11 additions and 4 deletions

View File

@ -6241,10 +6241,14 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) {
if (const CXXDestructorDecl *dtor = Record->getDestructor()) { if (const CXXDestructorDecl *dtor = Record->getDestructor()) {
if (const FinalAttr *FA = dtor->getAttr<FinalAttr>()) { if (const FinalAttr *FA = dtor->getAttr<FinalAttr>()) {
Diag(FA->getLocation(), diag::warn_final_dtor_non_final_class) Diag(FA->getLocation(), diag::warn_final_dtor_non_final_class)
<< FA->isSpelledAsSealed(); << FA->isSpelledAsSealed()
Diag(Record->getLocation(), diag::note_final_dtor_non_final_class_silence) << FixItHint::CreateRemoval(FA->getLocation())
<< Context.getRecordType(Record) << FixItHint::CreateInsertion(
<< FA->isSpelledAsSealed(); getLocForEndOfToken(Record->getLocation()),
(FA->isSpelledAsSealed() ? " sealed" : " final"));
Diag(Record->getLocation(),
diag::note_final_dtor_non_final_class_silence)
<< Context.getRecordType(Record) << FA->isSpelledAsSealed();
} }
} }
} }

View File

@ -1,11 +1,14 @@
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s -Wfinal-dtor-non-final-class // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s -Wfinal-dtor-non-final-class
// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -Wfinal-dtor-non-final-class -fdiagnostics-parseable-fixits 2>&1 | FileCheck %s
class A { class A {
~A(); ~A();
}; };
class B { // expected-note {{mark 'B' as 'final' to silence this warning}} class B { // expected-note {{mark 'B' as 'final' to silence this warning}}
// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:8-[[@LINE-1]]:8}:" final"
virtual ~B() final; // expected-warning {{class with destructor marked 'final' cannot be inherited from}} virtual ~B() final; // expected-warning {{class with destructor marked 'final' cannot be inherited from}}
// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:18-[[@LINE-1]]:23}:""
}; };
class C final { class C final {