Go to the documentation of this file.
18 #ifndef LLVM_CLANG_AST_FORMATSTRING_H
19 #define LLVM_CLANG_AST_FORMATSTRING_H
29 namespace analyze_format_string {
36 : representation(Representation), flag(
false) {}
37 bool isSet()
const {
return flag; }
38 void set() { flag =
true; }
43 this->position = position;
49 const char *
toString()
const {
return representation; }
52 explicit operator bool()
const {
return flag; }
58 const char *representation;
88 : Position(nullptr), kind(
None) {}
90 : Position(pos), kind(k) {}
117 const char *Position;
273 const char *Name =
nullptr;
278 enum class TypeKind { DontCare, SizeT, PtrdiffT };
279 TypeKind TK = TypeKind::DontCare;
289 bool isSizeT()
const {
return TK == TypeKind::SizeT; }
295 assert(A.K >=
InvalidTy &&
"ArgType cannot be pointer to invalid/unknown");
304 Res.TK = TypeKind::SizeT;
312 Res.TK = TypeKind::PtrdiffT;
331 const char *amountStart,
332 unsigned amountLength,
334 : start(amountStart), length(amountLength), hs(howSpecified), amt(amount),
339 UsesPositionalArg(
false), UsesDotPrefix(
false) {}
342 : start(nullptr), length(0), hs(
Constant), amt(Amount),
343 UsesPositionalArg(
false), UsesDotPrefix(
false) {}
366 return start - UsesDotPrefix;
371 return length + UsesDotPrefix;
376 void toString(raw_ostream &os)
const;
392 bool UsesPositionalArg : 1;
475 namespace analyze_printf {
519 IsLeftJustified(
"-"), HasPlusPrefix(
"+"), HasSpacePrefix(
" "),
520 HasAlternativeForm(
"#"), HasLeadingZeroes(
"0"),
521 HasObjCTechnicalTerm(
"tt"), IsPrivate(
"private"), IsPublic(
"public"),
522 IsSensitive(
"sensitive") {}
561 return cast<PrintfConversionSpecifier>(
CS);
585 return HasThousandsGrouping;
607 void toString(raw_ostream &os)
const;
625 namespace analyze_scanf {
651 SuppressAssignment(
"*") {}
658 return SuppressAssignment;
666 return cast<ScanfConversionSpecifier>(
CS);
678 void toString(raw_ostream &os)
const;
688 namespace analyze_format_string {
707 unsigned specifierLen) {}
710 unsigned flagsLen) {}
716 const char *flagsEnd,
717 const char *conversionPosition) {}
722 const char *startSpecifier,
723 unsigned specifierLen) {
728 const char *startSpecifier,
729 unsigned specifierLen,
741 const char *startSpecifier,
742 unsigned specifierLen) {
747 const char *startSpecifier,
748 unsigned specifierLen) {
756 const char *beg,
const char *end,
const LangOptions &LO,
757 const TargetInfo &Target,
bool isFreeBSDKPrintf);
763 const char *beg,
const char *end,
const LangOptions &LO,
ScanfConversionSpecifier(const char *pos, Kind k)
const OptionalFlag & hasAlternativeForm() const
void setUsesPositionalArg()
void setHasThousandsGrouping(const char *position)
ScanfConversionSpecifier()
const OptionalFlag & hasLeadingZeros() const
const OptionalFlag & isPrivate() const
void setConversionSpecifier(const PrintfConversionSpecifier &cs)
bool fixType(QualType QT, QualType RawQT, const LangOptions &LangOpt, ASTContext &Ctx)
static bool classof(const analyze_format_string::ConversionSpecifier *CS)
void setIsPrivate(const char *position)
void setIsLeftJustified(const char *position)
void setConversionSpecifier(const ScanfConversionSpecifier &cs)
void setIsPublic(const char *position)
A (possibly-)qualified type.
bool hasValidPrecision() const
Exposes information about the current target.
void setMaskType(StringRef S)
static bool classof(const analyze_format_string::ConversionSpecifier *CS)
void setSuppressAssignment(const char *position)
bool hasValidLeadingZeros() const
bool hasValidPlusPrefix() const
bool hasValidThousandsGroupingPrefix() const
const OptionalFlag & isSensitive() const
const OptionalFlag & getSuppressAssignment() const
bool fixType(QualType QT, const LangOptions &LangOpt, ASTContext &Ctx, bool IsObjCLiteral)
Changes the specifier and length according to a QualType, retaining any flags or options.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
void setHasPlusPrefix(const char *position)
bool hasValidSpacePrefix() const
const PrintfConversionSpecifier & getConversionSpecifier() const
StringRef getMaskType() const
bool hasValidAlternativeForm() const
void setHasAlternativeForm(const char *position)
const OptionalFlag & isLeftJustified() const
bool consumesDataArgument() const
void toString(raw_ostream &os) const
bool hasValidFieldWidth() const
void setHasObjCTechnicalTerm(const char *position)
PrintfConversionSpecifier()
ArgType getArgType(ASTContext &Ctx, bool IsObjCLiteral) const
Returns the builtin type that a data argument paired with this format specifier should have.
const OptionalFlag & hasPlusPrefix() const
const OptionalAmount & getPrecision() const
void toString(raw_ostream &os) const
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool hasValidLeftJustified() const
const OptionalFlag & hasThousandsGrouping() const
const OptionalFlag & hasSpacePrefix() const
bool usesPositionalArg() const
static ScanfSpecifier Parse(const char *beg, const char *end)
bool consumesDataArgument() const
const OptionalFlag & isPublic() const
const ScanfConversionSpecifier & getConversionSpecifier() const
const OptionalFlag & hasObjCTechnicalTerm() const
void setPrecision(const OptionalAmount &Amt)
PrintfConversionSpecifier(const char *pos, Kind k)
static PrintfSpecifier Parse(const char *beg, const char *end)
void setIsSensitive(const char *position)
void setHasSpacePrefix(const char *position)
void setHasLeadingZeros(const char *position)
ArgType getArgType(ASTContext &Ctx) const