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.startswith(
"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.equals(
"sensitive"))
151 else if (PrivacyFlags !=
153 MatchedStr.equals(
"private"))
155 else if (PrivacyFlags == 0 && MatchedStr.equals(
"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)
353 if (isFreeBSDKPrintf)
358 if (isFreeBSDKPrintf)
360 else if (
Target.getTriple().isOSDarwin())
364 if (
Target.getTriple().isOSDarwin())
368 if (
Target.getTriple().isOSDarwin())
373 if (
Target.getTriple().isOSMSVCRT())
382 ObjCModifierFlagsStart) {
384 ObjCModifierFlagsEnd + 1,
390 FS.setConversionSpecifier(CS);
392 FS.setArgIndex(argIndex++);
399 unsigned Len = I - Start;
400 if (ParseUTF8InvalidSpecifier(Start, E, Len)) {
402 FS.setConversionSpecifier(CS);
415 bool isFreeBSDKPrintf) {
417 unsigned argIndex = 0;
437 assert(I == E &&
"Format string not exhausted");
446 unsigned argIndex = 0;
473 unsigned ArgIndex = 0;
476 while (
Begin != End) {
492 bool IsObjCLiteral)
const {
493 if (
CS.
getKind() == ConversionSpecifier::cArg)
534 :
ArgType(Ctx.IntTy,
"__int32");
569 :
ArgType(Ctx.UnsignedIntTy,
"unsigned __int32");
597 if (
CS.
getKind() == ConversionSpecifier::nArg) {
626 llvm_unreachable(
"only used for OpenCL which doesn not handle nArg");
631 case ConversionSpecifier::sArg:
641 case ConversionSpecifier::SArg:
649 case ConversionSpecifier::CArg:
656 case ConversionSpecifier::pArg:
657 case ConversionSpecifier::PArg:
659 case ConversionSpecifier::ObjCObjArg:
671 bool IsObjCLiteral)
const {
677 ArgType ScalarTy = getScalarArgType(Ctx, IsObjCLiteral);
687 if (
CS.
getKind() == ConversionSpecifier::nArg)
698 CS.
setKind(ConversionSpecifier::ObjCObjArg);
701 HasThousandsGrouping =
false;
702 HasPlusPrefix =
false;
703 HasSpacePrefix =
false;
704 HasAlternativeForm =
false;
705 HasLeadingZeroes =
false;
717 HasAlternativeForm =
false;
718 HasLeadingZeroes =
false;
731 QT = ETy->getDecl()->getIntegerType();
749 case BuiltinType::Bool:
750 case BuiltinType::WChar_U:
751 case BuiltinType::WChar_S:
752 case BuiltinType::Char8:
753 case BuiltinType::Char16:
754 case BuiltinType::Char32:
755 case BuiltinType::UInt128:
756 case BuiltinType::Int128:
757 case BuiltinType::Half:
758 case BuiltinType::BFloat16:
759 case BuiltinType::Float16:
760 case BuiltinType::Float128:
761 case BuiltinType::Ibm128:
762 case BuiltinType::ShortAccum:
763 case BuiltinType::Accum:
764 case BuiltinType::LongAccum:
765 case BuiltinType::UShortAccum:
766 case BuiltinType::UAccum:
767 case BuiltinType::ULongAccum:
768 case BuiltinType::ShortFract:
769 case BuiltinType::Fract:
770 case BuiltinType::LongFract:
771 case BuiltinType::UShortFract:
772 case BuiltinType::UFract:
773 case BuiltinType::ULongFract:
774 case BuiltinType::SatShortAccum:
775 case BuiltinType::SatAccum:
776 case BuiltinType::SatLongAccum:
777 case BuiltinType::SatUShortAccum:
778 case BuiltinType::SatUAccum:
779 case BuiltinType::SatULongAccum:
780 case BuiltinType::SatShortFract:
781 case BuiltinType::SatFract:
782 case BuiltinType::SatLongFract:
783 case BuiltinType::SatUShortFract:
784 case BuiltinType::SatUFract:
785 case BuiltinType::SatULongFract:
789#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
790 case BuiltinType::Id:
791#include "clang/Basic/OpenCLImageTypes.def"
792#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
793 case BuiltinType::Id:
794#include "clang/Basic/OpenCLExtensionTypes.def"
795#define SVE_TYPE(Name, Id, SingletonId) \
796 case BuiltinType::Id:
797#include "clang/Basic/AArch64SVEACLETypes.def"
798#define PPC_VECTOR_TYPE(Name, Id, Size) \
799 case BuiltinType::Id:
800#include "clang/Basic/PPCTypes.def"
801#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
802#include "clang/Basic/RISCVVTypes.def"
803#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
804#include "clang/Basic/WebAssemblyReferenceTypes.def"
805#define SIGNED_TYPE(Id, SingletonId)
806#define UNSIGNED_TYPE(Id, SingletonId)
807#define FLOATING_TYPE(Id, SingletonId)
808#define BUILTIN_TYPE(Id, SingletonId) \
809 case BuiltinType::Id:
810#include "clang/AST/BuiltinTypes.def"
814 case BuiltinType::UInt:
815 case BuiltinType::Int:
816 case BuiltinType::Float:
820 case BuiltinType::Double:
824 case BuiltinType::Char_U:
825 case BuiltinType::UChar:
826 case BuiltinType::Char_S:
827 case BuiltinType::SChar:
831 case BuiltinType::Short:
832 case BuiltinType::UShort:
836 case BuiltinType::Long:
837 case BuiltinType::ULong:
841 case BuiltinType::LongLong:
842 case BuiltinType::ULongLong:
846 case BuiltinType::LongDouble:
852 if (LangOpt.C99 || LangOpt.CPlusPlus11)
859 case ConversionSpecifier::uArg:
860 case ConversionSpecifier::UArg:
864 case ConversionSpecifier::dArg:
865 case ConversionSpecifier::DArg:
866 case ConversionSpecifier::iArg:
886 HasAlternativeForm =
false;
887 HasLeadingZeroes =
false;
888 HasPlusPrefix =
false;
895 HasAlternativeForm =
false;
898 HasAlternativeForm =
false;
899 HasPlusPrefix =
false;
901 llvm_unreachable(
"Unexpected type");
918 if (IsLeftJustified) os <<
"-";
919 if (HasPlusPrefix) os <<
"+";
920 if (HasSpacePrefix) os <<
" ";
921 if (HasAlternativeForm) os <<
"#";
922 if (HasLeadingZeroes) os <<
"0";
945 case ConversionSpecifier::dArg:
946 case ConversionSpecifier::DArg:
947 case ConversionSpecifier::iArg:
948 case ConversionSpecifier::fArg:
949 case ConversionSpecifier::FArg:
950 case ConversionSpecifier::eArg:
951 case ConversionSpecifier::EArg:
952 case ConversionSpecifier::gArg:
953 case ConversionSpecifier::GArg:
954 case ConversionSpecifier::aArg:
955 case ConversionSpecifier::AArg:
956 case ConversionSpecifier::FreeBSDrArg:
957 case ConversionSpecifier::FreeBSDyArg:
966 if (!HasAlternativeForm)
971 case ConversionSpecifier::bArg:
972 case ConversionSpecifier::BArg:
973 case ConversionSpecifier::oArg:
974 case ConversionSpecifier::OArg:
975 case ConversionSpecifier::xArg:
976 case ConversionSpecifier::XArg:
977 case ConversionSpecifier::aArg:
978 case ConversionSpecifier::AArg:
979 case ConversionSpecifier::eArg:
980 case ConversionSpecifier::EArg:
981 case ConversionSpecifier::fArg:
982 case ConversionSpecifier::FArg:
983 case ConversionSpecifier::gArg:
984 case ConversionSpecifier::GArg:
985 case ConversionSpecifier::FreeBSDrArg:
986 case ConversionSpecifier::FreeBSDyArg:
995 if (!HasLeadingZeroes)
1000 case ConversionSpecifier::bArg:
1001 case ConversionSpecifier::BArg:
1002 case ConversionSpecifier::dArg:
1003 case ConversionSpecifier::DArg:
1004 case ConversionSpecifier::iArg:
1005 case ConversionSpecifier::oArg:
1006 case ConversionSpecifier::OArg:
1007 case ConversionSpecifier::uArg:
1008 case ConversionSpecifier::UArg:
1009 case ConversionSpecifier::xArg:
1010 case ConversionSpecifier::XArg:
1011 case ConversionSpecifier::aArg:
1012 case ConversionSpecifier::AArg:
1013 case ConversionSpecifier::eArg:
1014 case ConversionSpecifier::EArg:
1015 case ConversionSpecifier::fArg:
1016 case ConversionSpecifier::FArg:
1017 case ConversionSpecifier::gArg:
1018 case ConversionSpecifier::GArg:
1019 case ConversionSpecifier::FreeBSDrArg:
1020 case ConversionSpecifier::FreeBSDyArg:
1029 if (!HasSpacePrefix)
1034 case ConversionSpecifier::dArg:
1035 case ConversionSpecifier::DArg:
1036 case ConversionSpecifier::iArg:
1037 case ConversionSpecifier::fArg:
1038 case ConversionSpecifier::FArg:
1039 case ConversionSpecifier::eArg:
1040 case ConversionSpecifier::EArg:
1041 case ConversionSpecifier::gArg:
1042 case ConversionSpecifier::GArg:
1043 case ConversionSpecifier::aArg:
1044 case ConversionSpecifier::AArg:
1045 case ConversionSpecifier::FreeBSDrArg:
1046 case ConversionSpecifier::FreeBSDyArg:
1055 if (!IsLeftJustified)
1060 case ConversionSpecifier::nArg:
1069 if (!HasThousandsGrouping)
1073 case ConversionSpecifier::dArg:
1074 case ConversionSpecifier::DArg:
1075 case ConversionSpecifier::iArg:
1076 case ConversionSpecifier::uArg:
1077 case ConversionSpecifier::UArg:
1078 case ConversionSpecifier::fArg:
1079 case ConversionSpecifier::FArg:
1080 case ConversionSpecifier::gArg:
1081 case ConversionSpecifier::GArg:
1094 case ConversionSpecifier::bArg:
1095 case ConversionSpecifier::BArg:
1096 case ConversionSpecifier::dArg:
1097 case ConversionSpecifier::DArg:
1098 case ConversionSpecifier::iArg:
1099 case ConversionSpecifier::oArg:
1100 case ConversionSpecifier::OArg:
1101 case ConversionSpecifier::uArg:
1102 case ConversionSpecifier::UArg:
1103 case ConversionSpecifier::xArg:
1104 case ConversionSpecifier::XArg:
1105 case ConversionSpecifier::aArg:
1106 case ConversionSpecifier::AArg:
1107 case ConversionSpecifier::eArg:
1108 case ConversionSpecifier::EArg:
1109 case ConversionSpecifier::fArg:
1110 case ConversionSpecifier::FArg:
1111 case ConversionSpecifier::gArg:
1112 case ConversionSpecifier::GArg:
1113 case ConversionSpecifier::sArg:
1114 case ConversionSpecifier::FreeBSDrArg:
1115 case ConversionSpecifier::FreeBSDyArg:
1116 case ConversionSpecifier::PArg:
1129 case ConversionSpecifier::nArg:
__device__ __2f16 float c
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
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.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
CanQualType UnsignedLongTy
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
CanQualType UnsignedLongLongTy
CanQualType UnsignedShortTy
const TargetInfo & getTargetInfo() const
CanQualType 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>.
This class is used for builtin types like 'int'.
QualType withConst() const
Retrieves a version of this type with const applied.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
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.
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.