Analysis: Add support for MS specific printf format specifiers
Summary: Adds support for %I, %I32 and %I64. Reviewers: hans, jordan_rose, rnk, majnemer Reviewed By: majnemer CC: cfe-commits, cdavis5x Differential Revision: http://llvm-reviews.chandlerc.com/D1456 llvm-svn: 188937
This commit is contained in:
@@ -187,8 +187,8 @@ static PrintfSpecifierResult ParsePrintfSpecifier(FormatStringHandler &H,
|
||||
case 'i': k = ConversionSpecifier::iArg; break;
|
||||
case 'n': k = ConversionSpecifier::nArg; break;
|
||||
case 'o': k = ConversionSpecifier::oArg; break;
|
||||
case 'p': k = ConversionSpecifier::pArg; break;
|
||||
case 's': k = ConversionSpecifier::sArg; break;
|
||||
case 'p': k = ConversionSpecifier::pArg; break;
|
||||
case 's': k = ConversionSpecifier::sArg; break;
|
||||
case 'u': k = ConversionSpecifier::uArg; break;
|
||||
case 'x': k = ConversionSpecifier::xArg; break;
|
||||
// POSIX specific.
|
||||
@@ -278,18 +278,26 @@ ArgType PrintfSpecifier::getArgType(ASTContext &Ctx,
|
||||
case LengthModifier::AsLongDouble:
|
||||
// GNU extension.
|
||||
return Ctx.LongLongTy;
|
||||
case LengthModifier::None: return Ctx.IntTy;
|
||||
case LengthModifier::None:
|
||||
return Ctx.IntTy;
|
||||
case LengthModifier::AsInt32:
|
||||
return ArgType(Ctx.IntTy, "__int32");
|
||||
case LengthModifier::AsChar: return ArgType::AnyCharTy;
|
||||
case LengthModifier::AsShort: return Ctx.ShortTy;
|
||||
case LengthModifier::AsLong: return Ctx.LongTy;
|
||||
case LengthModifier::AsLongLong:
|
||||
case LengthModifier::AsQuad:
|
||||
return Ctx.LongLongTy;
|
||||
case LengthModifier::AsInt64:
|
||||
return ArgType(Ctx.LongLongTy, "__int64");
|
||||
case LengthModifier::AsIntMax:
|
||||
return ArgType(Ctx.getIntMaxType(), "intmax_t");
|
||||
case LengthModifier::AsSizeT:
|
||||
// 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;
|
||||
case LengthModifier::AsPtrDiff:
|
||||
return ArgType(Ctx.getPointerDiffType(), "ptrdiff_t");
|
||||
case LengthModifier::AsAllocate:
|
||||
@@ -302,17 +310,26 @@ ArgType PrintfSpecifier::getArgType(ASTContext &Ctx,
|
||||
case LengthModifier::AsLongDouble:
|
||||
// GNU extension.
|
||||
return Ctx.UnsignedLongLongTy;
|
||||
case LengthModifier::None: return Ctx.UnsignedIntTy;
|
||||
case LengthModifier::None:
|
||||
return Ctx.UnsignedIntTy;
|
||||
case LengthModifier::AsInt32:
|
||||
return ArgType(Ctx.UnsignedIntTy, "unsigned __int32");
|
||||
case LengthModifier::AsChar: return Ctx.UnsignedCharTy;
|
||||
case LengthModifier::AsShort: return Ctx.UnsignedShortTy;
|
||||
case LengthModifier::AsLong: return Ctx.UnsignedLongTy;
|
||||
case LengthModifier::AsLongLong:
|
||||
case LengthModifier::AsQuad:
|
||||
return Ctx.UnsignedLongLongTy;
|
||||
case LengthModifier::AsInt64:
|
||||
return ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64");
|
||||
case LengthModifier::AsIntMax:
|
||||
return ArgType(Ctx.getUIntMaxType(), "uintmax_t");
|
||||
case LengthModifier::AsSizeT:
|
||||
return ArgType(Ctx.getSizeType(), "size_t");
|
||||
case LengthModifier::AsInt3264:
|
||||
return Ctx.getTargetInfo().getTriple().isArch64Bit()
|
||||
? Ctx.UnsignedLongLongTy
|
||||
: Ctx.UnsignedIntTy;
|
||||
case LengthModifier::AsPtrDiff:
|
||||
// FIXME: How to get the corresponding unsigned
|
||||
// version of ptrdiff_t?
|
||||
@@ -351,6 +368,9 @@ ArgType PrintfSpecifier::getArgType(ASTContext &Ctx,
|
||||
return ArgType(); // FIXME: Is this a known extension?
|
||||
case LengthModifier::AsAllocate:
|
||||
case LengthModifier::AsMAllocate:
|
||||
case LengthModifier::AsInt32:
|
||||
case LengthModifier::AsInt3264:
|
||||
case LengthModifier::AsInt64:
|
||||
return ArgType::Invalid();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user