>From http://msdn.microsoft.com/en-us/library/tcxf1dw6(v=vs.120).aspx
"ptrdiff_t (that is, __int32 on 32-bit platforms, __int64 on 64-bit platforms) size_t (that is, unsigned __int32 on 32-bit platforms, unsigned __int64 on 64-bit platforms)" On Thu, Aug 22, 2013 at 9:06 AM, Jordan Rose <[email protected]> wrote: > 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? > > > On Aug 22, 2013, at 0:53 , David Majnemer <[email protected]> > wrote: > > > Author: majnemer > > Date: Thu Aug 22 02:53:21 2013 > > New Revision: 188992 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=188992&view=rev > > Log: > > Analysis: Make %I in printf more reasonable, add more tests > > > > Modified: > > cfe/trunk/lib/Analysis/PrintfFormatString.cpp > > cfe/trunk/test/Sema/format-strings-ms.c > > > > Modified: cfe/trunk/lib/Analysis/PrintfFormatString.cpp > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PrintfFormatString.cpp?rev=188992&r1=188991&r2=188992&view=diff > > > ============================================================================== > > --- cfe/trunk/lib/Analysis/PrintfFormatString.cpp (original) > > +++ cfe/trunk/lib/Analysis/PrintfFormatString.cpp Thu Aug 22 02:53:21 > 2013 > > @@ -296,8 +296,9 @@ ArgType PrintfSpecifier::getArgType(ASTC > > // FIXME: How to get the corresponding signed version of size_t? > > return ArgType(); > > case LengthModifier::AsInt3264: > > - return Ctx.getTargetInfo().getTriple().isArch64Bit() ? > Ctx.LongLongTy > > - : > Ctx.IntTy; > > + return Ctx.getTargetInfo().getTriple().isArch64Bit() > > + ? ArgType(Ctx.LongLongTy, "__int64") > > + : ArgType(Ctx.IntTy, "__int32"); > > case LengthModifier::AsPtrDiff: > > return ArgType(Ctx.getPointerDiffType(), "ptrdiff_t"); > > case LengthModifier::AsAllocate: > > @@ -328,8 +329,8 @@ ArgType PrintfSpecifier::getArgType(ASTC > > return ArgType(Ctx.getSizeType(), "size_t"); > > case LengthModifier::AsInt3264: > > return Ctx.getTargetInfo().getTriple().isArch64Bit() > > - ? Ctx.UnsignedLongLongTy > > - : Ctx.UnsignedIntTy; > > + ? ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64") > > + : ArgType(Ctx.UnsignedIntTy, "unsigned __int32"); > > case LengthModifier::AsPtrDiff: > > // FIXME: How to get the corresponding unsigned > > // version of ptrdiff_t? > > > > Modified: cfe/trunk/test/Sema/format-strings-ms.c > > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings-ms.c?rev=188992&r1=188991&r2=188992&view=diff > > > ============================================================================== > > --- cfe/trunk/test/Sema/format-strings-ms.c (original) > > +++ cfe/trunk/test/Sema/format-strings-ms.c Thu Aug 22 02:53:21 2013 > > @@ -2,8 +2,24 @@ > > > > int printf(const char *format, ...) __attribute__((format(printf, 1, > 2))); > > > > -void test() { > > +void unsigned_test() { > > short val = 30; > > printf("val = %I64d\n", val); // expected-warning{{'I64' length > modifier is not supported by ISO C}} \ > > // expected-warning{{format specifies > type '__int64' (aka 'long long') but the argument has type 'short'}} > > + long long bigval = 30; > > + printf("val = %I32d\n", bigval); // expected-warning{{'I32' length > modifier is not supported by ISO C}} \ > > + // expected-warning{{format > specifies type '__int32' (aka 'int') but the argument has type 'long long'}} > > + printf("val = %Id\n", bigval); // expected-warning{{'I' length > modifier is not supported by ISO C}} \ > > + // expected-warning{{format specifies > type '__int32' (aka 'int') but the argument has type 'long long'}} > > +} > > + > > +void signed_test() { > > + unsigned short val = 30; > > + printf("val = %I64u\n", val); // expected-warning{{'I64' length > modifier is not supported by ISO C}} \ > > + // expected-warning{{format specifies > type 'unsigned __int64' (aka 'unsigned long long') but the argument has > type 'unsigned short'}} > > + unsigned long long bigval = 30; > > + printf("val = %I32u\n", bigval); // expected-warning{{'I32' length > modifier is not supported by ISO C}} \ > > + // expected-warning{{format > specifies type 'unsigned __int32' (aka 'unsigned int') but the argument has > type 'unsigned long long'}} > > + printf("val = %Iu\n", bigval); // expected-warning{{'I' length > modifier is not supported by ISO C}} \ > > + // expected-warning{{format specifies > type 'unsigned __int32' (aka 'unsigned int') but the argument has type > 'unsigned long long'}} > > } > > > > > > _______________________________________________ > > cfe-commits mailing list > > [email protected] > > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
