Add '@' conversion specifier.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94713 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/Analysis/Analyses/PrintfFormatString.h b/include/clang/Analysis/Analyses/PrintfFormatString.h
index 978486d..c5bac8c 100644
--- a/include/clang/Analysis/Analyses/PrintfFormatString.h
+++ b/include/clang/Analysis/Analyses/PrintfFormatString.h
@@ -24,6 +24,7 @@
 public:
   enum Kind {
    InvalidSpecifier = 0,
+    // C99 conversion specifiers.
    dArg, // 'd'
    iArg, // 'i',
    oArg, // 'o',
@@ -43,12 +44,19 @@
    VoidPtrArg,    // 'p'
    OutIntPtrArg,  // 'n'
    PercentArg,    // '%'
+    // Objective-C specific specifiers.
+   ObjCObjArg,    // '@'
+    // Specifier ranges.
    IntArgBeg = dArg,
    IntArgEnd = iArg,
    UIntArgBeg = oArg,
    UIntArgEnd = XArg,
    DoubleArgBeg = fArg,
-   DoubleArgEnd = AArg
+   DoubleArgEnd = AArg,
+   C99Beg = IntArgBeg,
+   C99End = DoubleArgEnd,
+   ObjCBeg = ObjCObjArg,
+   ObjCEnd = ObjCObjArg
   };
 
   ConversionSpecifier(Kind k) : kind(k) {}
diff --git a/lib/Analysis/PrintfFormatString.cpp b/lib/Analysis/PrintfFormatString.cpp
index d7b9a21..9907dc9 100644
--- a/lib/Analysis/PrintfFormatString.cpp
+++ b/lib/Analysis/PrintfFormatString.cpp
@@ -193,9 +193,8 @@
   switch (*I) {
     default:
       H.HandleInvalidConversionSpecifier(I);
-      return true;
-      
-    // Handle the cases we know about.
+      return true;      
+    // C99: 7.19.6.1 (section 8).
     case 'd': cs = ConversionSpecifier::dArg; break;
     case 'i': cs = ConversionSpecifier::iArg; break;
     case 'o': cs = ConversionSpecifier::oArg; break;
@@ -214,7 +213,9 @@
     case 's': cs = ConversionSpecifier::CStrArg;      break;
     case 'p': cs = ConversionSpecifier::VoidPtrArg;   break;
     case 'n': cs = ConversionSpecifier::OutIntPtrArg; break;
-    case '%': cs = ConversionSpecifier::PercentArg;   break;
+    case '%': cs = ConversionSpecifier::PercentArg;   break;      
+    // Objective-C.
+    case '@': cs = ConversionSpecifier::ObjCObjArg; break;      
   }
   FS.setConversionSpecifier(cs);
   return FormatSpecifierResult(Start, FS);