<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>Ah, right...fair enough.</div><br><div><div>On Aug 22, 2013, at 10:57 , David Majnemer <<a href="mailto:david.majnemer@gmail.com">david.majnemer@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">From <a href="http://msdn.microsoft.com/en-us/library/tcxf1dw6(v=vs.120).aspx">http://msdn.microsoft.com/en-us/library/tcxf1dw6(v=vs.120).aspx</a><div><br></div><div>"ptrdiff_t (that is, __int32 on 32-bit platforms, __int64 on 64-bit platforms)<br>
</div><div>size_t (that is, unsigned __int32 on 32-bit platforms, unsigned __int64 on 64-bit platforms)"</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 22, 2013 at 9:06 AM, 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">I don't think this is correct. I'm not a Windows programmer, but I would think you should never use %I to print something that's explicitly __int32 or __int64, right?<br>

<div class="HOEnZb"><div class="h5"><br>
<br>
On Aug 22, 2013, at 0:53 , David Majnemer <<a href="mailto:david.majnemer@gmail.com">david.majnemer@gmail.com</a>> wrote:<br>
<br>
> Author: majnemer<br>
> Date: Thu Aug 22 02:53:21 2013<br>
> New Revision: 188992<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=188992&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=188992&view=rev</a><br>
> Log:<br>
> Analysis: Make %I in printf more reasonable, add more tests<br>
><br>
> Modified:<br>
>    cfe/trunk/lib/Analysis/PrintfFormatString.cpp<br>
>    cfe/trunk/test/Sema/format-strings-ms.c<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=188992&r1=188991&r2=188992&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PrintfFormatString.cpp?rev=188992&r1=188991&r2=188992&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Analysis/PrintfFormatString.cpp (original)<br>
> +++ cfe/trunk/lib/Analysis/PrintfFormatString.cpp Thu Aug 22 02:53:21 2013<br>
> @@ -296,8 +296,9 @@ ArgType PrintfSpecifier::getArgType(ASTC<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>
> +        return Ctx.getTargetInfo().getTriple().isArch64Bit()<br>
> +                   ? ArgType(Ctx.LongLongTy, "__int64")<br>
> +                   : ArgType(Ctx.IntTy, "__int32");<br>
>       case LengthModifier::AsPtrDiff:<br>
>         return ArgType(Ctx.getPointerDiffType(), "ptrdiff_t");<br>
>       case LengthModifier::AsAllocate:<br>
> @@ -328,8 +329,8 @@ ArgType PrintfSpecifier::getArgType(ASTC<br>
>         return ArgType(Ctx.getSizeType(), "size_t");<br>
>       case LengthModifier::AsInt3264:<br>
>         return Ctx.getTargetInfo().getTriple().isArch64Bit()<br>
> -                   ? Ctx.UnsignedLongLongTy<br>
> -                   : Ctx.UnsignedIntTy;<br>
> +                   ? ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64")<br>
> +                   : ArgType(Ctx.UnsignedIntTy, "unsigned __int32");<br>
>       case LengthModifier::AsPtrDiff:<br>
>         // FIXME: How to get the corresponding unsigned<br>
>         // version of ptrdiff_t?<br>
><br>
> Modified: 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=188992&r1=188991&r2=188992&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings-ms.c?rev=188992&r1=188991&r2=188992&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Sema/format-strings-ms.c (original)<br>
> +++ cfe/trunk/test/Sema/format-strings-ms.c Thu Aug 22 02:53:21 2013<br>
> @@ -2,8 +2,24 @@<br>
><br>
> int printf(const char *format, ...) __attribute__((format(printf, 1, 2)));<br>
><br>
> -void test() {<br>
> +void unsigned_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>
> +  long long bigval = 30;<br>
> +  printf("val = %I32d\n", bigval); // expected-warning{{'I32' length modifier is not supported by ISO C}} \<br>
> +                                   // expected-warning{{format specifies type '__int32' (aka 'int') but the argument has type 'long long'}}<br>
> +  printf("val = %Id\n", bigval); // expected-warning{{'I' length modifier is not supported by ISO C}} \<br>
> +                                 // expected-warning{{format specifies type '__int32' (aka 'int') but the argument has type 'long long'}}<br>
> +}<br>
> +<br>
> +void signed_test() {<br>
> +  unsigned short val = 30;<br>
> +  printf("val = %I64u\n", val); // expected-warning{{'I64' length modifier is not supported by ISO C}} \<br>
> +                                // expected-warning{{format specifies type 'unsigned __int64' (aka 'unsigned long long') but the argument has type 'unsigned short'}}<br>
> +  unsigned long long bigval = 30;<br>
> +  printf("val = %I32u\n", bigval); // expected-warning{{'I32' length modifier is not supported by ISO C}} \<br>
> +                                   // expected-warning{{format specifies type 'unsigned __int32' (aka 'unsigned int') but the argument has type 'unsigned long long'}}<br>
> +  printf("val = %Iu\n", bigval); // expected-warning{{'I' length modifier is not supported by ISO C}} \<br>
> +                                 // expected-warning{{format specifies type 'unsigned __int32' (aka 'unsigned int') but the argument has type 'unsigned long long'}}<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>
</blockquote></div><br></body></html>