]> granicus.if.org Git - clang/commitdiff
Add printf format string parsing support for '
authorTed Kremenek <kremenek@apple.com>
Sat, 8 Jan 2011 05:28:38 +0000 (05:28 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 8 Jan 2011 05:28:38 +0000 (05:28 +0000)
prefix to format conversions (POSIX extension).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123054 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/Analyses/FormatString.h
lib/Analysis/PrintfFormatString.cpp
test/Sema/format-strings.c

index 280b1260ac261c4a8c8328491801ba3a51d806b8..cc1d3427e77c8a42448422611e62669a9f84c549 100644 (file)
@@ -379,6 +379,7 @@ using analyze_format_string::OptionalAmount;
 using analyze_format_string::OptionalFlag;
 
 class PrintfSpecifier : public analyze_format_string::FormatSpecifier {
+  OptionalFlag HasThousandsGrouping; // ''', POSIX extension.
   OptionalFlag IsLeftJustified; // '-'
   OptionalFlag HasPlusPrefix; // '+'
   OptionalFlag HasSpacePrefix; // ' '
@@ -388,8 +389,8 @@ class PrintfSpecifier : public analyze_format_string::FormatSpecifier {
 public:
   PrintfSpecifier() :
     FormatSpecifier(/* isPrintf = */ true),
-    IsLeftJustified("-"), HasPlusPrefix("+"), HasSpacePrefix(" "),
-    HasAlternativeForm("#"), HasLeadingZeroes("0") {}
+    HasThousandsGrouping("'"), IsLeftJustified("-"), HasPlusPrefix("+"),
+    HasSpacePrefix(" "), HasAlternativeForm("#"), HasLeadingZeroes("0") {}
 
   static PrintfSpecifier Parse(const char *beg, const char *end);
 
@@ -397,6 +398,10 @@ public:
   void setConversionSpecifier(const PrintfConversionSpecifier &cs) {
     CS = cs;
   }
+  void setHasThousandsGrouping(const char *position) {
+    HasThousandsGrouping = true;
+    HasThousandsGrouping.setPosition(position);
+  }
   void setIsLeftJustified(const char *position) {
     IsLeftJustified = true;
     IsLeftJustified.setPosition(position);
index ff688e07d3da8f120fd3624e9bbf30fc5a3ca0a3..d99de2215dcf72e9ef9a3f82b3ef6a3d31d1dff8 100644 (file)
@@ -100,6 +100,10 @@ static PrintfSpecifierResult ParsePrintfSpecifier(FormatStringHandler &H,
   for ( ; I != E; ++I) {
     switch (*I) {
       default: hasMore = false; break;
+      case '\'': 
+        // FIXME: POSIX specific.  Always accept?
+        FS.setHasThousandsGrouping(I);
+        break;
       case '-': FS.setIsLeftJustified(I); break;
       case '+': FS.setHasPlusPrefix(I); break;
       case ' ': FS.setHasSpacePrefix(I); break;
@@ -185,7 +189,7 @@ static PrintfSpecifierResult ParsePrintfSpecifier(FormatStringHandler &H,
     case 's': k = ConversionSpecifier::sArg;      break;
     case 'u': k = ConversionSpecifier::uArg; break;
     case 'x': k = ConversionSpecifier::xArg; break;
-    // Mac OS X (unicode) specific
+    // POSIX specific.
     case 'C': k = ConversionSpecifier::CArg; break;
     case 'S': k = ConversionSpecifier::SArg; break;
     // Objective-C.
index c51dafdae519473219d002e84705378107891b8d..93b6eb52b2f3ff1595544ec46f987a4c8daa71ea 100644 (file)
@@ -331,3 +331,9 @@ void pr8641() {
   printf("%#x\n", 10);
   printf("%#X\n", 10);
 }
+
+void posix_extensions() {
+  // Test %'d, "thousands grouping".
+  // <rdar://problem/8816343>
+  printf("%'d\n", 123456789); // no-warning
+}