diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-10-31 18:18:29 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-10-31 18:18:29 +0000 |
| commit | f3cec65d01595c0d74b5a33a6867dca786397e8f (patch) | |
| tree | a5e00a569c5f52d4dba4d50b93d6df6ddd890466 /clang/lib | |
| parent | 86b1bfad0509a1ad583ad7a68160bf741dbff636 (diff) | |
| download | bcm5719-llvm-f3cec65d01595c0d74b5a33a6867dca786397e8f.tar.gz bcm5719-llvm-f3cec65d01595c0d74b5a33a6867dca786397e8f.zip | |
When diagnosing that a defaulted function is ill-formed because it would be
implicitly deleted and overrides a non-deleted function, explain why the
function is deleted. For PR30844.
llvm-svn: 285610
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 518a780a4ea..2c743673f69 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -13850,7 +13850,7 @@ void Sema::SetDeclDeleted(Decl *Dcl, SourceLocation DelLoc) { // See if we're deleting a function which is already known to override a // non-deleted virtual function. - if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Fn)) { + if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Fn)) { bool IssuedDiagnostic = false; for (CXXMethodDecl::method_iterator I = MD->begin_overridden_methods(), E = MD->end_overridden_methods(); @@ -13863,6 +13863,11 @@ void Sema::SetDeclDeleted(Decl *Dcl, SourceLocation DelLoc) { Diag((*I)->getLocation(), diag::note_overridden_virtual_function); } } + // If this function was implicitly deleted because it was defaulted, + // explain why it was deleted. + if (IssuedDiagnostic && MD->isDefaulted()) + ShouldDeleteSpecialMember(MD, getSpecialMember(MD), nullptr, + /*Diagnose*/true); } // C++11 [basic.start.main]p3: |

