<div dir="ltr">Add more in r188992.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Aug 21, 2013 at 3:27 PM, Jordan Rose <span dir="ltr"><<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Oh, Aaron's "more tests" comment still stands! If not the fixit tests, at least acceptance tests for %Id and %I32d and such.<br>

<span class="HOEnZb"><font color="#888888"><br>
Jordan<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Aug 21, 2013, at 14:54 , David Majnemer <<a href="mailto:david.majnemer@gmail.com">david.majnemer@gmail.com</a>> wrote:<br>
<br>
> Author: majnemer<br>
> Date: Wed Aug 21 16:54:46 2013<br>
> New Revision: 188937<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=188937&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=188937&view=rev</a><br>
> Log:<br>
> Analysis: Add support for MS specific printf format specifiers<br>
><br>
> Summary: Adds support for %I, %I32 and %I64.<br>
><br>
> Reviewers: hans, jordan_rose, rnk, majnemer<br>
><br>
> Reviewed By: majnemer<br>
><br>
> CC: cfe-commits, cdavis5x<br>
><br>
> Differential Revision: <a href="http://llvm-reviews.chandlerc.com/D1456" target="_blank">http://llvm-reviews.chandlerc.com/D1456</a><br>
><br>
> Added:<br>
>    cfe/trunk/test/Sema/format-strings-ms.c<br>
> Modified:<br>
>    cfe/trunk/include/clang/Analysis/Analyses/FormatString.h<br>
>    cfe/trunk/lib/Analysis/FormatString.cpp<br>
>    cfe/trunk/lib/Analysis/PrintfFormatString.cpp<br>
>    cfe/trunk/lib/Analysis/ScanfFormatString.cpp<br>
><br>
> Modified: cfe/trunk/include/clang/Analysis/Analyses/FormatString.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/FormatString.h?rev=188937&r1=188936&r2=188937&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/FormatString.h?rev=188937&r1=188936&r2=188937&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/Analysis/Analyses/FormatString.h (original)<br>
> +++ cfe/trunk/include/clang/Analysis/Analyses/FormatString.h Wed Aug 21 16:54:46 2013<br>
> @@ -73,6 +73,9 @@ public:<br>
>     AsIntMax,     // 'j'<br>
>     AsSizeT,      // 'z'<br>
>     AsPtrDiff,    // 't'<br>
> +    AsInt32,      // 'I32' (MSVCRT, like __int32)<br>
> +    AsInt3264,    // 'I'   (MSVCRT, like __int3264 from MIDL)<br>
> +    AsInt64,      // 'I64' (MSVCRT, like __int64)<br>
>     AsLongDouble, // 'L'<br>
>     AsAllocate,   // for '%as', GNU extension to C90 scanf<br>
>     AsMAllocate,  // for '%ms', GNU extension to scanf<br>
> @@ -95,6 +98,9 @@ public:<br>
>       case AsLongLong:<br>
>       case AsChar:<br>
>         return 2;<br>
> +      case AsInt32:<br>
> +      case AsInt64:<br>
> +        return 3;<br>
>       case None:<br>
>         return 0;<br>
>     }<br>
><br>
> Modified: cfe/trunk/lib/Analysis/FormatString.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/FormatString.cpp?rev=188937&r1=188936&r2=188937&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/FormatString.cpp?rev=188937&r1=188936&r2=188937&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Analysis/FormatString.cpp (original)<br>
> +++ cfe/trunk/lib/Analysis/FormatString.cpp Wed Aug 21 16:54:46 2013<br>
> @@ -223,6 +223,27 @@ clang::analyze_format_string::ParseLengt<br>
>         break;<br>
>       }<br>
>       return false;<br>
> +    // printf: AsInt64, AsInt32, AsInt3264<br>
> +    // scanf:  AsInt64<br>
> +    case 'I':<br>
> +      if (I + 1 != E && I + 2 != E) {<br>
> +        if (I[1] == '6' && I[2] == '4') {<br>
> +          I += 3;<br>
> +          lmKind = LengthModifier::AsInt64;<br>
> +          break;<br>
> +        }<br>
> +        if (IsScanf)<br>
> +          return false;<br>
> +<br>
> +        if (I[1] == '3' && I[2] == '2') {<br>
> +          I += 3;<br>
> +          lmKind = LengthModifier::AsInt32;<br>
> +          break;<br>
> +        }<br>
> +      }<br>
> +      ++I;<br>
> +      lmKind = LengthModifier::AsInt3264;<br>
> +      break;<br>
>   }<br>
>   LengthModifier lm(lmPosition, lmKind);<br>
>   FS.setLengthModifier(lm);<br>
> @@ -471,6 +492,12 @@ analyze_format_string::LengthModifier::t<br>
>     return "z";<br>
>   case AsPtrDiff:<br>
>     return "t";<br>
> +  case AsInt32:<br>
> +    return "I32";<br>
> +  case AsInt3264:<br>
> +    return "I";<br>
> +  case AsInt64:<br>
> +    return "I64";<br>
>   case AsLongDouble:<br>
>     return "L";<br>
>   case AsAllocate:<br>
> @@ -514,7 +541,7 @@ const char *ConversionSpecifier::toStrin<br>
>   case ScanListArg: return "[";<br>
>   case InvalidSpecifier: return NULL;<br>
><br>
> -  // MacOS X unicode extensions.<br>
> +  // POSIX unicode extensions.<br>
>   case CArg: return "C";<br>
>   case SArg: return "S";<br>
><br>
> @@ -678,6 +705,20 @@ bool FormatSpecifier::hasValidLengthModi<br>
>         default:<br>
>           return false;<br>
>       }<br>
> +    case LengthModifier::AsInt32:<br>
> +    case LengthModifier::AsInt3264:<br>
> +    case LengthModifier::AsInt64:<br>
> +      switch (CS.getKind()) {<br>
> +        case ConversionSpecifier::dArg:<br>
> +        case ConversionSpecifier::iArg:<br>
> +        case ConversionSpecifier::oArg:<br>
> +        case ConversionSpecifier::uArg:<br>
> +        case ConversionSpecifier::xArg:<br>
> +        case ConversionSpecifier::XArg:<br>
> +          return Target.getTriple().isOSMSVCRT();<br>
> +        default:<br>
> +          return false;<br>
> +      }<br>
>   }<br>
>   llvm_unreachable("Invalid LengthModifier Kind!");<br>
> }<br>
> @@ -697,6 +738,9 @@ bool FormatSpecifier::hasStandardLengthM<br>
>     case LengthModifier::AsAllocate:<br>
>     case LengthModifier::AsMAllocate:<br>
>     case LengthModifier::AsQuad:<br>
> +    case LengthModifier::AsInt32:<br>
> +    case LengthModifier::AsInt3264:<br>
> +    case LengthModifier::AsInt64:<br>
>       return false;<br>
>   }<br>
>   llvm_unreachable("Invalid LengthModifier Kind!");<br>
><br>
> Modified: cfe/trunk/lib/Analysis/PrintfFormatString.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PrintfFormatString.cpp?rev=188937&r1=188936&r2=188937&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PrintfFormatString.cpp?rev=188937&r1=188936&r2=188937&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Analysis/PrintfFormatString.cpp (original)<br>
> +++ cfe/trunk/lib/Analysis/PrintfFormatString.cpp Wed Aug 21 16:54:46 2013<br>
> @@ -187,8 +187,8 @@ static PrintfSpecifierResult ParsePrintf<br>
>     case 'i': k = ConversionSpecifier::iArg; break;<br>
>     case 'n': k = ConversionSpecifier::nArg; break;<br>
>     case 'o': k = ConversionSpecifier::oArg; break;<br>
> -    case 'p': k = ConversionSpecifier::pArg;   break;<br>
> -    case 's': k = ConversionSpecifier::sArg;      break;<br>
> +    case 'p': k = ConversionSpecifier::pArg; break;<br>
> +    case 's': k = ConversionSpecifier::sArg; break;<br>
>     case 'u': k = ConversionSpecifier::uArg; break;<br>
>     case 'x': k = ConversionSpecifier::xArg; break;<br>
>     // POSIX specific.<br>
> @@ -278,18 +278,26 @@ ArgType PrintfSpecifier::getArgType(ASTC<br>
>       case LengthModifier::AsLongDouble:<br>
>         // GNU extension.<br>
>         return Ctx.LongLongTy;<br>
> -      case LengthModifier::None: return Ctx.IntTy;<br>
> +      case LengthModifier::None:<br>
> +        return Ctx.IntTy;<br>
> +      case LengthModifier::AsInt32:<br>
> +        return ArgType(Ctx.IntTy, "__int32");<br>
>       case LengthModifier::AsChar: return ArgType::AnyCharTy;<br>
>       case LengthModifier::AsShort: return Ctx.ShortTy;<br>
>       case LengthModifier::AsLong: return Ctx.LongTy;<br>
>       case LengthModifier::AsLongLong:<br>
>       case LengthModifier::AsQuad:<br>
>         return Ctx.LongLongTy;<br>
> +      case LengthModifier::AsInt64:<br>
> +        return ArgType(Ctx.LongLongTy, "__int64");<br>
>       case LengthModifier::AsIntMax:<br>
>         return ArgType(Ctx.getIntMaxType(), "intmax_t");<br>
>       case LengthModifier::AsSizeT:<br>
>         // FIXME: How to get the corresponding signed version of size_t?<br>
>         return ArgType();<br>
> +      case LengthModifier::AsInt3264:<br>
> +        return Ctx.getTargetInfo().getTriple().isArch64Bit() ? Ctx.LongLongTy<br>
> +                                                             : Ctx.IntTy;<br>
>       case LengthModifier::AsPtrDiff:<br>
>         return ArgType(Ctx.getPointerDiffType(), "ptrdiff_t");<br>
>       case LengthModifier::AsAllocate:<br>
> @@ -302,17 +310,26 @@ ArgType PrintfSpecifier::getArgType(ASTC<br>
>       case LengthModifier::AsLongDouble:<br>
>         // GNU extension.<br>
>         return Ctx.UnsignedLongLongTy;<br>
> -      case LengthModifier::None: return Ctx.UnsignedIntTy;<br>
> +      case LengthModifier::None:<br>
> +        return Ctx.UnsignedIntTy;<br>
> +      case LengthModifier::AsInt32:<br>
> +        return ArgType(Ctx.UnsignedIntTy, "unsigned __int32");<br>
>       case LengthModifier::AsChar: return Ctx.UnsignedCharTy;<br>
>       case LengthModifier::AsShort: return Ctx.UnsignedShortTy;<br>
>       case LengthModifier::AsLong: return Ctx.UnsignedLongTy;<br>
>       case LengthModifier::AsLongLong:<br>
>       case LengthModifier::AsQuad:<br>
>         return Ctx.UnsignedLongLongTy;<br>
> +      case LengthModifier::AsInt64:<br>
> +        return ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64");<br>
>       case LengthModifier::AsIntMax:<br>
>         return ArgType(Ctx.getUIntMaxType(), "uintmax_t");<br>
>       case LengthModifier::AsSizeT:<br>
>         return ArgType(Ctx.getSizeType(), "size_t");<br>
> +      case LengthModifier::AsInt3264:<br>
> +        return Ctx.getTargetInfo().getTriple().isArch64Bit()<br>
> +                   ? Ctx.UnsignedLongLongTy<br>
> +                   : Ctx.UnsignedIntTy;<br>
>       case LengthModifier::AsPtrDiff:<br>
>         // FIXME: How to get the corresponding unsigned<br>
>         // version of ptrdiff_t?<br>
> @@ -351,6 +368,9 @@ ArgType PrintfSpecifier::getArgType(ASTC<br>
>         return ArgType(); // FIXME: Is this a known extension?<br>
>       case LengthModifier::AsAllocate:<br>
>       case LengthModifier::AsMAllocate:<br>
> +      case LengthModifier::AsInt32:<br>
> +      case LengthModifier::AsInt3264:<br>
> +      case LengthModifier::AsInt64:<br>
>         return ArgType::Invalid();<br>
>     }<br>
>   }<br>
><br>
> Modified: cfe/trunk/lib/Analysis/ScanfFormatString.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ScanfFormatString.cpp?rev=188937&r1=188936&r2=188937&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ScanfFormatString.cpp?rev=188937&r1=188936&r2=188937&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Analysis/ScanfFormatString.cpp (original)<br>
> +++ cfe/trunk/lib/Analysis/ScanfFormatString.cpp Wed Aug 21 16:54:46 2013<br>
> @@ -232,6 +232,8 @@ ArgType ScanfSpecifier::getArgType(ASTCo<br>
>         case LengthModifier::AsLongLong:<br>
>         case LengthModifier::AsQuad:<br>
>           return ArgType::PtrTo(Ctx.LongLongTy);<br>
> +        case LengthModifier::AsInt64:<br>
> +          return ArgType::PtrTo(ArgType(Ctx.LongLongTy, "__int64"));<br>
>         case LengthModifier::AsIntMax:<br>
>           return ArgType::PtrTo(ArgType(Ctx.getIntMaxType(), "intmax_t"));<br>
>         case LengthModifier::AsSizeT:<br>
> @@ -243,8 +245,9 @@ ArgType ScanfSpecifier::getArgType(ASTCo<br>
>           // GNU extension.<br>
>           return ArgType::PtrTo(Ctx.LongLongTy);<br>
>         case LengthModifier::AsAllocate:<br>
> -          return ArgType::Invalid();<br>
>         case LengthModifier::AsMAllocate:<br>
> +        case LengthModifier::AsInt32:<br>
> +        case LengthModifier::AsInt3264:<br>
>           return ArgType::Invalid();<br>
>       }<br>
><br>
> @@ -267,6 +270,8 @@ ArgType ScanfSpecifier::getArgType(ASTCo<br>
>         case LengthModifier::AsLongLong:<br>
>         case LengthModifier::AsQuad:<br>
>           return ArgType::PtrTo(Ctx.UnsignedLongLongTy);<br>
> +        case LengthModifier::AsInt64:<br>
> +          return ArgType::PtrTo(ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64"));<br>
>         case LengthModifier::AsIntMax:<br>
>           return ArgType::PtrTo(ArgType(Ctx.getUIntMaxType(), "uintmax_t"));<br>
>         case LengthModifier::AsSizeT:<br>
> @@ -278,8 +283,9 @@ ArgType ScanfSpecifier::getArgType(ASTCo<br>
>           // GNU extension.<br>
>           return ArgType::PtrTo(Ctx.UnsignedLongLongTy);<br>
>         case LengthModifier::AsAllocate:<br>
> -          return ArgType::Invalid();<br>
>         case LengthModifier::AsMAllocate:<br>
> +        case LengthModifier::AsInt32:<br>
> +        case LengthModifier::AsInt3264:<br>
>           return ArgType::Invalid();<br>
>       }<br>
><br>
> @@ -349,6 +355,8 @@ ArgType ScanfSpecifier::getArgType(ASTCo<br>
>         case LengthModifier::AsLongLong:<br>
>         case LengthModifier::AsQuad:<br>
>           return ArgType::PtrTo(Ctx.LongLongTy);<br>
> +        case LengthModifier::AsInt64:<br>
> +          return ArgType::PtrTo(ArgType(Ctx.LongLongTy, "__int64"));<br>
>         case LengthModifier::AsIntMax:<br>
>           return ArgType::PtrTo(ArgType(Ctx.getIntMaxType(), "intmax_t"));<br>
>         case LengthModifier::AsSizeT:<br>
> @@ -359,6 +367,8 @@ ArgType ScanfSpecifier::getArgType(ASTCo<br>
>           return ArgType(); // FIXME: Is this a known extension?<br>
>         case LengthModifier::AsAllocate:<br>
>         case LengthModifier::AsMAllocate:<br>
> +        case LengthModifier::AsInt32:<br>
> +        case LengthModifier::AsInt3264:<br>
>           return ArgType::Invalid();<br>
>         }<br>
><br>
><br>
> Added: cfe/trunk/test/Sema/format-strings-ms.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings-ms.c?rev=188937&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings-ms.c?rev=188937&view=auto</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Sema/format-strings-ms.c (added)<br>
> +++ cfe/trunk/test/Sema/format-strings-ms.c Wed Aug 21 16:54:46 2013<br>
> @@ -0,0 +1,9 @@<br>
> +// RUN: %clang_cc1 -fsyntax-only -verify -fms-compatibility -triple=i386-pc-win32 -pedantic %s<br>
> +<br>
> +int printf(const char *format, ...) __attribute__((format(printf, 1, 2)));<br>
> +<br>
> +void test() {<br>
> +  short val = 30;<br>
> +  printf("val = %I64d\n", val); // expected-warning{{'I64' length modifier is not supported by ISO C}} \<br>
> +                                // expected-warning{{format specifies type '__int64' (aka 'long long') but the argument has type 'short'}}<br>
> +}<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br>
</div></div></blockquote></div><br></div>