]> granicus.if.org Git - clang/commitdiff
Refine string literal concatenation warning within an NSArray literal to not warn...
authorTed Kremenek <kremenek@apple.com>
Wed, 9 Oct 2013 22:34:33 +0000 (22:34 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 9 Oct 2013 22:34:33 +0000 (22:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192328 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExprObjC.cpp
test/SemaObjC/objc-array-literal.m

index 5550eb8cf9d632eab0c2398b4cc8694119cd2587..7efa08b45c92665d11c742ab60ecbb8f8ff16187 100644 (file)
@@ -410,10 +410,24 @@ static ExprResult CheckObjCCollectionLiteralElement(Sema &S, Expr *Element,
     }
   }
   if (ArrayLiteral)
-    if (ObjCStringLiteral *getString = dyn_cast<ObjCStringLiteral>(OrigElement)) {
-      if (getString->getString() && getString->getString()->getNumConcatenated() > 1)
-        S.Diag(Element->getLocStart(), diag::warn_concatenated_nsarray_literal)
-        << Element->getType();
+    if (ObjCStringLiteral *getString =
+          dyn_cast<ObjCStringLiteral>(OrigElement)) {
+      if (StringLiteral *SL = getString->getString()) {
+        unsigned numConcat = SL->getNumConcatenated();
+        if (numConcat > 1) {
+          // Only warn if the concatenated string doesn't come from a macro.
+          bool hasMacro = false;
+          for (unsigned i = 0; i < numConcat ; ++i)
+            if (SL->getStrTokenLoc(i).isMacroID()) {
+              hasMacro = true;
+              break;
+            }
+          if (!hasMacro)
+            S.Diag(Element->getLocStart(),
+                   diag::warn_concatenated_nsarray_literal)
+              << Element->getType();
+        }
+      }
     }
 
   // Make sure that the element has the type that the container factory 
index e6e4c471b538cd26211f4185916d6511dc6777fe..a3e29bf122380f7bebdb7e6c60ac8b15a8b6359a 100644 (file)
@@ -45,3 +45,11 @@ id Test14303083() {
   id obj = @[ @"A", (@"B" @"C")];
   return @[ @"A", @"B" @"C"]; // expected-warning {{concatenated NSString literal for an NSArray expression - possibly missing a comma}}
 }
+id radar15147688() {
+#define R15147688_A @"hello"
+#define R15147688_B "world"
+#define CONCATSTR R15147688_A R15147688_B
+  id x = @[ @"stuff", CONCATSTR ]; // no-warning
+  x = @[ @"stuff", @"hello" "world"]; // expected-warning {{concatenated NSString literal for an NSArray expression}}
+  return x;
+}