18#include "llvm/Support/Regex.h"
39 const char *Start,
const char *&Beg,
const char *
E,
42 FS.setPrecision(ParseNonPositionAmount(Beg,
E, *argIndex));
54 const char *FlagBeg,
const char *
E,
bool Warn) {
55 StringRef Flag(FlagBeg,
E - FlagBeg);
58 FS.setHasObjCTechnicalTerm(FlagBeg);
78 bool isFreeBSDKPrintf) {
84 const char *Start =
nullptr;
85 UpdateOnReturn <const char*> UpdateBeg(Beg, I);
88 for ( ; I !=
E ; ++I) {
113 if (ParseArgPosition(H, FS, Start, I,
E))
125 unsigned char PrivacyFlags = 0;
126 StringRef MatchedStr;
129 StringRef Str(I,
E - I);
130 std::string
Match =
"^[[:space:]]*"
131 "(private|public|sensitive|mask\\.[^[:space:],}]*)"
133 llvm::Regex R(
Match);
136 if (R.match(Str, &Matches)) {
137 MatchedStr = Matches[1];
138 I += Matches[0].size();
143 if (MatchedStr.starts_with(
"mask")) {
144 StringRef MaskType = MatchedStr.substr(
sizeof(
"mask.") - 1);
145 unsigned Size = MaskType.size();
146 if (Warn && (Size == 0 || Size > 8))
148 FS.setMaskType(MaskType);
149 }
else if (MatchedStr ==
"sensitive")
151 else if (PrivacyFlags !=
153 MatchedStr ==
"private")
155 else if (PrivacyFlags == 0 && MatchedStr ==
"public")
158 size_t CommaOrBracePos =
159 Str.find_if([](
char c) {
return c ==
',' ||
c ==
'}'; });
161 if (CommaOrBracePos == StringRef::npos) {
168 I += CommaOrBracePos + 1;
171 }
while (*(I - 1) ==
',');
174 switch (PrivacyFlags) {
178 FS.setIsPrivate(MatchedStr.data());
181 FS.setIsPublic(MatchedStr.data());
184 FS.setIsSensitive(MatchedStr.data());
187 llvm_unreachable(
"Unexpected privacy flag value");
193 for ( ; I !=
E; ++I) {
195 default: hasMore =
false;
break;
198 FS.setHasThousandsGrouping(I);
200 case '-': FS.setIsLeftJustified(I);
break;
201 case '+': FS.setHasPlusPrefix(I);
break;
202 case ' ': FS.setHasSpacePrefix(I);
break;
203 case '#': FS.setHasAlternativeForm(I);
break;
204 case '0': FS.setHasLeadingZeros(I);
break;
218 if (ParseFieldWidth(H, FS, Start, I,
E,
219 FS.usesPositionalArg() ?
nullptr : &argIndex))
239 FS.usesPositionalArg() ?
nullptr : &argIndex))
250 if (ParseVectorModifier(H, FS, I,
E, LO))
254 if (ParseLengthModifier(FS, I,
E, LO) && I ==
E) {
267 const char *ObjCModifierFlagsStart =
nullptr,
268 *ObjCModifierFlagsEnd =
nullptr;
270 ObjCModifierFlagsStart = I;
274 ObjCModifierFlagsEnd = I;
300 const char *conversionPosition = I++;
302 switch (*conversionPosition) {
331 if (isFreeBSDKPrintf)
349 if (isFreeBSDKPrintf)
351 else if (LO.FixedPoint)
355 if (isFreeBSDKPrintf)
360 if (isFreeBSDKPrintf)
362 else if (
Target.getTriple().isOSDarwin())
366 if (
Target.getTriple().isOSDarwin())
370 if (
Target.getTriple().isOSDarwin())
375 if (
Target.getTriple().isOSMSVCRT())
398 ObjCModifierFlagsStart) {
400 ObjCModifierFlagsEnd + 1,
406 FS.setConversionSpecifier(CS);
408 FS.setArgIndex(argIndex++);
415 unsigned Len = I - Start;
416 if (ParseUTF8InvalidSpecifier(Start,
E, Len)) {
418 FS.setConversionSpecifier(CS);
431 bool isFreeBSDKPrintf) {
433 unsigned argIndex = 0;
453 assert(I ==
E &&
"Format string not exhausted");
462 unsigned argIndex = 0;
489 unsigned ArgIndex = 0;
492 while (
Begin != End) {
508 bool IsObjCLiteral)
const {
509 if (
CS.
getKind() == ConversionSpecifier::cArg)
551 :
ArgType(Ctx.IntTy,
"__int32");
586 :
ArgType(Ctx.UnsignedIntTy,
"unsigned __int32");
614 if (
CS.
getKind() == ConversionSpecifier::nArg) {
645 llvm_unreachable(
"only used for OpenCL which doesn not handle nArg");
653 case ConversionSpecifier::sArg:
663 case ConversionSpecifier::SArg:
671 case ConversionSpecifier::CArg:
678 case ConversionSpecifier::pArg:
679 case ConversionSpecifier::PArg:
681 case ConversionSpecifier::ObjCObjArg:
683 case ConversionSpecifier::kArg:
694 case ConversionSpecifier::KArg:
705 case ConversionSpecifier::rArg:
716 case ConversionSpecifier::RArg:
737 bool IsObjCLiteral)
const {
743 ArgType ScalarTy = getScalarArgType(Ctx, IsObjCLiteral);
753 if (
CS.
getKind() == ConversionSpecifier::nArg)
764 CS.
setKind(ConversionSpecifier::ObjCObjArg);
767 HasThousandsGrouping =
false;
768 HasPlusPrefix =
false;
769 HasSpacePrefix =
false;
770 HasAlternativeForm =
false;
771 HasLeadingZeroes =
false;
783 HasAlternativeForm =
false;
784 HasLeadingZeroes =
false;
797 QT = ED->getIntegerType();
815 case BuiltinType::Bool:
816 case BuiltinType::WChar_U:
817 case BuiltinType::WChar_S:
818 case BuiltinType::Char8:
819 case BuiltinType::Char16:
820 case BuiltinType::Char32:
821 case BuiltinType::UInt128:
822 case BuiltinType::Int128:
823 case BuiltinType::Half:
824 case BuiltinType::BFloat16:
825 case BuiltinType::Float16:
826 case BuiltinType::Float128:
827 case BuiltinType::Ibm128:
828 case BuiltinType::ShortAccum:
829 case BuiltinType::Accum:
830 case BuiltinType::LongAccum:
831 case BuiltinType::UShortAccum:
832 case BuiltinType::UAccum:
833 case BuiltinType::ULongAccum:
834 case BuiltinType::ShortFract:
835 case BuiltinType::Fract:
836 case BuiltinType::LongFract:
837 case BuiltinType::UShortFract:
838 case BuiltinType::UFract:
839 case BuiltinType::ULongFract:
840 case BuiltinType::SatShortAccum:
841 case BuiltinType::SatAccum:
842 case BuiltinType::SatLongAccum:
843 case BuiltinType::SatUShortAccum:
844 case BuiltinType::SatUAccum:
845 case BuiltinType::SatULongAccum:
846 case BuiltinType::SatShortFract:
847 case BuiltinType::SatFract:
848 case BuiltinType::SatLongFract:
849 case BuiltinType::SatUShortFract:
850 case BuiltinType::SatUFract:
851 case BuiltinType::SatULongFract:
855#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
856 case BuiltinType::Id:
857#include "clang/Basic/OpenCLImageTypes.def"
858#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
859 case BuiltinType::Id:
860#include "clang/Basic/OpenCLExtensionTypes.def"
861#define SVE_TYPE(Name, Id, SingletonId) \
862 case BuiltinType::Id:
863#include "clang/Basic/AArch64ACLETypes.def"
864#define PPC_VECTOR_TYPE(Name, Id, Size) \
865 case BuiltinType::Id:
866#include "clang/Basic/PPCTypes.def"
867#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
868#include "clang/Basic/RISCVVTypes.def"
869#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
870#include "clang/Basic/WebAssemblyReferenceTypes.def"
871#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
872#include "clang/Basic/AMDGPUTypes.def"
873#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
874#include "clang/Basic/HLSLIntangibleTypes.def"
875#define SIGNED_TYPE(Id, SingletonId)
876#define UNSIGNED_TYPE(Id, SingletonId)
877#define FLOATING_TYPE(Id, SingletonId)
878#define BUILTIN_TYPE(Id, SingletonId) \
879 case BuiltinType::Id:
880#include "clang/AST/BuiltinTypes.def"
884 case BuiltinType::UInt:
885 case BuiltinType::Int:
886 case BuiltinType::Float:
890 case BuiltinType::Double:
894 case BuiltinType::Char_U:
895 case BuiltinType::UChar:
896 case BuiltinType::Char_S:
897 case BuiltinType::SChar:
901 case BuiltinType::Short:
902 case BuiltinType::UShort:
906 case BuiltinType::Long:
907 case BuiltinType::ULong:
911 case BuiltinType::LongLong:
912 case BuiltinType::ULongLong:
916 case BuiltinType::LongDouble:
922 if (LangOpt.C99 || LangOpt.CPlusPlus11)
929 case ConversionSpecifier::uArg:
930 case ConversionSpecifier::UArg:
934 case ConversionSpecifier::dArg:
935 case ConversionSpecifier::DArg:
936 case ConversionSpecifier::iArg:
956 HasAlternativeForm =
false;
957 HasLeadingZeroes =
false;
958 HasPlusPrefix =
false;
965 HasAlternativeForm =
false;
968 HasAlternativeForm =
false;
969 HasPlusPrefix =
false;
971 llvm_unreachable(
"Unexpected type");
988 if (IsLeftJustified) os <<
"-";
989 if (HasPlusPrefix) os <<
"+";
990 if (HasSpacePrefix) os <<
" ";
991 if (HasAlternativeForm) os <<
"#";
992 if (HasLeadingZeroes) os <<
"0";
1015 case ConversionSpecifier::dArg:
1016 case ConversionSpecifier::DArg:
1017 case ConversionSpecifier::iArg:
1018 case ConversionSpecifier::fArg:
1019 case ConversionSpecifier::FArg:
1020 case ConversionSpecifier::eArg:
1021 case ConversionSpecifier::EArg:
1022 case ConversionSpecifier::gArg:
1023 case ConversionSpecifier::GArg:
1024 case ConversionSpecifier::aArg:
1025 case ConversionSpecifier::AArg:
1026 case ConversionSpecifier::FreeBSDrArg:
1027 case ConversionSpecifier::FreeBSDyArg:
1028 case ConversionSpecifier::rArg:
1029 case ConversionSpecifier::kArg:
1038 if (!HasAlternativeForm)
1043 case ConversionSpecifier::bArg:
1044 case ConversionSpecifier::BArg:
1045 case ConversionSpecifier::oArg:
1046 case ConversionSpecifier::OArg:
1047 case ConversionSpecifier::xArg:
1048 case ConversionSpecifier::XArg:
1049 case ConversionSpecifier::aArg:
1050 case ConversionSpecifier::AArg:
1051 case ConversionSpecifier::eArg:
1052 case ConversionSpecifier::EArg:
1053 case ConversionSpecifier::fArg:
1054 case ConversionSpecifier::FArg:
1055 case ConversionSpecifier::gArg:
1056 case ConversionSpecifier::GArg:
1057 case ConversionSpecifier::FreeBSDrArg:
1058 case ConversionSpecifier::FreeBSDyArg:
1059 case ConversionSpecifier::rArg:
1060 case ConversionSpecifier::RArg:
1061 case ConversionSpecifier::kArg:
1062 case ConversionSpecifier::KArg:
1071 if (!HasLeadingZeroes)
1076 case ConversionSpecifier::bArg:
1077 case ConversionSpecifier::BArg:
1078 case ConversionSpecifier::dArg:
1079 case ConversionSpecifier::DArg:
1080 case ConversionSpecifier::iArg:
1081 case ConversionSpecifier::oArg:
1082 case ConversionSpecifier::OArg:
1083 case ConversionSpecifier::uArg:
1084 case ConversionSpecifier::UArg:
1085 case ConversionSpecifier::xArg:
1086 case ConversionSpecifier::XArg:
1087 case ConversionSpecifier::aArg:
1088 case ConversionSpecifier::AArg:
1089 case ConversionSpecifier::eArg:
1090 case ConversionSpecifier::EArg:
1091 case ConversionSpecifier::fArg:
1092 case ConversionSpecifier::FArg:
1093 case ConversionSpecifier::gArg:
1094 case ConversionSpecifier::GArg:
1095 case ConversionSpecifier::FreeBSDrArg:
1096 case ConversionSpecifier::FreeBSDyArg:
1097 case ConversionSpecifier::rArg:
1098 case ConversionSpecifier::RArg:
1099 case ConversionSpecifier::kArg:
1100 case ConversionSpecifier::KArg:
1109 if (!HasSpacePrefix)
1114 case ConversionSpecifier::dArg:
1115 case ConversionSpecifier::DArg:
1116 case ConversionSpecifier::iArg:
1117 case ConversionSpecifier::fArg:
1118 case ConversionSpecifier::FArg:
1119 case ConversionSpecifier::eArg:
1120 case ConversionSpecifier::EArg:
1121 case ConversionSpecifier::gArg:
1122 case ConversionSpecifier::GArg:
1123 case ConversionSpecifier::aArg:
1124 case ConversionSpecifier::AArg:
1125 case ConversionSpecifier::FreeBSDrArg:
1126 case ConversionSpecifier::FreeBSDyArg:
1127 case ConversionSpecifier::rArg:
1128 case ConversionSpecifier::kArg:
1137 if (!IsLeftJustified)
1142 case ConversionSpecifier::nArg:
1151 if (!HasThousandsGrouping)
1155 case ConversionSpecifier::dArg:
1156 case ConversionSpecifier::DArg:
1157 case ConversionSpecifier::iArg:
1158 case ConversionSpecifier::uArg:
1159 case ConversionSpecifier::UArg:
1160 case ConversionSpecifier::fArg:
1161 case ConversionSpecifier::FArg:
1162 case ConversionSpecifier::gArg:
1163 case ConversionSpecifier::GArg:
1176 case ConversionSpecifier::bArg:
1177 case ConversionSpecifier::BArg:
1178 case ConversionSpecifier::dArg:
1179 case ConversionSpecifier::DArg:
1180 case ConversionSpecifier::iArg:
1181 case ConversionSpecifier::oArg:
1182 case ConversionSpecifier::OArg:
1183 case ConversionSpecifier::uArg:
1184 case ConversionSpecifier::UArg:
1185 case ConversionSpecifier::xArg:
1186 case ConversionSpecifier::XArg:
1187 case ConversionSpecifier::aArg:
1188 case ConversionSpecifier::AArg:
1189 case ConversionSpecifier::eArg:
1190 case ConversionSpecifier::EArg:
1191 case ConversionSpecifier::fArg:
1192 case ConversionSpecifier::FArg:
1193 case ConversionSpecifier::gArg:
1194 case ConversionSpecifier::GArg:
1195 case ConversionSpecifier::sArg:
1196 case ConversionSpecifier::FreeBSDrArg:
1197 case ConversionSpecifier::FreeBSDyArg:
1198 case ConversionSpecifier::PArg:
1199 case ConversionSpecifier::rArg:
1200 case ConversionSpecifier::RArg:
1201 case ConversionSpecifier::kArg:
1202 case ConversionSpecifier::KArg:
1215 case ConversionSpecifier::nArg:
llvm::MachO::Target Target
__device__ __2f16 float c
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
CanQualType UnsignedShortAccumTy
QualType getUnsignedPointerDiffType() const
Return the unique unsigned counterpart of "ptrdiff_t" integer type.
CanQualType getIntMaxType() const
Return the unique type for "intmax_t" (C99 7.18.1.5), defined in <stdint.h>.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
CanQualType UnsignedLongFractTy
const LangOptions & getLangOpts() const
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
CanQualType UnsignedFractTy
CanQualType UnsignedLongTy
CanQualType UnsignedLongAccumTy
CanQualType UnsignedCharTy
CanQualType UnsignedShortFractTy
CanQualType UnsignedIntTy
CanQualType UnsignedLongLongTy
CanQualType UnsignedShortTy
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
QualType getSignedSizeType() const
Return the unique signed counterpart of the integer type corresponding to size_t.
CanQualType getUIntMaxType() const
Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in <stdint.h>.
CanQualType UnsignedAccumTy
This class is used for builtin types like 'int'.
QualType withConst() const
Retrieves a version of this type with const applied.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
A (possibly-)qualified type.
Exposes information about the current target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isPointerType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isRealFloatingType() const
Floating point categories.
bool isWideCharType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
const T * getAs() const
Member-template getAs<specific type>'.
bool isObjCRetainableType() const
Represents a GCC generic vector type.
unsigned getNumElements() const
QualType getElementType() const
bool hasValidLeftJustified() const
bool hasValidFieldWidth() const
bool hasValidSpacePrefix() const
bool usesPositionalArg() 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.
bool hasValidPrecision() const
bool hasValidLeadingZeros() const
void toString(raw_ostream &os) const
const PrintfConversionSpecifier & getConversionSpecifier() const
bool hasValidThousandsGroupingPrefix() const
ArgType getArgType(ASTContext &Ctx, bool IsObjCLiteral) const
Returns the builtin type that a data argument paired with this format specifier should have.
bool hasValidPlusPrefix() const
bool hasValidAlternativeForm() const
Defines the clang::TargetInfo interface.
Pieces specific to fprintf format strings.
The JSON file list parser is used to communicate input to InstallAPI.
@ Match
This is not an overload because the signature exactly matches an existing declaration.