From: Fariborz Jahanian Date: Tue, 13 Aug 2013 23:44:55 +0000 (+0000) Subject: ObjectiveC [QoI] issue warning if an element of an nsarray X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dc25f8cf9e14b424708af52786af7fcf26445dee;p=clang ObjectiveC [QoI] issue warning if an element of an nsarray expresison is a concatenated nsstring element. // rdar://14303083 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188332 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticGroups.td b/include/clang/Basic/DiagnosticGroups.td index ec9c8eb08c..f1ab1e8dd7 100644 --- a/include/clang/Basic/DiagnosticGroups.td +++ b/include/clang/Basic/DiagnosticGroups.td @@ -552,6 +552,7 @@ def ObjCCocoaAPI : DiagGroup<"objc-cocoa-api", [ ]>; def ObjCStringComparison : DiagGroup<"objc-string-compare">; +def ObjCStringConcatenation : DiagGroup<"objc-string-concatenation">; def ObjCLiteralComparison : DiagGroup<"objc-literal-compare", [ ObjCStringComparison ]>; diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 06053501fa..5a2e6a9c6b 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -1898,6 +1898,9 @@ def warn_missing_atsign_prefix : Warning< def warn_objc_string_literal_comparison : Warning< "direct comparison of a string literal has undefined behavior">, InGroup; +def warn_concatenated_nsarray_literal : Warning< + "concatenated nsstring literal for an nsarray expression">, + InGroup; def note_objc_literal_comparison_isequal : Note< "use 'isEqual:' instead">; diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index de0daca4b8..e3e91d140a 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -324,7 +324,8 @@ ExprResult Sema::ActOnObjCBoolLiteral(SourceLocation AtLoc, /// \brief Check that the given expression is a valid element of an Objective-C /// collection literal. static ExprResult CheckObjCCollectionLiteralElement(Sema &S, Expr *Element, - QualType T) { + QualType T, + bool ArrayLiteral = false) { // If the expression is type-dependent, there's nothing for us to do. if (Element->isTypeDependent()) return Element; @@ -401,14 +402,20 @@ static ExprResult CheckObjCCollectionLiteralElement(Sema &S, Expr *Element, Recovered = true; } } - + if (!Recovered) { S.Diag(Element->getLocStart(), diag::err_invalid_collection_element) << Element->getType(); return ExprError(); } } - + if (ArrayLiteral) + if (ObjCStringLiteral *getString = dyn_cast(OrigElement)) { + if (getString->getString() && getString->getString()->getNumConcatenated() > 1) + S.Diag(Element->getLocStart(), diag::warn_concatenated_nsarray_literal) + << Element->getType(); + } + // Make sure that the element has the type that the container factory // function expects. return S.PerformCopyInitialization( @@ -710,7 +717,7 @@ ExprResult Sema::BuildObjCArrayLiteral(SourceRange SR, MultiExprArg Elements) { for (unsigned I = 0, N = Elements.size(); I != N; ++I) { ExprResult Converted = CheckObjCCollectionLiteralElement(*this, ElementsBuffer[I], - RequiredType); + RequiredType, true); if (Converted.isInvalid()) return ExprError(); diff --git a/test/SemaObjC/objc-array-literal.m b/test/SemaObjC/objc-array-literal.m index 9f59316219..0d18d73c41 100644 --- a/test/SemaObjC/objc-array-literal.m +++ b/test/SemaObjC/objc-array-literal.m @@ -39,3 +39,9 @@ int main() { const char *blah; NSArray *array2 = @[blah]; // expected-error{{collection element of type 'const char *' is not an Objective-C object}} } + +// rdar://14303083 +id Test14303083() { + id obj = @[ @"A", (@"B" @"C")]; + return @[ @"A", @"B" @"C"]; // expected-warning {{concatenated nsstring literal for an nsarray expression}} +}