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
