diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2017-09-20 05:39:18 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2017-09-20 05:39:18 +0000 |
commit | cb0d01de81d97f744ef81029b8e013a770b46936 (patch) | |
tree | 78a02f418a344310304a4471436eede3fa971a07 /lib/Sema | |
parent | 2351bad637c04876207215c47e9a07f315246b87 (diff) | |
download | clang-cb0d01de81d97f744ef81029b8e013a770b46936.tar.gz |
[Sema][ObjC] Warn about mismatches in attributes between overriding and
overridden methods when compiling for non-ARC.
Previously, clang would error out when compiling for ARC, but didn't
print any diagnostics when compiling for non-ARC.
This was pointed out in the patch review for attribute noescape:
https://reviews.llvm.org/D32210
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@313717 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 967573011d..5f9f608b75 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -157,34 +157,36 @@ void Sema::CheckObjCMethodOverride(ObjCMethodDecl *NewMethod, diag::note_related_result_type_overridden); } if (getLangOpts().ObjCAutoRefCount) { - if ((NewMethod->hasAttr<NSReturnsRetainedAttr>() != - Overridden->hasAttr<NSReturnsRetainedAttr>())) { - Diag(NewMethod->getLocation(), - diag::err_nsreturns_retained_attribute_mismatch) << 1; - Diag(Overridden->getLocation(), diag::note_previous_decl) - << "method"; - } - if ((NewMethod->hasAttr<NSReturnsNotRetainedAttr>() != - Overridden->hasAttr<NSReturnsNotRetainedAttr>())) { - Diag(NewMethod->getLocation(), - diag::err_nsreturns_retained_attribute_mismatch) << 0; - Diag(Overridden->getLocation(), diag::note_previous_decl) - << "method"; - } - ObjCMethodDecl::param_const_iterator oi = Overridden->param_begin(), - oe = Overridden->param_end(); - for (ObjCMethodDecl::param_iterator - ni = NewMethod->param_begin(), ne = NewMethod->param_end(); - ni != ne && oi != oe; ++ni, ++oi) { - const ParmVarDecl *oldDecl = (*oi); - ParmVarDecl *newDecl = (*ni); - if (newDecl->hasAttr<NSConsumedAttr>() != - oldDecl->hasAttr<NSConsumedAttr>()) { - Diag(newDecl->getLocation(), - diag::err_nsconsumed_attribute_mismatch); - Diag(oldDecl->getLocation(), diag::note_previous_decl) - << "parameter"; - } + Diags.setSeverity(diag::warn_nsreturns_retained_attribute_mismatch, + diag::Severity::Error, SourceLocation()); + Diags.setSeverity(diag::warn_nsconsumed_attribute_mismatch, + diag::Severity::Error, SourceLocation()); + } + + if ((NewMethod->hasAttr<NSReturnsRetainedAttr>() != + Overridden->hasAttr<NSReturnsRetainedAttr>())) { + Diag(NewMethod->getLocation(), + diag::warn_nsreturns_retained_attribute_mismatch) << 1; + Diag(Overridden->getLocation(), diag::note_previous_decl) << "method"; + } + if ((NewMethod->hasAttr<NSReturnsNotRetainedAttr>() != + Overridden->hasAttr<NSReturnsNotRetainedAttr>())) { + Diag(NewMethod->getLocation(), + diag::warn_nsreturns_retained_attribute_mismatch) << 0; + Diag(Overridden->getLocation(), diag::note_previous_decl) << "method"; + } + + ObjCMethodDecl::param_const_iterator oi = Overridden->param_begin(), + oe = Overridden->param_end(); + for (ObjCMethodDecl::param_iterator ni = NewMethod->param_begin(), + ne = NewMethod->param_end(); + ni != ne && oi != oe; ++ni, ++oi) { + const ParmVarDecl *oldDecl = (*oi); + ParmVarDecl *newDecl = (*ni); + if (newDecl->hasAttr<NSConsumedAttr>() != + oldDecl->hasAttr<NSConsumedAttr>()) { + Diag(newDecl->getLocation(), diag::warn_nsconsumed_attribute_mismatch); + Diag(oldDecl->getLocation(), diag::note_previous_decl) << "parameter"; } } } |