From 9a22e344a5d675a3f90cacadb8200e3a103ee6c5 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Wed, 3 Jan 2018 23:52:42 +0000 Subject: [PATCH] PR35815: Separate out the ns-consumed diagnostic into an error and a warning This commit separates out the warn_nsconsumed_attribute_mismatch and warn_nsreturns_retained_attribute_mismatch diagnostic into a warning and error. This is needed to avoid a module import regression introduced by r313717 that turned these errors into warnings and started promoting them only when needed, which caused an error when importing a module as it had different warning settings. rdar://36265651 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@321775 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.td | 12 +++++++---- lib/Sema/SemaDeclObjC.cpp | 21 +++++++++++-------- test/SemaObjC/Inputs/module.map | 3 +++ test/SemaObjC/ns-consumed-error-not-warning.m | 13 ++++++++++++ 4 files changed, 36 insertions(+), 13 deletions(-) create mode 100644 test/SemaObjC/Inputs/module.map create mode 100644 test/SemaObjC/ns-consumed-error-not-warning.m diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index ec624a0cc1..d23f476d86 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -8300,12 +8300,16 @@ def err_c99_array_usage_cxx : Error< "feature, not permitted in C++">; def err_type_unsupported : Error< "%0 is not supported on this target">; -def warn_nsconsumed_attribute_mismatch : Warning< +def err_nsconsumed_attribute_mismatch : Error< "overriding method has mismatched ns_consumed attribute on its" - " parameter">, InGroup; -def warn_nsreturns_retained_attribute_mismatch : Warning< + " parameter">; +def err_nsreturns_retained_attribute_mismatch : Error< "overriding method has mismatched ns_returns_%select{not_retained|retained}0" - " attributes">, InGroup; + " attributes">; +def warn_nsconsumed_attribute_mismatch : Warning< + err_nsconsumed_attribute_mismatch.Text>, InGroup; +def warn_nsreturns_retained_attribute_mismatch : Warning< + err_nsreturns_retained_attribute_mismatch.Text>, InGroup; def note_getter_unavailable : Note< "or because setter is declared here, but no getter method %0 is found">; diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index ff3c07e938..d44b5f357d 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -156,23 +156,23 @@ void Sema::CheckObjCMethodOverride(ObjCMethodDecl *NewMethod, Diag(Overridden->getLocation(), diag::note_related_result_type_overridden); } - if (getLangOpts().ObjCAutoRefCount) { - 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() != Overridden->hasAttr())) { Diag(NewMethod->getLocation(), - diag::warn_nsreturns_retained_attribute_mismatch) << 1; + getLangOpts().ObjCAutoRefCount + ? diag::err_nsreturns_retained_attribute_mismatch + : diag::warn_nsreturns_retained_attribute_mismatch) + << 1; Diag(Overridden->getLocation(), diag::note_previous_decl) << "method"; } if ((NewMethod->hasAttr() != Overridden->hasAttr())) { Diag(NewMethod->getLocation(), - diag::warn_nsreturns_retained_attribute_mismatch) << 0; + getLangOpts().ObjCAutoRefCount + ? diag::err_nsreturns_retained_attribute_mismatch + : diag::warn_nsreturns_retained_attribute_mismatch) + << 0; Diag(Overridden->getLocation(), diag::note_previous_decl) << "method"; } @@ -185,7 +185,10 @@ void Sema::CheckObjCMethodOverride(ObjCMethodDecl *NewMethod, ParmVarDecl *newDecl = (*ni); if (newDecl->hasAttr() != oldDecl->hasAttr()) { - Diag(newDecl->getLocation(), diag::warn_nsconsumed_attribute_mismatch); + Diag(newDecl->getLocation(), + getLangOpts().ObjCAutoRefCount + ? diag::err_nsconsumed_attribute_mismatch + : diag::warn_nsconsumed_attribute_mismatch); Diag(oldDecl->getLocation(), diag::note_previous_decl) << "parameter"; } diff --git a/test/SemaObjC/Inputs/module.map b/test/SemaObjC/Inputs/module.map new file mode 100644 index 0000000000..492d4c368e --- /dev/null +++ b/test/SemaObjC/Inputs/module.map @@ -0,0 +1,3 @@ +module empty { + header "empty.h" +} diff --git a/test/SemaObjC/ns-consumed-error-not-warning.m b/test/SemaObjC/ns-consumed-error-not-warning.m new file mode 100644 index 0000000000..f44cc8f0f6 --- /dev/null +++ b/test/SemaObjC/ns-consumed-error-not-warning.m @@ -0,0 +1,13 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fsyntax-only -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs -fobjc-arc -verify -fblocks -triple x86_64-apple-darwin10.0.0 -DOBJCARC %s +// rdar://36265651 + +@interface A +-(void) m:(id)p; // expected-note {{parameter declared here}} +@end + +@interface B : A +-(void) m:(__attribute__((ns_consumed)) id)p; // expected-error {{overriding method has mismatched ns_consumed attribute on its parameter}} +@end + +@import empty; -- 2.50.1