47#include "llvm/ADT/ArrayRef.h"
48#include "llvm/ADT/STLForwardCompat.h"
49#include "llvm/ADT/StringExtras.h"
50#include "llvm/IR/DerivedTypes.h"
51#include "llvm/Support/ErrorHandling.h"
85 bool useExpansionLoc =
true;
86 switch (
attr.getKind()) {
87 case ParsedAttr::AT_ObjCGC:
90 case ParsedAttr::AT_ObjCOwnership:
96 useExpansionLoc =
false;
101 StringRef name =
attr.getAttrName()->getName();
105 attr.isArgIdent(0) ?
attr.getArgAsIdent(0)->getIdentifierInfo() :
nullptr;
106 if (useExpansionLoc && loc.
isMacroID() && II) {
107 if (II->
isStr(
"strong")) {
109 }
else if (II->
isStr(
"weak")) {
114 S.
Diag(loc,
attr.isRegularKeywordAttribute()
115 ? diag::err_type_attribute_wrong_type
116 : diag::warn_type_attribute_wrong_type)
117 << name << WhichType <<
type;
122#define OBJC_POINTER_TYPE_ATTRS_CASELIST \
123 case ParsedAttr::AT_ObjCGC: \
124 case ParsedAttr::AT_ObjCOwnership
127#define CALLING_CONV_ATTRS_CASELIST \
128 case ParsedAttr::AT_CDecl: \
129 case ParsedAttr::AT_FastCall: \
130 case ParsedAttr::AT_StdCall: \
131 case ParsedAttr::AT_ThisCall: \
132 case ParsedAttr::AT_RegCall: \
133 case ParsedAttr::AT_Pascal: \
134 case ParsedAttr::AT_SwiftCall: \
135 case ParsedAttr::AT_SwiftAsyncCall: \
136 case ParsedAttr::AT_VectorCall: \
137 case ParsedAttr::AT_AArch64VectorPcs: \
138 case ParsedAttr::AT_AArch64SVEPcs: \
139 case ParsedAttr::AT_MSABI: \
140 case ParsedAttr::AT_SysVABI: \
141 case ParsedAttr::AT_Pcs: \
142 case ParsedAttr::AT_IntelOclBicc: \
143 case ParsedAttr::AT_PreserveMost: \
144 case ParsedAttr::AT_PreserveAll: \
145 case ParsedAttr::AT_M68kRTD: \
146 case ParsedAttr::AT_PreserveNone: \
147 case ParsedAttr::AT_RISCVVectorCC: \
148 case ParsedAttr::AT_RISCVVLSCC
151#define FUNCTION_TYPE_ATTRS_CASELIST \
152 case ParsedAttr::AT_NSReturnsRetained: \
153 case ParsedAttr::AT_NoReturn: \
154 case ParsedAttr::AT_NonBlocking: \
155 case ParsedAttr::AT_NonAllocating: \
156 case ParsedAttr::AT_Blocking: \
157 case ParsedAttr::AT_Allocating: \
158 case ParsedAttr::AT_Regparm: \
159 case ParsedAttr::AT_CFIUncheckedCallee: \
160 case ParsedAttr::AT_CFISalt: \
161 case ParsedAttr::AT_CmseNSCall: \
162 case ParsedAttr::AT_ArmStreaming: \
163 case ParsedAttr::AT_ArmStreamingCompatible: \
164 case ParsedAttr::AT_ArmPreserves: \
165 case ParsedAttr::AT_ArmIn: \
166 case ParsedAttr::AT_ArmOut: \
167 case ParsedAttr::AT_ArmInOut: \
168 case ParsedAttr::AT_ArmAgnostic: \
169 case ParsedAttr::AT_AnyX86NoCallerSavedRegisters: \
170 case ParsedAttr::AT_AnyX86NoCfCheck: \
171 CALLING_CONV_ATTRS_CASELIST
174#define MS_TYPE_ATTRS_CASELIST \
175 case ParsedAttr::AT_Ptr32: \
176 case ParsedAttr::AT_Ptr64: \
177 case ParsedAttr::AT_SPtr: \
178 case ParsedAttr::AT_UPtr
181#define NULLABILITY_TYPE_ATTRS_CASELIST \
182 case ParsedAttr::AT_TypeNonNull: \
183 case ParsedAttr::AT_TypeNullable: \
184 case ParsedAttr::AT_TypeNullableResult: \
185 case ParsedAttr::AT_TypeNullUnspecified
190 class TypeProcessingState {
214 using TypeAttrPair = std::pair<const AttributedType*, const Attr*>;
216 bool AttrsForTypesSorted =
true;
220 llvm::DenseMap<const MacroQualifiedType *, SourceLocation> LocsForMacros;
228 bool ParsedHLSLParamMod;
232 :
sema(
sema), declarator(declarator),
234 ParsedHLSLParamMod(
false) {}
236 Sema &getSema()
const {
244 bool isProcessingDeclSpec()
const {
248 unsigned getCurrentChunkIndex()
const {
252 void setCurrentChunkIndex(
unsigned idx) {
258 if (isProcessingDeclSpec())
259 return getMutableDeclSpec().getAttributes();
264 void saveDeclSpecAttrs() {
266 if (!savedAttrs.empty())
269 DeclSpec &spec = getMutableDeclSpec();
270 llvm::append_range(savedAttrs,
277 ignoredTypeAttrs.push_back(&
attr);
283 for (
auto *
Attr : ignoredTypeAttrs)
292 sema.Context.getAttributedType(A, ModifiedType, EquivType);
294 AttrsForTypesSorted =
false;
299 QualType getBTFTagAttributedType(
const BTFTypeTagAttr *BTFAttr,
301 return sema.Context.getBTFTagAttributedType(BTFAttr, WrappedType);
308 QualType T =
sema.ReplaceAutoType(TypeWithAuto, Replacement);
309 if (
auto *AttrTy = TypeWithAuto->
getAs<AttributedType>()) {
312 for (TypeAttrPair &A : AttrsForTypes) {
313 if (A.first == AttrTy)
316 AttrsForTypesSorted =
false;
322 const Attr *takeAttrForAttributedType(
const AttributedType *AT) {
323 if (!AttrsForTypesSorted) {
324 llvm::stable_sort(AttrsForTypes, llvm::less_first());
325 AttrsForTypesSorted =
true;
330 for (
auto It = llvm::partition_point(
332 [=](
const TypeAttrPair &A) {
return A.first < AT; });
333 It != AttrsForTypes.end() && It->first == AT; ++It) {
335 const Attr *Result = It->second;
336 It->second =
nullptr;
341 llvm_unreachable(
"no Attr* for AttributedType*");
346 auto FoundLoc = LocsForMacros.find(MQT);
347 assert(FoundLoc != LocsForMacros.end() &&
348 "Unable to find macro expansion location for MacroQualifedType");
349 return FoundLoc->second;
354 LocsForMacros[MQT] = Loc;
357 void setParsedNoDeref(
bool parsed) { parsedNoDeref = parsed; }
359 bool didParseNoDeref()
const {
return parsedNoDeref; }
361 void setParsedHLSLParamMod(
bool Parsed) { ParsedHLSLParamMod = Parsed; }
363 bool didParseHLSLParamMod()
const {
return ParsedHLSLParamMod; }
365 ~TypeProcessingState() {
366 if (savedAttrs.empty())
369 getMutableDeclSpec().getAttributes().clearListOnly();
371 getMutableDeclSpec().getAttributes().addAtEnd(AL);
375 DeclSpec &getMutableDeclSpec()
const {
417 if (
attr.getKind() == ParsedAttr::AT_ObjCGC)
419 assert(
attr.getKind() == ParsedAttr::AT_ObjCOwnership);
434 bool onlyBlockPointers) {
440 for (; i != 0; --i) {
442 switch (fnChunk.
Kind) {
458 for (--i; i != 0; --i) {
460 switch (ptrChunk.
Kind) {
470 if (onlyBlockPointers)
479 llvm_unreachable(
"bad declarator chunk kind");
485 llvm_unreachable(
"bad declarator chunk kind");
502 Declarator &declarator = state.getDeclarator();
505 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
507 switch (chunk.
Kind) {
513 if (state.isProcessingDeclSpec() &&
514 attr.getKind() == ParsedAttr::AT_ObjCOwnership)
517 if (!destChunk) destChunk = &chunk;
530 if (state.isProcessingDeclSpec() &&
531 attr.getKind() == ParsedAttr::AT_ObjCOwnership) {
558 Declarator &declarator = state.getDeclarator();
562 unsigned innermost = -1U;
563 bool considerDeclSpec =
true;
566 switch (chunk.
Kind) {
580 considerDeclSpec =
false;
588 if (considerDeclSpec) {
593 state.saveDeclSpecAttrs();
602 if (innermost != -1U) {
610 state.addIgnoredTypeAttr(
attr);
619 Declarator &declarator = state.getDeclarator();
623 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
625 switch (chunk.
Kind) {
652 Declarator &declarator = state.getDeclarator();
672 state.saveDeclSpecAttrs();
676 state,
attr, state.getCurrentAttributes(), declSpecType, CFT))
681 state.addIgnoredTypeAttr(
attr);
692 Declarator &declarator = state.getDeclarator();
702 state.addIgnoredTypeAttr(
attr);
727 if (
attr.isStandardAttributeSyntax() ||
attr.isRegularKeywordAttribute())
730 switch (
attr.getKind()) {
747 case ParsedAttr::AT_ObjCKindOf:
760 Declarator &declarator = state.getDeclarator();
806 {}, loc, loc, declarator));
821 typedef std::pair<DeclSpec::TQ, SourceLocation> QualLoc;
826 if (!(RemoveTQs & Qual.first))
830 if (TypeQuals & Qual.first)
831 S.
Diag(Qual.second, DiagID)
836 TypeQuals &= ~Qual.first;
850 if (AL.isInvalid() || !AL.isTypeAttr())
853 diag::warn_block_literal_attributes_on_omitted_return_type)
855 ToBeRemoved.push_back(&AL);
865 diag::warn_block_literal_qualifiers_on_omitted_return_type);
871static OpenCLAccessAttr::Spelling
874 if (AL.getKind() == ParsedAttr::AT_OpenCLAccess)
875 return static_cast<OpenCLAccessAttr::Spelling
>(AL.getSemanticSpelling());
876 return OpenCLAccessAttr::Keyword_read_only;
879static UnaryTransformType::UTTKind
882#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
884 return UnaryTransformType::Enum;
885#include "clang/Basic/TransformTypeTraits.def"
887 llvm_unreachable(
"attempted to parse a non-unary transform builtin");
901 Sema &S = state.getSema();
902 Declarator &declarator = state.getDeclarator();
913 Result = Context.VoidTy;
917 Result = Context.CharTy;
919 Result = Context.SignedCharTy;
922 "Unknown TSS value");
923 Result = Context.UnsignedCharTy;
928 Result = Context.WCharTy;
932 Context.getPrintingPolicy());
933 Result = Context.getSignedWCharType();
936 "Unknown TSS value");
939 Context.getPrintingPolicy());
940 Result = Context.getUnsignedWCharType();
945 "Unknown TSS value");
946 Result = Context.Char8Ty;
950 "Unknown TSS value");
951 Result = Context.Char16Ty;
955 "Unknown TSS value");
956 Result = Context.Char32Ty;
966 Result = Context.getAutoDeductType();
970 Context.DependentTy)) {
971 Result = Context.DependentTy;
983 S.
Diag(DeclLoc, diag::warn_missing_type_specifier)
992 S.
Diag(DeclLoc, diag::err_missing_type_specifier)
1001 S.
Diag(DeclLoc, diag::err_missing_actual_pipe_type)
1006 "implicit int is disabled?");
1007 S.
Diag(DeclLoc, diag::ext_missing_type_specifier)
1018 Result = Context.IntTy;
1021 Result = Context.ShortTy;
1024 Result = Context.LongTy;
1027 Result = Context.LongLongTy;
1034 diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);
1043 Result = Context.UnsignedIntTy;
1046 Result = Context.UnsignedShortTy;
1049 Result = Context.UnsignedLongTy;
1052 Result = Context.UnsignedLongLongTy;
1059 diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);
1074 if (Result.isNull()) {
1075 Result = Context.IntTy;
1083 Result = Context.ShortAccumTy;
1086 Result = Context.AccumTy;
1089 Result = Context.LongAccumTy;
1092 llvm_unreachable(
"Unable to specify long long as _Accum width");
1096 Result = Context.getCorrespondingUnsignedType(Result);
1099 Result = Context.getCorrespondingSaturatedType(Result);
1106 Result = Context.ShortFractTy;
1109 Result = Context.FractTy;
1112 Result = Context.LongFractTy;
1115 llvm_unreachable(
"Unable to specify long long as _Fract width");
1119 Result = Context.getCorrespondingUnsignedType(Result);
1122 Result = Context.getCorrespondingSaturatedType(Result);
1132 Result = Context.UnsignedInt128Ty;
1134 Result = Context.Int128Ty;
1144 Result = Context.Float16Ty;
1152 Result = Context.BFloat16Ty;
1157 Result = Context.LongDoubleTy;
1159 Result = Context.DoubleTy;
1164 << (S.
getLangOpts().getOpenCLCompatibleVersion() == 300
1165 ?
"cl_khr_fp64 and __opencl_c_fp64"
1176 Result = Context.Float128Ty;
1183 Result = Context.Ibm128Ty;
1186 Result = Context.BoolTy;
1192 Result = Context.IntTy;
1203 Result = Context.IntTy;
1214 "No qualifiers on tag names!");
1227 "Can't handle qualifiers on typedef names yet!");
1229 if (Result.isNull()) {
1240 assert(!Result.isNull() &&
"Didn't get a type for typeof?");
1241 if (!Result->isDependentType())
1242 if (
const auto *TT = Result->getAs<TagType>())
1245 Result = Context.getTypeOfType(
1253 assert(E &&
"Didn't get an expression for typeof?");
1259 if (Result.isNull()) {
1260 Result = Context.IntTy;
1267 assert(E &&
"Didn't get an expression for decltype?");
1270 if (Result.isNull()) {
1271 Result = Context.IntTy;
1278 assert(E &&
"Didn't get an expression for pack indexing");
1282 if (Result.isNull()) {
1284 Result = Context.IntTy;
1289#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
1290#include "clang/Basic/TransformTypeTraits.def"
1292 assert(!Result.isNull() &&
"Didn't get a type for the transformation?");
1296 if (Result.isNull()) {
1297 Result = Context.IntTy;
1312 TypeConstraintConcept =
1318 TemplateId->NumArgs);
1320 for (
const auto &ArgLoc : TemplateArgsInfo.
arguments())
1321 TemplateArgs.push_back(ArgLoc.getArgument());
1328 TypeConstraintConcept, TemplateArgs);
1337 Result = Context.UnknownAnyTy;
1342 assert(!Result.isNull() &&
"Didn't get a type for _Atomic?");
1344 if (Result.isNull()) {
1345 Result = Context.IntTy;
1350#define GENERIC_IMAGE_TYPE(ImgType, Id) \
1351 case DeclSpec::TST_##ImgType##_t: \
1352 switch (getImageAccess(DS.getAttributes())) { \
1353 case OpenCLAccessAttr::Keyword_write_only: \
1354 Result = Context.Id##WOTy; \
1356 case OpenCLAccessAttr::Keyword_read_write: \
1357 Result = Context.Id##RWTy; \
1359 case OpenCLAccessAttr::Keyword_read_only: \
1360 Result = Context.Id##ROTy; \
1362 case OpenCLAccessAttr::SpellingNotCalculated: \
1363 llvm_unreachable("Spelling not yet calculated"); \
1366#include "clang/Basic/OpenCLImageTypes.def"
1368#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1369 case DeclSpec::TST_##Name: \
1370 Result = Context.SingletonId; \
1372#include "clang/Basic/HLSLIntangibleTypes.def"
1375 Result = Context.IntTy;
1383 if (Result->containsErrors())
1388 bool IsOpenCLC30Compatible =
1397 if ((Result->isImageType() || Result->isSamplerT()) &&
1398 (IsOpenCLC30Compatible &&
1401 << 0 << Result <<
"__opencl_c_images";
1403 }
else if (Result->isOCLImage3dWOType() &&
1408 << (IsOpenCLC30Compatible
1409 ?
"cl_khr_3d_image_writes and __opencl_c_3d_image_writes"
1410 :
"cl_khr_3d_image_writes");
1422 Context.getPrintingPolicy());
1428 Result = Context.getComplexType(Result);
1430 unsigned typeSize =
static_cast<unsigned>(Context.getTypeSize(Result));
1431 assert(typeSize > 0 &&
"type size for vector must be greater than 0 bits");
1437 Result = Context.getVectorType(Result, 128/typeSize, VecKind);
1462 if (AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
1473 if (AL.isStandardAttributeSyntax() && AL.isClangScope() &&
1474 !(AL.getKind() == ParsedAttr::AT_MatrixType &&
1476 S.
Diag(AL.getLoc(), diag::warn_type_attribute_deprecated_on_decl)
1504 if (Result->isFunctionType()) {
1505 unsigned DiagId = diag::warn_typecheck_function_qualifiers_ignored;
1507 DiagId = diag::ext_typecheck_function_qualifiers_unspecified;
1523 if (TypeQuals && Result->isReferenceType()) {
1525 S, DS, TypeQuals, Result,
1527 diag::warn_typecheck_reference_qualifiers);
1534 && TypeQuals & Result.getCVRQualifiers()) {
1561 assert(!Result.isNull() &&
"This function should not return a null type");
1573 if (
T->isDependentType())
1576 const auto *AT = dyn_cast<AutoType>(
T);
1577 return AT && AT->isGNUAutoType();
1586 if (
T->isReferenceType()) {
1594 unsigned DiagID = 0;
1608 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
1614 DiagID = diag::err_typecheck_invalid_restrict_not_pointer;
1620 Diag(Loc, DiagID) << EltTy;
1623 if (
T->isArrayType())
1625 ? diag::warn_c23_compat_restrict_on_array_of_pointers
1626 : diag::ext_restrict_on_array_of_pointers_c23);
1630 return Context.getQualifiedType(
T, Qs);
1634 unsigned CVRAU,
const DeclSpec *DS) {
1639 if (
T->isReferenceType())
1668 Split.Quals.addCVRQualifiers(CVR);
1686 if (!
type->isObjCLifetimeType() ||
1696 if (
type.isConstQualified()) {
1702 }
else if (
type->isObjCARCImplicitlyUnretainedType()) {
1720 diag::err_arc_indirect_no_ownership,
type, isReference));
1722 S.
Diag(loc, diag::err_arc_indirect_no_ownership) <<
type << isReference;
1726 assert(implicitLifetime &&
"didn't infer any lifetime!");
1767enum QualifiedFunctionKind { QFK_BlockPointer, QFK_Pointer, QFK_Reference };
1773 QualifiedFunctionKind QFK) {
1780 S.
Diag(Loc, diag::err_compound_qualified_function_type)
1781 << QFK << isa<FunctionType>(
T.IgnoreParens()) <<
T
1792 Diag(Loc, diag::err_qualified_function_typeid)
1809 if (
T->isReferenceType()) {
1811 Diag(Loc, diag::err_illegal_decl_pointer_to_reference)
1819 Diag(Loc, diag::err_opencl_function_pointer) << 0;
1824 Diag(Loc, diag::err_hlsl_pointers_unsupported) << 0;
1831 if (
T->isObjCObjectType())
1832 return Context.getObjCObjectPointerType(
T);
1844 if (
T.isWebAssemblyReferenceType()) {
1845 Diag(Loc, diag::err_wasm_reference_pr) << 0;
1850 if (
T->getUnqualifiedDesugaredType()->isWebAssemblyTableType()) {
1851 Diag(Loc, diag::err_wasm_table_pr) << 0;
1864 "Unresolved overloaded function type");
1891 if (
T->isVoidType()) {
1892 Diag(Loc, diag::err_reference_to_void);
1897 Diag(Loc, diag::err_hlsl_pointers_unsupported) << 1;
1907 Diag(Loc, diag::err_opencl_function_pointer) << 1;
1920 T.isWebAssemblyReferenceType()) {
1921 Diag(Loc, diag::err_wasm_reference_pr) << 1;
1924 if (
T->isWebAssemblyTableType()) {
1925 Diag(Loc, diag::err_wasm_table_pr) << 1;
1931 return Context.getLValueReferenceType(
T, SpelledAsLValue);
1932 return Context.getRValueReferenceType(
T);
1940 return Context.getWritePipeType(
T);
1946 return Context.getDependentBitIntType(IsUnsigned, BitWidth);
1948 llvm::APSInt Bits(32);
1955 size_t NumBits = Bits.getZExtValue();
1956 if (!IsUnsigned && NumBits < 2) {
1957 Diag(Loc, diag::err_bit_int_bad_size) << 0;
1961 if (IsUnsigned && NumBits < 1) {
1962 Diag(Loc, diag::err_bit_int_bad_size) << 1;
1968 Diag(Loc, diag::err_bit_int_max_size)
1973 return Context.getBitIntType(IsUnsigned, NumBits);
1982 llvm::APSInt &SizeVal,
unsigned VLADiag,
2007 VLADiagnoser(
unsigned VLADiag,
bool VLAIsError)
2008 : VLADiag(VLADiag), VLAIsError(VLAIsError) {}
2012 return S.
Diag(Loc, diag::err_array_size_non_int) <<
T;
2017 IsVLA = !VLAIsError;
2018 return S.
Diag(Loc, VLADiag);
2023 return S.
Diag(Loc, diag::ext_vla_folded_to_constant);
2025 } Diagnoser(VLADiag, VLAIsError);
2029 if (Diagnoser.IsVLA)
2035 EltTy =
Context.getBaseElementType(EltTy);
2043 if (Size.isMultipleOf(Alignment))
2046 Diag(Loc, diag::err_array_element_alignment)
2047 << EltTy << Size.getQuantity() << Alignment.
getQuantity();
2052 Expr *ArraySize,
unsigned Quals,
2068 if (
T->isReferenceType()) {
2069 Diag(Loc, diag::err_illegal_decl_array_of_references)
2074 if (
T->isVoidType() ||
T->isIncompleteArrayType()) {
2075 Diag(Loc, diag::err_array_incomplete_or_sizeless_type) << 0 <<
T;
2080 diag::err_array_of_abstract_type))
2085 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
2087 if (!MPTy->getQualifier().isDependent())
2093 if (!
T.isWebAssemblyReferenceType() &&
2095 diag::err_array_incomplete_or_sizeless_type))
2100 if (
Context.getTargetInfo().getTriple().isWasm() &&
T->isArrayType()) {
2101 const auto *ATy = dyn_cast<ArrayType>(
T);
2102 if (ATy && ATy->getElementType().isWebAssemblyReferenceType()) {
2103 Diag(Loc, diag::err_wasm_reftype_multidimensional_array);
2108 if (
T->isSizelessType() && !
T.isWebAssemblyReferenceType()) {
2109 Diag(Loc, diag::err_array_incomplete_or_sizeless_type) << 1 <<
T;
2113 if (
T->isFunctionType()) {
2114 Diag(Loc, diag::err_illegal_decl_array_of_functions)
2119 if (
const auto *RD =
T->getAsRecordDecl()) {
2122 if (RD->hasFlexibleArrayMember())
2123 Diag(Loc, diag::ext_flexible_array_in_array) <<
T;
2124 }
else if (
T->isObjCObjectType()) {
2125 Diag(Loc, diag::err_objc_array_of_interfaces) <<
T;
2136 ArraySize =
Result.get();
2140 if (ArraySize && !ArraySize->
isPRValue()) {
2145 ArraySize =
Result.get();
2168 if (
const auto *CondExpr = dyn_cast_if_present<ConditionalOperator>(
2170 std::optional<llvm::APSInt> LHS =
2171 CondExpr->getLHS()->getIntegerConstantExpr(
Context);
2172 std::optional<llvm::APSInt> RHS =
2173 CondExpr->getRHS()->getIntegerConstantExpr(
Context);
2174 return LHS && RHS && LHS->isNegative() != RHS->isNegative();
2184 VLADiag = diag::err_opencl_vla;
2187 VLADiag = diag::warn_vla_used;
2190 VLADiag = diag::err_vla_in_sfinae;
2193 VLADiag = diag::err_openmp_vla_in_task_untied;
2198 ? diag::ext_vla_cxx_in_gnu_mode_static_assert
2199 : diag::ext_vla_cxx_static_assert;
2201 VLADiag =
getLangOpts().GNUMode ? diag::ext_vla_cxx_in_gnu_mode
2202 : diag::ext_vla_cxx;
2205 VLADiag = diag::ext_vla;
2209 llvm::APSInt ConstVal(
Context.getTypeSize(
Context.getSizeType()));
2216 T =
Context.getVariableArrayType(
T,
nullptr, ASM, Quals);
2218 T =
Context.getIncompleteArrayType(
T, ASM, Quals);
2221 T =
Context.getDependentSizedArrayType(
T, ArraySize, ASM, Quals);
2232 T =
Context.getVariableArrayType(
T, ArraySize, ASM, Quals);
2233 }
else if (!
T->isDependentType() && !
T->isIncompleteType() &&
2234 !
T->isConstantSizeType()) {
2241 T =
Context.getVariableArrayType(
T, ArraySize, ASM, Quals);
2246 if (ConstVal.isSigned() && ConstVal.isNegative()) {
2253 diag::err_typecheck_negative_array_size)
2257 if (ConstVal == 0 && !
T.isWebAssemblyReferenceType()) {
2262 : diag::ext_typecheck_zero_array_size)
2269 unsigned ActiveSizeBits =
2270 (!
T->isDependentType() && !
T->isVariablyModifiedType() &&
2271 !
T->isIncompleteType() && !
T->isUndeducedType())
2273 : ConstVal.getActiveBits();
2276 <<
toString(ConstVal, 10, ConstVal.isSigned(),
2283 T =
Context.getConstantArrayType(
T, ConstVal, ArraySize, ASM, Quals);
2287 if (
T->isVariableArrayType()) {
2288 if (!
Context.getTargetInfo().isVLASupported()) {
2292 IsCUDADevice ? diag::err_cuda_vla : diag::err_vla_unsupported)
2293 << (IsCUDADevice ? llvm::to_underlying(
CUDA().CurrentTarget()) : 0);
2297 FSI->setHasVLA(Loc);
2305 : diag::ext_c99_array_usage)
2316 Diag(Loc, diag::err_opencl_invalid_type_array) << ArrType;
2326 bool ForMatrixType =
false) {
2329 if (!llvm::isPowerOf2_32(NumBits))
2330 return S.
Diag(AttrLoc, diag::err_attribute_invalid_bitint_vector_type)
2344 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << CurType;
2353 return Context.getDependentVectorType(CurType, SizeExpr, AttrLoc,
2356 std::optional<llvm::APSInt> VecSize =
2359 Diag(AttrLoc, diag::err_attribute_argument_type)
2365 if (VecSize->isNegative()) {
2366 Diag(SizeExpr->
getExprLoc(), diag::err_attribute_vec_negative_size);
2371 return Context.getDependentVectorType(CurType, SizeExpr, AttrLoc,
2375 if (!VecSize->isIntN(61)) {
2377 Diag(AttrLoc, diag::err_attribute_size_too_large)
2381 uint64_t VectorSizeBits = VecSize->getZExtValue() * 8;
2382 unsigned TypeSize =
static_cast<unsigned>(
Context.getTypeSize(CurType));
2384 if (VectorSizeBits == 0) {
2385 Diag(AttrLoc, diag::err_attribute_zero_size)
2390 if (!TypeSize || VectorSizeBits % TypeSize) {
2391 Diag(AttrLoc, diag::err_attribute_invalid_size)
2396 if (VectorSizeBits / TypeSize > std::numeric_limits<uint32_t>::max()) {
2397 Diag(AttrLoc, diag::err_attribute_size_too_large)
2402 return Context.getVectorType(CurType, VectorSizeBits / TypeSize,
2418 if ((!
T->isDependentType() && !
T->isIntegerType() &&
2419 !
T->isRealFloatingType()) ||
2420 (IsNoBoolVecLang &&
T->isBooleanType())) {
2421 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) <<
T;
2430 std::optional<llvm::APSInt> VecSize =
2433 Diag(AttrLoc, diag::err_attribute_argument_type)
2439 if (VecSize->isNegative()) {
2440 Diag(SizeExpr->
getExprLoc(), diag::err_attribute_vec_negative_size);
2444 if (!VecSize->isIntN(32)) {
2445 Diag(AttrLoc, diag::err_attribute_size_too_large)
2451 unsigned VectorSize =
static_cast<unsigned>(VecSize->getZExtValue());
2453 if (VectorSize == 0) {
2454 Diag(AttrLoc, diag::err_attribute_zero_size)
2459 return Context.getExtVectorType(
T, VectorSize);
2462 return Context.getDependentSizedExtVectorType(
T, SizeExpr, AttrLoc);
2467 assert(
Context.getLangOpts().MatrixTypes &&
2468 "Should never build a matrix type when it is disabled");
2473 Diag(AttrLoc, diag::err_attribute_invalid_matrix_type) << ElementTy;
2484 return Context.getDependentSizedMatrixType(ElementTy, NumRows, NumCols,
2487 std::optional<llvm::APSInt> ValueRows =
2489 std::optional<llvm::APSInt> ValueColumns =
2496 if (!ValueRows && !ValueColumns) {
2497 Diag(AttrLoc, diag::err_attribute_argument_type)
2505 Diag(AttrLoc, diag::err_attribute_argument_type)
2511 if (!ValueColumns) {
2512 Diag(AttrLoc, diag::err_attribute_argument_type)
2518 unsigned MatrixRows =
static_cast<unsigned>(ValueRows->getZExtValue());
2519 unsigned MatrixColumns =
static_cast<unsigned>(ValueColumns->getZExtValue());
2520 if (MatrixRows == 0 && MatrixColumns == 0) {
2521 Diag(AttrLoc, diag::err_attribute_zero_size)
2522 <<
"matrix" << RowRange << ColRange;
2525 if (MatrixRows == 0) {
2526 Diag(AttrLoc, diag::err_attribute_zero_size) <<
"matrix" << RowRange;
2529 if (MatrixColumns == 0) {
2530 Diag(AttrLoc, diag::err_attribute_zero_size) <<
"matrix" << ColRange;
2533 if (MatrixRows >
Context.getLangOpts().MaxMatrixDimension &&
2534 MatrixColumns >
Context.getLangOpts().MaxMatrixDimension) {
2535 Diag(AttrLoc, diag::err_attribute_size_too_large)
2536 << RowRange << ColRange <<
"matrix row and column";
2539 if (MatrixRows >
Context.getLangOpts().MaxMatrixDimension) {
2540 Diag(AttrLoc, diag::err_attribute_size_too_large)
2541 << RowRange <<
"matrix row";
2544 if (MatrixColumns >
Context.getLangOpts().MaxMatrixDimension) {
2545 Diag(AttrLoc, diag::err_attribute_size_too_large)
2546 << ColRange <<
"matrix column";
2549 return Context.getConstantMatrixType(ElementTy, MatrixRows, MatrixColumns);
2553 if ((
T->isArrayType() && !
getLangOpts().allowArrayReturnTypes()) ||
2554 T->isFunctionType()) {
2555 Diag(Loc, diag::err_func_returning_array_function)
2556 <<
T->isFunctionType() <<
T;
2561 if (
T->isHalfType() && !
getLangOpts().NativeHalfArgsAndReturns &&
2562 !
Context.getTargetInfo().allowHalfArgsAndReturns()) {
2563 Diag(Loc, diag::err_parameters_retval_cannot_have_fp16_type) << 1 <<
2570 if (
T->isObjCObjectType()) {
2571 Diag(Loc, diag::err_object_cannot_be_passed_returned_by_value)
2577 if (
T.getPointerAuth()) {
2578 Diag(Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 0;
2582 if (
T.hasNonTrivialToPrimitiveDestructCUnion() ||
2583 T.hasNonTrivialToPrimitiveCopyCUnion())
2590 Diag(Loc, diag::warn_deprecated_volatile_return) <<
T;
2605 bool emittedError =
false;
2607 enum class RequiredCC { OnlySwift, SwiftOrSwiftAsync };
2608 auto checkCompatible = [&](
unsigned paramIndex, RequiredCC required) {
2610 (required == RequiredCC::OnlySwift)
2613 if (isCompatible || emittedError)
2615 S.
Diag(getParamLoc(paramIndex), diag::err_swift_param_attr_not_swiftcall)
2617 << (required == RequiredCC::OnlySwift);
2618 emittedError =
true;
2620 for (
size_t paramIndex = 0, numParams = paramTypes.size();
2621 paramIndex != numParams; ++paramIndex) {
2632 checkCompatible(paramIndex, RequiredCC::SwiftOrSwiftAsync);
2633 if (paramIndex != 0 &&
2636 S.
Diag(getParamLoc(paramIndex),
2637 diag::err_swift_indirect_result_not_first);
2642 checkCompatible(paramIndex, RequiredCC::SwiftOrSwiftAsync);
2651 checkCompatible(paramIndex, RequiredCC::OnlySwift);
2652 if (paramIndex == 0 ||
2655 S.
Diag(getParamLoc(paramIndex),
2656 diag::err_swift_error_result_not_after_swift_context);
2660 llvm_unreachable(
"bad ABI kind");
2672 for (
unsigned Idx = 0, Cnt = ParamTypes.size(); Idx < Cnt; ++Idx) {
2674 QualType ParamType =
Context.getAdjustedParameterType(ParamTypes[Idx]);
2676 Diag(Loc, diag::err_param_with_void_type);
2679 !
Context.getTargetInfo().allowHalfArgsAndReturns()) {
2681 Diag(Loc, diag::err_parameters_retval_cannot_have_fp16_type) << 0 <<
2685 Diag(Loc, diag::err_wasm_table_as_function_parameter);
2689 Diag(Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
2696 Diag(Loc, diag::warn_deprecated_volatile_param) << ParamType;
2698 ParamTypes[Idx] = ParamType;
2703 [=](
unsigned i) {
return Loc; });
2714 return Context.getFunctionType(
T, ParamTypes, EPI);
2729 D <<
"member pointer";
2737 Diag(Loc, diag::err_distant_exception_spec);
2743 if (
T->isReferenceType()) {
2744 Diag(Loc, diag::err_illegal_decl_mempointer_to_reference)
2749 if (
T->isVoidType()) {
2750 Diag(Loc, diag::err_illegal_decl_mempointer_to_void)
2758 Diag(Loc, diag::err_opencl_function_pointer) << 0;
2763 Diag(Loc, diag::err_hlsl_pointers_unsupported) << 0;
2772 if (
T->isFunctionType())
2781 if (!
T->isFunctionType()) {
2782 Diag(Loc, diag::err_nonfunction_block_type);
2792 return Context.getBlockPointerType(
T);
2798 if (TInfo) *TInfo =
nullptr;
2803 if (
const LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) {
2804 QT = LIT->getType();
2805 TSI = LIT->getTypeSourceInfo();
2815 unsigned chunkIndex);
2822 Sema &S = state.getSema();
2823 Declarator &declarator = state.getDeclarator();
2829 unsigned outermostPointerIndex = 0;
2831 unsigned numPointers = 0;
2833 unsigned chunkIndex = i;
2835 switch (chunk.
Kind) {
2845 outermostPointerIndex = chunkIndex;
2853 if (numPointers != 1)
return;
2855 outermostPointerIndex = chunkIndex;
2873 if (numPointers == 1) {
2891 }
else if (numPointers == 2) {
2904 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership)
2908 outermostPointerIndex);
2930 }
const QualKinds[5] = {
2944 for (
auto &E : QualKinds) {
2945 if (Quals & E.Mask) {
2946 if (!QualStr.empty()) QualStr +=
' ';
2963 << QualStr <<
NumQuals << FixIts[0] << FixIts[1] << FixIts[2] << FixIts[3];
2969 unsigned FunctionChunkIndex) {
2979 for (
unsigned OuterChunkIndex = FunctionChunkIndex + 1,
2981 OuterChunkIndex != End; ++OuterChunkIndex) {
2983 switch (OuterChunk.
Kind) {
2990 diag::warn_qual_return_type,
3016 llvm_unreachable(
"unknown declarator chunk kind");
3037static std::pair<QualType, TypeSourceInfo *>
3041 Sema &S = state.getSema();
3045 const unsigned AutoParameterPosition = Info.
TemplateParams.size();
3059 TemplateParameterDepth, AutoParameterPosition,
3062 IsParameterPack,
Auto->isConstrained());
3067 if (
Auto->isConstrained()) {
3074 for (
unsigned Idx = 0; Idx < AutoLoc.
getNumArgs(); ++Idx) {
3132 QualType NewT = state.ReplaceAutoType(
T, Replacement);
3136 return {NewT, NewTSI};
3145 Sema &SemaRef = state.getSema();
3148 ReturnTypeInfo =
nullptr;
3151 TagDecl *OwnedTagDecl =
nullptr;
3201 DeducedType *Deduced =
T->getContainedDeducedType();
3202 bool DeducedIsTrailingReturnType =
false;
3205 Deduced =
T.isNull() ?
nullptr :
T->getContainedDeducedType();
3206 DeducedIsTrailingReturnType =
true;
3211 AutoType *
Auto = dyn_cast<AutoType>(Deduced);
3216 bool IsCXXAutoType =
3218 bool IsDeducedReturnType =
false;
3259 assert(Info &&
"No LambdaScopeInfo on the stack!");
3265 if (!DeducedIsTrailingReturnType)
3278 llvm_unreachable(
"unhandled tag kind");
3280 Error = Cxx ? 1 : 2;
3283 Error = Cxx ? 3 : 4;
3328 if (!SemaRef.
getLangOpts().CPlusPlus14 || !IsCXXAutoType)
3330 IsDeducedReturnType =
true;
3333 if (!SemaRef.
getLangOpts().CPlusPlus14 || !IsCXXAutoType)
3335 IsDeducedReturnType =
true;
3340 if (SemaRef.
getLangOpts().CPlusPlus23 && IsCXXAutoType &&
3341 !
Auto->isDecltypeAuto())
3374 (!SemaRef.
getLangOpts().CPlusPlus11 || !IsCXXAutoType))
3384 switch (
Auto->getKeyword()) {
3391 "unknown auto type");
3395 auto *DTST = dyn_cast<DeducedTemplateSpecializationType>(Deduced);
3398 SemaRef.
Diag(AutoRange.
getBegin(), diag::err_auto_not_allowed)
3400 <<
QualType(Deduced, 0) << AutoRange;
3411 unsigned DiagId = 0;
3413 DiagId = diag::warn_cxx11_compat_generic_lambda;
3414 else if (IsDeducedReturnType)
3415 DiagId = diag::warn_cxx11_compat_deduced_return_type;
3417 DiagId = diag::warn_cxx98_compat_auto_type_specifier;
3420 SemaRef.
Diag(AutoRange.
getBegin(), DiagId) << AutoRange;
3428 unsigned DiagID = 0;
3434 llvm_unreachable(
"parser should not have allowed this");
3450 DiagID = diag::err_type_defined_in_alias_template;
3462 DiagID = diag::err_type_defined_in_type_specifier;
3472 DiagID = diag::err_type_defined_in_param_type;
3478 DiagID = diag::err_type_defined_in_condition;
3489 assert(!
T.isNull() &&
"This function should not return a null type");
3498 assert(FTI.
isAmbiguous &&
"no direct-initializer / function ambiguity");
3528 FTI.
NumParams ? diag::warn_parens_disambiguated_as_function_declaration
3529 : diag::warn_empty_parens_are_function_decl)
3540 if (Comma.getFileID() != Name.
getFileID() ||
3548 Result.suppressDiagnostics();
3561 S.
Diag(B, diag::note_additional_parens_for_variable_declaration)
3576 S.
Diag(DeclType.
Loc, diag::note_empty_parens_default_ctor)
3584 S.
Diag(DeclType.
Loc, diag::note_empty_parens_zero_initialize)
3595 "do not have redundant top-level parentheses");
3604 bool CouldBeTemporaryObject =
3608 (
T->isRecordType() ||
T->isDependentType()) &&
3611 bool StartsWithDeclaratorId =
true;
3619 StartsWithDeclaratorId =
false;
3624 CouldBeTemporaryObject =
false;
3632 CouldBeTemporaryObject =
false;
3633 StartsWithDeclaratorId =
false;
3643 CouldBeTemporaryObject =
false;
3650 CouldBeTemporaryObject =
false;
3651 StartsWithDeclaratorId =
false;
3661 if (CouldBeTemporaryObject) {
3665 CouldBeTemporaryObject =
false;
3666 Result.suppressDiagnostics();
3671 if (!CouldBeTemporaryObject) {
3695 S.
Diag(
Paren.Loc, diag::warn_redundant_parens_around_declarator)
3701 S.
Diag(
Paren.Loc, diag::warn_parens_disambiguated_as_variable_declaration)
3703 auto *RD =
T->getAsCXXRecordDecl();
3704 if (!RD || !RD->hasDefinition() || RD->hasNonTrivialDestructor())
3705 S.
Diag(
Paren.Loc, diag::note_raii_guard_add_name)
3710 S.
Diag(D.
getBeginLoc(), diag::note_function_style_cast_add_parentheses)
3713 S.
Diag(
Paren.Loc, diag::note_remove_parens_for_variable_declaration)
3729 switch (AL.getKind()) {
3748 bool IsCXXInstanceMethod =
false;
3754 unsigned I = ChunkIndex;
3755 bool FoundNonParen =
false;
3756 while (I && !FoundNonParen) {
3759 FoundNonParen =
true;
3762 if (FoundNonParen) {
3765 IsCXXInstanceMethod =
3770 IsCXXInstanceMethod =
3778 IsCXXInstanceMethod =
3786 IsCXXInstanceMethod);
3794 if (Triple.isSPIRV() && Triple.getVendor() != llvm::Triple::AMD) {
3796 if (AL.getKind() == ParsedAttr::AT_CUDAGlobal) {
3803 for (
const ParsedAttr &AL : llvm::concat<ParsedAttr>(
3805 if (AL.getKind() == ParsedAttr::AT_DeviceKernel) {
3816 enum class SimplePointerKind {
3825 switch (nullability) {
3827 if (!Ident__Nonnull)
3828 Ident__Nonnull =
PP.getIdentifierInfo(
"_Nonnull");
3829 return Ident__Nonnull;
3832 if (!Ident__Nullable)
3833 Ident__Nullable =
PP.getIdentifierInfo(
"_Nullable");
3834 return Ident__Nullable;
3837 if (!Ident__Nullable_result)
3838 Ident__Nullable_result =
PP.getIdentifierInfo(
"_Nullable_result");
3839 return Ident__Nullable_result;
3842 if (!Ident__Null_unspecified)
3843 Ident__Null_unspecified =
PP.getIdentifierInfo(
"_Null_unspecified");
3844 return Ident__Null_unspecified;
3846 llvm_unreachable(
"Unknown nullability kind.");
3853 if (AL.getKind() == ParsedAttr::AT_TypeNonNull ||
3854 AL.getKind() == ParsedAttr::AT_TypeNullable ||
3855 AL.getKind() == ParsedAttr::AT_TypeNullableResult ||
3856 AL.getKind() == ParsedAttr::AT_TypeNullUnspecified)
3865 enum class PointerDeclaratorKind {
3873 MaybePointerToCFRef,
3877 NSErrorPointerPointer,
3883 enum class PointerWrappingDeclaratorKind {
3897static PointerDeclaratorKind
3899 PointerWrappingDeclaratorKind &wrappingKind) {
3900 unsigned numNormalPointers = 0;
3903 if (
type->isDependentType())
3904 return PointerDeclaratorKind::NonPointer;
3909 switch (chunk.
Kind) {
3911 if (numNormalPointers == 0)
3912 wrappingKind = PointerWrappingDeclaratorKind::Array;
3921 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
3922 : PointerDeclaratorKind::SingleLevelPointer;
3928 if (numNormalPointers == 0)
3929 wrappingKind = PointerWrappingDeclaratorKind::Reference;
3933 ++numNormalPointers;
3934 if (numNormalPointers > 2)
3935 return PointerDeclaratorKind::MultiLevelPointer;
3941 unsigned numTypeSpecifierPointers = 0;
3945 ++numNormalPointers;
3947 if (numNormalPointers > 2)
3948 return PointerDeclaratorKind::MultiLevelPointer;
3950 type = ptrType->getPointeeType();
3951 ++numTypeSpecifierPointers;
3957 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
3958 : PointerDeclaratorKind::SingleLevelPointer;
3963 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
3964 : PointerDeclaratorKind::SingleLevelPointer;
3969 ++numNormalPointers;
3970 ++numTypeSpecifierPointers;
3973 if (
auto objcClassDecl = objcObjectPtr->getInterfaceDecl()) {
3975 numNormalPointers == 2 && numTypeSpecifierPointers < 2) {
3976 return PointerDeclaratorKind::NSErrorPointerPointer;
3985 if (objcClass->getInterface()->getIdentifier() ==
3987 if (numNormalPointers == 2 && numTypeSpecifierPointers < 2)
3988 return PointerDeclaratorKind::NSErrorPointerPointer;
3995 if (numNormalPointers == 0)
3996 return PointerDeclaratorKind::NonPointer;
4000 if (numNormalPointers == 2 && numTypeSpecifierPointers < 2 &&
4002 return PointerDeclaratorKind::CFErrorRefPointer;
4010 switch (numNormalPointers) {
4012 return PointerDeclaratorKind::NonPointer;
4015 return PointerDeclaratorKind::SingleLevelPointer;
4018 return PointerDeclaratorKind::MaybePointerToCFRef;
4021 return PointerDeclaratorKind::MultiLevelPointer;
4030 if (ctx->isFunctionOrMethod())
4033 if (ctx->isFileContext())
4044 bool invalid =
false;
4046 if (invalid || !sloc.
isFile())
4064template <
typename DiagBuilderT>
4073 if (!FixItLoc.
isValid() || FixItLoc == PointerLoc)
4082 InsertionTextBuf +=
" ";
4083 StringRef InsertionText = InsertionTextBuf.str();
4086 InsertionText = InsertionText.drop_back();
4087 }
else if (NextChar[-1] ==
'[') {
4088 if (NextChar[0] ==
']')
4089 InsertionText = InsertionText.drop_back().drop_front();
4091 InsertionText = InsertionText.drop_front();
4094 InsertionText = InsertionText.drop_back().drop_front();
4101 SimplePointerKind PointerKind,
4106 if (PointerKind == SimplePointerKind::Array) {
4107 S.
Diag(PointerLoc, diag::warn_nullability_missing_array);
4109 S.
Diag(PointerLoc, diag::warn_nullability_missing)
4110 <<
static_cast<unsigned>(PointerKind);
4113 auto FixItLoc = PointerEndLoc.
isValid() ? PointerEndLoc : PointerLoc;
4114 if (FixItLoc.isMacroID())
4118 auto Diag = S.
Diag(FixItLoc, diag::note_nullability_fix_it);
4149 if (pointerKind == SimplePointerKind::Array)
4150 diagKind = diag::warn_nullability_missing_array;
4152 diagKind = diag::warn_nullability_missing;
4158 fileNullability.
PointerKind =
static_cast<unsigned>(pointerKind);
4190 auto kind =
static_cast<SimplePointerKind
>(fileNullability.
PointerKind);
4205 unsigned i = endIndex;
4233template<
typename AttrT>
4236 return ::new (Ctx) AttrT(Ctx, AL);
4254 llvm_unreachable(
"unknown NullabilityKind");
4265 if (ASOld != ASNew) {
4266 S.
Diag(AttrLoc, diag::err_attribute_address_multiple_qualifiers);
4271 diag::warn_attribute_address_multiple_identical_qualifiers);
4280 return T->canHaveNullability(
false) &&
4286 T->getCanonicalTypeInternal());
4296 Sema &S = state.getSema();
4306 bool IsTypedefName =
4312 bool IsQualifiedFunction =
T->isFunctionProtoType() &&
4320 if (
auto *DT =
T->getAs<DeducedType>()) {
4321 const AutoType *AT =
T->getAs<AutoType>();
4323 if ((AT && AT->isDecltypeAuto()) || IsClassTemplateDeduction) {
4325 unsigned Index = E - I - 1;
4327 unsigned DiagId = IsClassTemplateDeduction
4328 ? diag::err_deduced_class_template_compound_type
4329 : diag::err_decltype_auto_compound_type;
4330 unsigned DiagKind = 0;
4331 switch (DeclChunk.
Kind) {
4335 if (IsClassTemplateDeduction) {
4343 DiagId = diag::err_decltype_auto_function_declarator_not_declaration;
4361 S.
Diag(DeclChunk.
Loc, DiagId) << DiagKind;
4369 std::optional<NullabilityKind> inferNullability;
4370 bool inferNullabilityCS =
false;
4371 bool inferNullabilityInnerOnly =
false;
4372 bool inferNullabilityInnerOnlyComplete =
false;
4375 bool inAssumeNonNullRegion =
false;
4377 if (assumeNonNullLoc.
isValid()) {
4378 inAssumeNonNullRegion =
true;
4392 } complainAboutMissingNullability = CAMN_No;
4393 unsigned NumPointersRemaining = 0;
4394 auto complainAboutInferringWithinChunk = PointerWrappingDeclaratorKind::None;
4396 if (IsTypedefName) {
4400 complainAboutMissingNullability = CAMN_InnerPointers;
4404 ++NumPointersRemaining;
4409 switch (chunk.
Kind) {
4417 ++NumPointersRemaining;
4425 ++NumPointersRemaining;
4430 bool isFunctionOrMethod =
false;
4431 switch (
auto context = state.getDeclarator().getContext()) {
4437 isFunctionOrMethod =
true;
4441 if (state.getDeclarator().isObjCIvar() && !isFunctionOrMethod) {
4442 complainAboutMissingNullability = CAMN_No;
4447 if (state.getDeclarator().isObjCWeakProperty()) {
4450 complainAboutMissingNullability = CAMN_No;
4451 if (inAssumeNonNullRegion) {
4461 complainAboutMissingNullability = CAMN_Yes;
4464 auto wrappingKind = PointerWrappingDeclaratorKind::None;
4466 case PointerDeclaratorKind::NonPointer:
4467 case PointerDeclaratorKind::MultiLevelPointer:
4471 case PointerDeclaratorKind::SingleLevelPointer:
4473 if (inAssumeNonNullRegion) {
4474 complainAboutInferringWithinChunk = wrappingKind;
4481 case PointerDeclaratorKind::CFErrorRefPointer:
4482 case PointerDeclaratorKind::NSErrorPointerPointer:
4485 if (isFunctionOrMethod && inAssumeNonNullRegion)
4489 case PointerDeclaratorKind::MaybePointerToCFRef:
4490 if (isFunctionOrMethod) {
4494 auto hasCFReturnsAttr =
4496 return AttrList.hasAttribute(ParsedAttr::AT_CFReturnsRetained) ||
4497 AttrList.hasAttribute(ParsedAttr::AT_CFReturnsNotRetained);
4502 hasCFReturnsAttr(InnermostChunk->getAttrs()) ||
4505 inferNullabilityInnerOnly =
true;
4515 complainAboutMissingNullability = CAMN_Yes;
4543 auto isVaList = [&S](
QualType T) ->
bool {
4549 if (typedefTy->getDecl() == vaListTypedef)
4551 if (
auto *name = typedefTy->getDecl()->getIdentifier())
4552 if (name->isStr(
"va_list"))
4554 typedefTy = typedefTy->desugar()->getAs<
TypedefType>();
4555 }
while (typedefTy);
4561 auto inferPointerNullability =
4566 if (NumPointersRemaining > 0)
4567 --NumPointersRemaining;
4574 if (inferNullability && !inferNullabilityInnerOnlyComplete) {
4577 ? ParsedAttr::Form::ContextSensitiveKeyword()
4578 : ParsedAttr::Form::Keyword(
false ,
4584 attrs.addAtEnd(nullabilityAttr);
4586 if (inferNullabilityCS) {
4587 state.getDeclarator().getMutableDeclSpec().getObjCQualifiers()
4591 if (pointerLoc.isValid() &&
4592 complainAboutInferringWithinChunk !=
4593 PointerWrappingDeclaratorKind::None) {
4595 S.
Diag(pointerLoc, diag::warn_nullability_inferred_on_nested_type);
4600 if (inferNullabilityInnerOnly)
4601 inferNullabilityInnerOnlyComplete =
true;
4602 return nullabilityAttr;
4607 switch (complainAboutMissingNullability) {
4611 case CAMN_InnerPointers:
4612 if (NumPointersRemaining == 0)
4628 if (NumPointersRemaining > 0)
4629 --NumPointersRemaining;
4631 SimplePointerKind pointerKind = SimplePointerKind::Pointer;
4632 if (
T->isBlockPointerType())
4633 pointerKind = SimplePointerKind::BlockPointer;
4634 else if (
T->isMemberPointerType())
4635 pointerKind = SimplePointerKind::MemberPointer;
4637 if (
auto *
attr = inferPointerNullability(
4642 T = state.getAttributedType(
4648 if (complainAboutMissingNullability == CAMN_Yes &&
T->isArrayType() &&
4656 bool ExpectNoDerefChunk =
4657 state.getCurrentAttributes().hasAttribute(ParsedAttr::AT_NoDeref);
4667 bool AreDeclaratorChunksValid =
true;
4669 unsigned chunkIndex = e - i - 1;
4670 state.setCurrentChunkIndex(chunkIndex);
4673 switch (DeclType.
Kind) {
4681 if (!LangOpts.Blocks)
4682 S.
Diag(DeclType.
Loc, diag::err_blocks_disable) << LangOpts.OpenCL;
4685 inferPointerNullability(SimplePointerKind::BlockPointer, DeclType.
Loc,
4687 state.getDeclarator().getAttributePool());
4693 if (LangOpts.OpenCL)
4708 inferPointerNullability(SimplePointerKind::Pointer, DeclType.
Loc,
4710 state.getDeclarator().getAttributePool());
4713 T = Context.getObjCObjectPointerType(
T);
4722 if (LangOpts.OpenCL) {
4723 if (
T->isImageType() ||
T->isSamplerT() ||
T->isPipeType() ||
4724 T->isBlockPointerType()) {
4763 if (chunkIndex != 0 && !ArraySize &&
4782 S.
Diag(DeclType.
Loc, diag::err_array_star_outside_prototype);
4793 S.
Diag(DeclType.
Loc, diag::err_array_static_outside_prototype)
4795 :
"type qualifier");
4806 S.
Diag(DeclType.
Loc, diag::err_array_static_not_outermost)
4808 :
"type qualifier");
4818 if (complainAboutMissingNullability == CAMN_Yes &&
4834 IsQualifiedFunction =
4843 return SS.isInvalid() ||
4865 ? dyn_cast_if_present<ParmVarDecl>(FTI.
Params[0].
Param)
4869 if (
First &&
First->isExplicitObjectParameter() &&
4883 diag::err_explicit_object_parameter_nonmember)
4885 <<
First->getSourceRange();
4888 diag::err_explicit_object_parameter_invalid)
4889 <<
First->getSourceRange();
4894 AreDeclaratorChunksValid =
false;
4904 ? diag::err_auto_missing_trailing_return
4905 : diag::err_deduced_return_type);
4908 AreDeclaratorChunksValid =
false;
4911 diag::warn_cxx11_compat_deduced_return_type);
4920 AreDeclaratorChunksValid =
false;
4923 if (
T != Context.DependentTy) {
4925 diag::err_deduction_guide_with_complex_decl)
4929 AreDeclaratorChunksValid =
false;
4946 S.
Diag(Loc, diag::err_trailing_return_without_auto) <<
T << SR;
4949 AreDeclaratorChunksValid =
false;
4956 }
else if (AutoType *
Auto =
T->getContainedAutoType()) {
4965 if (InventedParamInfo) {
4967 state,
T, TInfo,
Auto, *InventedParamInfo);
4980 T->isFunctionType()) &&
4983 unsigned diagID = diag::err_func_returning_array_function;
4986 if (chunkIndex == 0 &&
4988 diagID = diag::err_block_returning_array_function;
4989 S.
Diag(DeclType.
Loc, diagID) <<
T->isFunctionType() <<
T;
4992 AreDeclaratorChunksValid =
false;
4997 if (
T->isHalfType()) {
5005 }
else if (!S.
getLangOpts().NativeHalfArgsAndReturns &&
5008 diag::err_parameters_retval_cannot_have_fp16_type) << 1;
5014 if (
T.getPointerAuth()) {
5015 S.
Diag(DeclType.
Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 0;
5018 if (LangOpts.OpenCL) {
5021 if (
T->isBlockPointerType() ||
T->isImageType() ||
T->isSamplerT() ||
5032 "__cl_clang_variadic_functions", S.
getLangOpts()) &&
5044 if (
T->isObjCObjectType()) {
5053 S.
Diag(DiagLoc, diag::err_object_cannot_be_passed_returned_by_value)
5057 T = Context.getObjCObjectPointerType(
T);
5065 AreDeclaratorChunksValid =
false;
5073 if ((
T.getCVRQualifiers() ||
T->isAtomicType()) &&
5077 (
T->isRecordType() ||
T->isDependentType() ||
5078 T->isUndeducedAutoType()))) {
5085 S.
Diag(DeclType.
Loc, diag::err_func_returning_qualified_void) <<
T;
5092 if (
T.isVolatileQualified() && S.
getLangOpts().CPlusPlus20)
5093 S.
Diag(DeclType.
Loc, diag::warn_deprecated_volatile_return) <<
T;
5098 if (
T.getQualifiers().hasObjCLifetime()) {
5103 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership) {
5104 AttrLoc = AL.getLoc();
5111 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership) {
5112 AttrLoc = AL.getLoc();
5126 S.
Diag(AttrLoc, diag::warn_arc_lifetime_result_type)
5127 <<
T.getQualifiers().getObjCLifetime();
5135 S.
Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
5136 << Context.getCanonicalTagType(Tag);
5143 diag::err_exception_spec_in_typedef)
5161 T = Context.getFunctionNoProtoType(
T, EI);
5169 diag::warn_c17_compat_ellipsis_only_parameter);
5171 ParsedAttr::AT_Overloadable) &&
5173 ParsedAttr::AT_Overloadable) &&
5175 ParsedAttr::AT_Overloadable))
5183 diag::err_ident_list_in_fn_declaration);
5187 ? Context.getFunctionNoProtoType(
T, EI)
5189 AreDeclaratorChunksValid =
false;
5212 bool HasAnyInterestingExtParameterInfos =
false;
5214 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
5216 QualType ParamTy = Param->getType();
5217 assert(!ParamTy.
isNull() &&
"Couldn't parse type?");
5228 ParamTy = Context.IntTy;
5229 Param->setType(ParamTy);
5233 ParamTy = Context.IntTy;
5234 Param->setType(ParamTy);
5238 S.
Diag(DeclType.
Loc, diag::err_void_param_qualified);
5240 for (
const auto *A : Param->attrs()) {
5241 S.
Diag(A->getLoc(), diag::warn_attribute_on_void_param)
5242 << A << A->getRange();
5247 if (Param->isExplicitObjectParameter()) {
5248 S.
Diag(Param->getLocation(),
5249 diag::err_void_explicit_object_param);
5262 S.
Diag(Param->getLocation(), diag::err_opencl_invalid_param)
5265 Param->setInvalidDecl();
5267 }
else if (!S.
getLangOpts().NativeHalfArgsAndReturns &&
5269 S.
Diag(Param->getLocation(),
5270 diag::err_parameters_retval_cannot_have_fp16_type) << 0;
5274 if (Context.isPromotableIntegerType(ParamTy)) {
5275 ParamTy = Context.getPromotedIntegerType(ParamTy);
5276 Param->setKNRPromoted(
true);
5278 if (BTy->getKind() == BuiltinType::Float) {
5279 ParamTy = Context.DoubleTy;
5280 Param->setKNRPromoted(
true);
5285 S.
Diag(Param->getLocation(), diag::err_opencl_invalid_param)
5290 if (LangOpts.ObjCAutoRefCount && Param->hasAttr<NSConsumedAttr>()) {
5291 ExtParameterInfos[i] = ExtParameterInfos[i].withIsConsumed(
true);
5292 HasAnyInterestingExtParameterInfos =
true;
5296 ExtParameterInfos[i] =
5297 ExtParameterInfos[i].withABI(
attr->getABI());
5298 HasAnyInterestingExtParameterInfos =
true;
5301 if (Param->hasAttr<PassObjectSizeAttr>()) {
5302 ExtParameterInfos[i] = ExtParameterInfos[i].withHasPassObjectSize();
5303 HasAnyInterestingExtParameterInfos =
true;
5306 if (Param->hasAttr<NoEscapeAttr>()) {
5307 ExtParameterInfos[i] = ExtParameterInfos[i].withIsNoEscape(
true);
5308 HasAnyInterestingExtParameterInfos =
true;
5311 ParamTys.push_back(ParamTy);
5314 if (HasAnyInterestingExtParameterInfos) {
5323 Expr *NoexceptExpr =
nullptr;
5329 DynamicExceptions.reserve(N);
5330 DynamicExceptionRanges.reserve(N);
5331 for (
unsigned I = 0; I != N; ++I) {
5342 DynamicExceptionRanges,
5349 auto IsClassMember = [&]() {
5350 return (!state.getDeclarator().getCXXScopeSpec().isEmpty() &&
5351 state.getDeclarator()
5355 state.getDeclarator().getContext() ==
5357 state.getDeclarator().getContext() ==
5361 if (state.getSema().getLangOpts().OpenCLCPlusPlus && IsClassMember()) {
5381 T = Context.getFunctionType(
T, ParamTys, EPI);
5390 inferPointerNullability(SimplePointerKind::MemberPointer, DeclType.
Loc,
5392 state.getDeclarator().getAttributePool());
5397 AreDeclaratorChunksValid =
false;
5406 AreDeclaratorChunksValid =
false;
5424 AreDeclaratorChunksValid =
false;
5433 S.
Diag(DeclType.
Loc, diag::warn_noderef_on_non_pointer_or_array);
5435 ExpectNoDerefChunk = state.didParseNoDeref();
5439 if (ExpectNoDerefChunk)
5440 S.
Diag(state.getDeclarator().getBeginLoc(),
5441 diag::warn_noderef_on_non_pointer_or_array);
5454 bool IsBlock =
false;
5456 switch (DeclType.Kind) {
5468 S.
Diag(DeclType.Loc, diag::warn_strict_prototypes)
5480 assert(!
T.isNull() &&
"T must not be null after this point");
5482 if (LangOpts.CPlusPlus &&
T->isFunctionType()) {
5484 assert(FnTy &&
"Why oh why is there not a FunctionProtoType here?");
5497 ExplicitObjectMember,
5501 Kind = DeductionGuide;
5518 auto *P = dyn_cast_or_null<ParmVarDecl>(Chunk.
Fun.
Params->
Param);
5519 if (P && P->isExplicitObjectParameter())
5520 Kind = ExplicitObjectMember;
5546 if (IsQualifiedFunction &&
5571 if (!RemovalLocs.empty()) {
5572 llvm::sort(RemovalLocs,
5574 RemovalRange =
SourceRange(RemovalLocs.front(), RemovalLocs.back());
5575 Loc = RemovalLocs.front();
5579 S.
Diag(Loc, diag::err_invalid_qualified_function_type)
5603 if (!AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
5611 state.diagnoseIgnoredTypeAttrs(
T);
5622 if (
T.isVolatileQualified() && S.
getLangOpts().CPlusPlus20 &&
5647 if (!
T->containsUnexpandedParameterPack() &&
5648 (!LangOpts.CPlusPlus20 || !
T->getContainedAutoType())) {
5650 diag::err_function_parameter_pack_without_parameter_packs)
5654 T = Context.getPackExpansionType(
T, std::nullopt,
5667 if (
T->containsUnexpandedParameterPack())
5668 T = Context.getPackExpansionType(
T, std::nullopt);
5671 LangOpts.CPlusPlus11
5672 ? diag::warn_cxx98_compat_variadic_templates
5673 : diag::ext_variadic_templates);
5703 diag::err_ellipsis_in_declarator_not_parameter);
5709 assert(!
T.isNull() &&
"T must not be null at the end of this function");
5710 if (!AreDeclaratorChunksValid)
5711 return Context.getTrivialTypeSourceInfo(
T);
5713 if (state.didParseHLSLParamMod() && !
T->isConstantArrayType())
5722 TypeProcessingState state(*
this, D);
5745 unsigned chunkIndex) {
5746 Sema &S = state.getSema();
5754 const char *attrStr =
nullptr;
5755 switch (ownership) {
5773 &Args, 1, ParsedAttr::Form::GNU());
5782 Sema &S = state.getSema();
5786 bool hasIndirection =
false;
5789 switch (chunk.
Kind) {
5798 hasIndirection =
true;
5831 TypeProcessingState state(*
this, D);
5846 TypeProcessingState &State) {
5851 TypeProcessingState &State) {
5853 State.getSema().HLSL().TakeLocForHLSLAttribute(TL.
getTypePtr());
5861 if (AL.getKind() == ParsedAttr::AT_MatrixType) {
5870 llvm_unreachable(
"no matrix_type attribute found at the expected location!");
5875 switch (Chunk.
Kind) {
5880 llvm_unreachable(
"cannot be _Atomic qualified");
5898 class TypeSpecLocFiller :
public TypeLocVisitor<TypeSpecLocFiller> {
5900 ASTContext &Context;
5901 TypeProcessingState &State;
5905 TypeSpecLocFiller(Sema &S, ASTContext &Context, TypeProcessingState &State,
5907 : SemaRef(S), Context(Context), State(State), DS(DS) {}
5909 void VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5913 void VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
5916 void VisitHLSLAttributedResourceTypeLoc(HLSLAttributedResourceTypeLoc TL) {
5920 void VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {}
5921 void VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
5924 State.getExpansionLocForMacroQualifiedType(TL.
getTypePtr()));
5926 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5931 void VisitPointerTypeLoc(PointerTypeLoc TL) { Visit(TL.
getNextTypeLoc()); }
5932 void VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5934 TypeSourceInfo *TInfo =
nullptr;
5947 void VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5949 TypeSourceInfo *TInfo =
nullptr;
5962 void VisitUsingTypeLoc(UsingTypeLoc TL) {
5964 TypeSourceInfo *TInfo =
nullptr;
5977 void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5984 void VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5985 TypeSourceInfo *RepTInfo =
nullptr;
5989 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5990 TypeSourceInfo *RepTInfo =
nullptr;
5994 void VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
5995 TypeSourceInfo *TInfo =
nullptr;
6006 TL.
copy(OldTL.
castAs<TemplateSpecializationTypeLoc>());
6008 OldTL.
castAs<TemplateSpecializationTypeLoc>().getRAngleLoc());
6010 void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6016 void VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6022 TypeSourceInfo *TInfo =
nullptr;
6026 void VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
6031 void VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
6035 void VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6040 TypeSourceInfo *TInfo =
nullptr;
6044 void VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6057 void VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6059 TypeSourceInfo *TInfo =
nullptr;
6064 void VisitAutoTypeLoc(AutoTypeLoc TL) {
6078 NestedNameSpecifierLoc NNS =
6081 : NestedNameSpecifierLoc());
6082 TemplateArgumentListInfo TemplateArgsInfo(TemplateId->
LAngleLoc,
6084 if (TemplateId->
NumArgs > 0) {
6089 DeclarationNameInfo DNI = DeclarationNameInfo(
6090 TL.
getTypePtr()->getTypeConstraintConcept()->getDeclName(),
6093 NamedDecl *FoundDecl;
6098 FoundDecl = cast_if_present<NamedDecl>(TN.getAsTemplateDecl());
6106 void VisitDeducedTemplateSpecializationTypeLoc(
6107 DeducedTemplateSpecializationTypeLoc TL) {
6109 TypeSourceInfo *TInfo =
nullptr;
6115 void VisitTagTypeLoc(TagTypeLoc TL) {
6117 TypeSourceInfo *TInfo =
nullptr;
6125 ElaboratedTypeKeyword::None
6127 : SourceLocation());
6131 void VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6138 TypeSourceInfo *TInfo =
nullptr;
6150 void VisitPipeTypeLoc(PipeTypeLoc TL) {
6153 TypeSourceInfo *TInfo =
nullptr;
6158 void VisitExtIntTypeLoc(BitIntTypeLoc TL) {
6162 void VisitDependentExtIntTypeLoc(DependentBitIntTypeLoc TL) {
6166 void VisitTypeLoc(TypeLoc TL) {
6172 class DeclaratorLocFiller :
public TypeLocVisitor<DeclaratorLocFiller> {
6173 ASTContext &Context;
6174 TypeProcessingState &State;
6175 const DeclaratorChunk &Chunk;
6178 DeclaratorLocFiller(ASTContext &Context, TypeProcessingState &State,
6179 const DeclaratorChunk &Chunk)
6180 : Context(Context), State(State), Chunk(Chunk) {}
6182 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6183 llvm_unreachable(
"qualified type locs not expected here!");
6185 void VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6186 llvm_unreachable(
"decayed type locs not expected here!");
6188 void VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
6189 llvm_unreachable(
"array parameter type locs not expected here!");
6192 void VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6195 void VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
6198 void VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
6201 void VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6204 void VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6208 void VisitPointerTypeLoc(PointerTypeLoc TL) {
6212 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6216 void VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6221 void VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6227 void VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6232 void VisitArrayTypeLoc(ArrayTypeLoc TL) {
6238 void VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6243 const DeclaratorChunk::FunctionTypeInfo &FTI = Chunk.
Fun;
6246 for (
unsigned i = 0, e = TL.
getNumParams(), tpi = 0; i != e; ++i) {
6252 void VisitParenTypeLoc(ParenTypeLoc TL) {
6257 void VisitPipeTypeLoc(PipeTypeLoc TL) {
6261 void VisitBitIntTypeLoc(BitIntTypeLoc TL) {
6264 void VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
6267 void VisitVectorTypeLoc(VectorTypeLoc TL) { TL.
setNameLoc(Chunk.
Loc); }
6268 void VisitDependentVectorTypeLoc(DependentVectorTypeLoc TL) {
6271 void VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6274 void VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6278 VisitDependentSizedExtVectorTypeLoc(DependentSizedExtVectorTypeLoc TL) {
6281 void VisitMatrixTypeLoc(MatrixTypeLoc TL) {
6285 void VisitTypeLoc(TypeLoc TL) {
6286 llvm_unreachable(
"unsupported TypeLoc kind in declarator!");
6295 if (AL.getKind() == ParsedAttr::AT_AddressSpace) {
6304 "no address_space attribute found at the expected location!");
6318 Sema &S = State.getSema();
6344 bool HasDesugaredTypeLoc =
true;
6345 while (HasDesugaredTypeLoc) {
6347 case TypeLoc::MacroQualified: {
6350 State.getExpansionLocForMacroQualifiedType(TL.
getTypePtr()));
6355 case TypeLoc::Attributed: {
6362 case TypeLoc::Adjusted:
6363 case TypeLoc::BTFTagAttributed: {
6368 case TypeLoc::DependentAddressSpace: {
6376 HasDesugaredTypeLoc =
false;
6387 if (ReturnTypeInfo) {
6407 "LocInfoType's TypeClass conflicts with an existing Type class");
6413 llvm_unreachable(
"LocInfoType leaked into the type system; an opaque TypeTy*"
6414 " was used directly instead of getting the QualType through"
6415 " GetTypeFromParser");
6422 "Type name should have no identifier!");
6459 const Expr *AddrSpace,
6462 std::optional<llvm::APSInt> OptAddrSpace =
6464 if (!OptAddrSpace) {
6465 S.
Diag(AttrLoc, diag::err_attribute_argument_type)
6470 llvm::APSInt &addrSpace = *OptAddrSpace;
6473 if (addrSpace.isSigned()) {
6474 if (addrSpace.isNegative()) {
6475 S.
Diag(AttrLoc, diag::err_attribute_address_space_negative)
6479 addrSpace.setIsSigned(
false);
6482 llvm::APSInt
max(addrSpace.getBitWidth());
6486 if (addrSpace >
max) {
6487 S.
Diag(AttrLoc, diag::err_attribute_address_space_too_high)
6509 return Context.getAddrSpaceQualType(
T, ASIdx);
6518 Diag(AttrLoc, diag::err_attribute_address_multiple_qualifiers);
6522 return Context.getDependentAddressSpaceType(
T, AddrSpace, AttrLoc);
6534 TypeProcessingState &State) {
6535 Sema &S = State.getSema();
6541 if (!
Attr.diagnoseLangOpts(S)) {
6547 if (
Attr.getNumArgs() != 1) {
6548 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
6555 auto *StrLiteral = dyn_cast<StringLiteral>(
Attr.getArgAsExpr(0));
6564 StringRef BTFTypeTag = StrLiteral->getString();
6565 Type = State.getBTFTagAttributedType(
6566 ::new (Ctx) BTFTypeTagAttr(Ctx,
Attr, BTFTypeTag),
Type);
6574 TypeProcessingState &State) {
6575 Sema &S = State.getSema();
6580 S.
Diag(
Attr.
getLoc(), diag::err_attribute_address_function_type);
6586 if (
Attr.
getKind() == ParsedAttr::AT_AddressSpace) {
6589 if (
Attr.getNumArgs() != 1) {
6596 Expr *ASArgExpr =
Attr.getArgAsExpr(0);
6605 ::new (Ctx) AddressSpaceAttr(Ctx,
Attr,
static_cast<unsigned>(ASIdx));
6617 if (EquivType.
isNull()) {
6621 T = State.getAttributedType(ASAttr,
Type, EquivType);
6623 T = State.getAttributedType(ASAttr,
Type,
Type);
6634 :
Attr.asOpenCLLangAS();
6636 ASIdx =
Attr.asHLSLLangAS();
6639 llvm_unreachable(
"Invalid address space");
6657 bool NonObjCPointer =
false;
6659 if (!
type->isDependentType() && !
type->isUndeducedType()) {
6667 NonObjCPointer =
true;
6668 }
else if (!
type->isObjCRetainableType()) {
6674 if (state.isProcessingDeclSpec()) {
6682 Sema &S = state.getSema();
6688 if (!
attr.isArgIdent(0)) {
6689 S.
Diag(AttrLoc, diag::err_attribute_argument_type) <<
attr
6697 if (II->
isStr(
"none"))
6699 else if (II->
isStr(
"strong"))
6701 else if (II->
isStr(
"weak"))
6703 else if (II->
isStr(
"autoreleasing"))
6706 S.
Diag(AttrLoc, diag::warn_attribute_type_not_supported) <<
attr << II;
6723 =
type.getQualifiers().getObjCLifetime()) {
6726 S.
Diag(AttrLoc, diag::err_attr_objc_ownership_redundant)
6733 if (previousLifetime != lifetime) {
6736 const Type *prevTy =
nullptr;
6737 while (!prevTy || prevTy != underlyingType.
Ty) {
6738 prevTy = underlyingType.
Ty;
6747 if (NonObjCPointer) {
6748 StringRef name =
attr.getAttrName()->getName();
6757 S.
Diag(AttrLoc, diag::warn_type_attribute_wrong_type) << name
6774 type = state.getAttributedType(
6781 if (!NonObjCPointer)
6798 diagnostic,
type, 0));
6800 S.
Diag(loc, diagnostic);
6809 unsigned diagnostic =
6810 (S.
getLangOpts().ObjCWeakRuntime ? diag::err_arc_weak_disabled
6811 : diag::err_arc_weak_no_runtime);
6814 diagnoseOrDelay(S, AttrLoc, diagnostic,
type);
6826 if (Class->isArcWeakrefUnavailable()) {
6827 S.
Diag(AttrLoc, diag::err_arc_unsupported_weak_class);
6828 S.
Diag(ObjT->getInterfaceDecl()->getLocation(),
6829 diag::note_class_declared);
6844 Sema &S = state.getSema();
6847 if (!
type->isPointerType() &&
6848 !
type->isObjCObjectPointerType() &&
6849 !
type->isBlockPointerType())
6853 S.
Diag(
attr.getLoc(), diag::err_attribute_multiple_objc_gc);
6859 if (!
attr.isArgIdent(0)) {
6860 S.
Diag(
attr.getLoc(), diag::err_attribute_argument_type)
6866 if (
attr.getNumArgs() > 1) {
6867 S.
Diag(
attr.getLoc(), diag::err_attribute_wrong_number_arguments) <<
attr
6874 if (II->
isStr(
"weak"))
6876 else if (II->
isStr(
"strong"))
6879 S.
Diag(
attr.getLoc(), diag::warn_attribute_type_not_supported)
6889 if (
attr.getLoc().isValid())
6890 type = state.getAttributedType(
6907 struct FunctionTypeUnwrapper {
6921 const FunctionType *
Fn;
6922 SmallVector<
unsigned char , 8> Stack;
6924 FunctionTypeUnwrapper(Sema &S, QualType
T) : Original(
T) {
6926 const Type *Ty =
T.getTypePtr();
6936 Stack.push_back(Array);
6942 Stack.push_back(BlockPointer);
6945 Stack.push_back(MemberPointer);
6951 Stack.push_back(Attributed);
6954 Stack.push_back(MacroQualified);
6962 T = QualType(DTy, 0);
6963 Stack.push_back(Desugar);
6968 bool isFunctionType()
const {
return (Fn !=
nullptr); }
6969 const FunctionType *get()
const {
return Fn; }
6971 QualType wrap(Sema &S,
const FunctionType *
New) {
6973 if (
New == get())
return Original;
6976 return wrap(S.
Context, Original, 0);
6980 QualType wrap(ASTContext &
C, QualType Old,
unsigned I) {
6981 if (I == Stack.size())
6986 SplitQualType SplitOld = Old.
split();
6990 return wrap(
C, SplitOld.
Ty, I);
6991 return C.getQualifiedType(wrap(
C, SplitOld.
Ty, I), SplitOld.
Quals);
6994 QualType wrap(ASTContext &
C,
const Type *Old,
unsigned I) {
6995 if (I == Stack.size())
return QualType(Fn, 0);
6997 switch (
static_cast<WrapKind
>(Stack[I++])) {
7008 return C.getParenType(
New);
7011 case MacroQualified:
7015 if (
const auto *CAT = dyn_cast<ConstantArrayType>(Old)) {
7016 QualType
New = wrap(
C, CAT->getElementType(), I);
7017 return C.getConstantArrayType(
New, CAT->getSize(), CAT->getSizeExpr(),
7018 CAT->getSizeModifier(),
7019 CAT->getIndexTypeCVRQualifiers());
7022 if (
const auto *VAT = dyn_cast<VariableArrayType>(Old)) {
7023 QualType
New = wrap(
C, VAT->getElementType(), I);
7024 return C.getVariableArrayType(
New, VAT->getSizeExpr(),
7025 VAT->getSizeModifier(),
7026 VAT->getIndexTypeCVRQualifiers());
7030 QualType
New = wrap(
C, IAT->getElementType(), I);
7031 return C.getIncompleteArrayType(
New, IAT->getSizeModifier(),
7032 IAT->getIndexTypeCVRQualifiers());
7037 return C.getPointerType(
New);
7040 case BlockPointer: {
7042 return C.getBlockPointerType(
New);
7045 case MemberPointer: {
7058 return C.getRValueReferenceType(
New);
7062 llvm_unreachable(
"unknown wrapping kind");
7069 Sema &S = State.getSema();
7073 default: llvm_unreachable(
"Unknown attribute kind");
7074 case ParsedAttr::AT_Ptr32:
7077 case ParsedAttr::AT_Ptr64:
7080 case ParsedAttr::AT_SPtr:
7083 case ParsedAttr::AT_UPtr:
7088 std::bitset<attr::LastAttr> Attrs;
7091 if (
const TypedefType *TT = dyn_cast<TypedefType>(Desugared)) {
7092 Desugared = TT->desugar();
7095 const AttributedType *AT = dyn_cast<AttributedType>(Desugared);
7098 Attrs[AT->getAttrKind()] =
true;
7099 Desugared = AT->getModifiedType();
7105 if (Attrs[NewAttrKind]) {
7106 S.
Diag(PAttr.
getLoc(), diag::warn_duplicate_attribute_exact) << PAttr;
7109 Attrs[NewAttrKind] =
true;
7113 if (Attrs[attr::Ptr32] && Attrs[attr::Ptr64]) {
7114 S.
Diag(PAttr.
getLoc(), diag::err_attributes_are_not_compatible)
7116 <<
"'__ptr64'" << 0;
7118 }
else if (Attrs[attr::SPtr] && Attrs[attr::UPtr]) {
7119 S.
Diag(PAttr.
getLoc(), diag::err_attributes_are_not_compatible)
7131 S.
Diag(PAttr.
getLoc(), diag::err_attribute_no_member_pointers) << PAttr;
7133 S.
Diag(PAttr.
getLoc(), diag::err_attribute_pointers_only) << PAttr << 0;
7141 if (PtrWidth == 32) {
7142 if (Attrs[attr::Ptr64])
7144 else if (Attrs[attr::UPtr])
7146 }
else if (PtrWidth == 64 && Attrs[attr::Ptr32]) {
7163 assert(PAttr.
getKind() == ParsedAttr::AT_WebAssemblyFuncref);
7165 Sema &S = State.getSema();
7168 std::bitset<attr::LastAttr> Attrs;
7170 const auto *AT = dyn_cast<AttributedType>(QT);
7172 Attrs[AT->getAttrKind()] =
true;
7173 AT = dyn_cast<AttributedType>(AT->getModifiedType());
7178 if (Attrs[NewAttrKind]) {
7179 S.
Diag(PAttr.
getLoc(), diag::warn_duplicate_attribute_exact) << PAttr;
7197 Sema &S = State.getSema();
7198 auto &D = State.getDeclarator();
7204 if (State.isProcessingDeclSpec()) {
7205 if (!(D.isPrototypeContext() ||
7209 if (
auto *chunk = D.getInnermostNonParenChunk()) {
7232 auto chunkIdx = State.getCurrentChunkIndex();
7233 if (chunkIdx >= 1 &&
7236 D.getTypeObject(chunkIdx - 1).getAttrs());
7241 auto *A = ::new (S.
Context) SwiftAttrAttr(S.
Context, PAttr, Str);
7242 QT = State.getAttributedType(A, QT, QT);
7249 auto Attributed = dyn_cast<AttributedType>(
Type.getTypePtr());
7254 if (Attributed->getImmediateNullability())
7255 return Attributed->getModifiedType();
7259 Ctx, Attributed->getModifiedType());
7260 assert(Modified.
getTypePtr() != Attributed->getModifiedType().getTypePtr());
7262 Attributed->getEquivalentType(),
7263 Attributed->getAttr());
7269 case ParsedAttr::AT_TypeNonNull:
7272 case ParsedAttr::AT_TypeNullable:
7275 case ParsedAttr::AT_TypeNullableResult:
7278 case ParsedAttr::AT_TypeNullUnspecified:
7282 llvm_unreachable(
"not a nullability attribute kind");
7289 bool IsContextSensitive,
bool AllowOnArrayType,
bool OverrideExisting) {
7290 bool Implicit = (State ==
nullptr);
7296 while (
auto *Attributed = dyn_cast<AttributedType>(Desugared.
getTypePtr())) {
7298 if (
auto ExistingNullability = Attributed->getImmediateNullability()) {
7300 if (Nullability == *ExistingNullability) {
7304 S.
Diag(NullabilityLoc, diag::warn_nullability_duplicate)
7311 if (!OverrideExisting) {
7313 S.
Diag(NullabilityLoc, diag::err_nullability_conflicting)
7323 Desugared = Attributed->getModifiedType();
7331 if (Nullability != *ExistingNullability && !
Implicit) {
7332 S.
Diag(NullabilityLoc, diag::err_nullability_conflicting)
7340 if (
auto typedefNullability =
7341 AttributedType::stripOuterNullability(underlyingType)) {
7342 if (*typedefNullability == *ExistingNullability) {
7355 !(AllowOnArrayType && Desugared->
isArrayType())) {
7357 S.
Diag(NullabilityLoc, diag::err_nullability_nonpointer)
7365 if (IsContextSensitive) {
7367 const Type *pointeeType =
nullptr;
7376 S.
Diag(NullabilityLoc, diag::err_nullability_cs_multilevel)
7378 S.
Diag(NullabilityLoc, diag::note_nullability_type_specifier)
7390 QT = State->getAttributedType(A, QT, QT);
7399 bool AllowOnArrayType) {
7405 Nullability, NullabilityLoc,
7406 IsContextSensitive, AllowOnArrayType,
7413 bool AllowArrayTypes,
7414 bool OverrideExisting) {
7416 *
this,
nullptr,
nullptr,
Type, Nullability, DiagLoc,
7417 false, AllowArrayTypes, OverrideExisting);
7424 Sema &S = state.getSema();
7428 type = state.getAttributedType(
7441 S.
Diag(
attr.getLoc(), diag::err_objc_kindof_nonobject)
7450 objType->getBaseType(), objType->getTypeArgsAsWritten(),
7451 objType->getProtocols(),
7452 objType->isObjCUnqualifiedId() ?
false :
true);
7457 if (
auto nullability =
type->getNullability()) {
7460 assert(
attr.getAttributeSpellingListIndex() == 0 &&
7461 "multiple spellings for __kindof?");
7464 equivType = state.getAttributedType(A, equivType, equivType);
7469 type = state.getAttributedType(
7482 Declarator &declarator = state.getDeclarator();
7485 auto moveToChunk = [&](
DeclaratorChunk &chunk,
bool inFunction) ->
bool {
7498 PK_MemberFunctionPointer,
7503 : inFunction? PK_MemberFunctionPointer : PK_MemberPointer;
7505 auto diag = state.getSema().Diag(
attr.getLoc(),
7506 diag::warn_nullability_declspec)
7508 attr.isContextSensitiveKeywordAttribute())
7510 <<
static_cast<unsigned>(pointerKind);
7516 state.getSema().getPreprocessor().getLocForEndOfToken(
7518 " " +
attr.getAttrName()->getName().str() +
" ");
7528 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
7530 switch (chunk.
Kind) {
7534 return moveToChunk(chunk,
false);
7546 return moveToChunk(*dest,
true);
7562 assert(!
Attr.isInvalid());
7565 llvm_unreachable(
"not a calling convention attribute");
7566 case ParsedAttr::AT_CDecl:
7568 case ParsedAttr::AT_FastCall:
7570 case ParsedAttr::AT_StdCall:
7572 case ParsedAttr::AT_ThisCall:
7574 case ParsedAttr::AT_RegCall:
7576 case ParsedAttr::AT_Pascal:
7578 case ParsedAttr::AT_SwiftCall:
7580 case ParsedAttr::AT_SwiftAsyncCall:
7582 case ParsedAttr::AT_VectorCall:
7584 case ParsedAttr::AT_AArch64VectorPcs:
7586 case ParsedAttr::AT_AArch64SVEPcs:
7588 case ParsedAttr::AT_ArmStreaming:
7590 case ParsedAttr::AT_Pcs: {
7595 if (
Attr.isArgExpr(0))
7598 Str =
Attr.getArgAsIdent(0)->getIdentifierInfo()->getName();
7599 PcsAttr::PCSType
Type;
7600 if (!PcsAttr::ConvertStrToPCSType(Str,
Type))
7601 llvm_unreachable(
"already validated the attribute");
7602 return ::new (Ctx) PcsAttr(Ctx,
Attr,
Type);
7604 case ParsedAttr::AT_IntelOclBicc:
7606 case ParsedAttr::AT_MSABI:
7608 case ParsedAttr::AT_SysVABI:
7610 case ParsedAttr::AT_PreserveMost:
7612 case ParsedAttr::AT_PreserveAll:
7614 case ParsedAttr::AT_M68kRTD:
7616 case ParsedAttr::AT_PreserveNone:
7618 case ParsedAttr::AT_RISCVVectorCC:
7620 case ParsedAttr::AT_RISCVVLSCC: {
7623 unsigned ABIVLen = 128;
7624 if (
Attr.getNumArgs()) {
7625 std::optional<llvm::APSInt> MaybeABIVLen =
7626 Attr.getArgAsExpr(0)->getIntegerConstantExpr(Ctx);
7628 llvm_unreachable(
"Invalid RISC-V ABI VLEN");
7629 ABIVLen = MaybeABIVLen->getZExtValue();
7632 return ::new (Ctx) RISCVVLSCCAttr(Ctx,
Attr, ABIVLen);
7635 llvm_unreachable(
"unexpected attribute kind!");
7638std::optional<FunctionEffectMode>
7643 std::optional<llvm::APSInt> ConditionValue =
7645 if (!ConditionValue) {
7651 return std::nullopt;
7660 FunctionTypeUnwrapper &Unwrapped) {
7662 if (!Unwrapped.isFunctionType())
7665 Sema &S = TPState.getSema();
7669 if (FPT ==
nullptr) {
7670 S.
Diag(PAttr.
getLoc(), diag::err_func_with_effects_no_prototype)
7677 bool IsNonBlocking = PAttr.
getKind() == ParsedAttr::AT_NonBlocking ||
7678 PAttr.
getKind() == ParsedAttr::AT_Blocking;
7681 Expr *CondExpr =
nullptr;
7683 if (PAttr.
getKind() == ParsedAttr::AT_NonBlocking ||
7684 PAttr.
getKind() == ParsedAttr::AT_NonAllocating) {
7693 std::optional<FunctionEffectMode> MaybeMode =
7699 NewMode = *MaybeMode;
7734 assert(
Success &&
"effect conflicts should have been diagnosed above");
7738 FPT->getParamTypes(), EPI);
7747 auto OtherAttr = llvm::find_if(
7748 state.getCurrentAttributes(),
7749 [OtherKind](
const ParsedAttr &A) { return A.getKind() == OtherKind; });
7750 if (OtherAttr == state.getCurrentAttributes().end() || OtherAttr->isInvalid())
7753 Sema &S = state.getSema();
7755 << *OtherAttr <<
Attr
7756 << (OtherAttr->isRegularKeywordAttribute() ||
7758 S.
Diag(OtherAttr->getLoc(), diag::note_conflicting_attribute);
7766 if (!
Attr.getNumArgs()) {
7772 for (
unsigned I = 0; I <
Attr.getNumArgs(); ++I) {
7773 StringRef StateName;
7778 if (StateName !=
"sme_za_state") {
7779 S.
Diag(LiteralLoc, diag::err_unknown_arm_state) << StateName;
7786 S.
Diag(
Attr.
getLoc(), diag::err_conflicting_attributes_arm_agnostic);
7801 if (!
Attr.getNumArgs()) {
7807 for (
unsigned I = 0; I <
Attr.getNumArgs(); ++I) {
7808 StringRef StateName;
7815 if (StateName ==
"za") {
7818 }
else if (StateName ==
"zt0") {
7822 S.
Diag(LiteralLoc, diag::err_unknown_arm_state) << StateName;
7828 S.
Diag(LiteralLoc, diag::err_conflicting_attributes_arm_agnostic);
7837 S.
Diag(LiteralLoc, diag::err_conflicting_attributes_arm_state)
7853 Sema &S = state.getSema();
7855 FunctionTypeUnwrapper unwrapped(S,
type);
7857 if (
attr.getKind() == ParsedAttr::AT_NoReturn) {
7862 if (!unwrapped.isFunctionType())
7871 if (
attr.getKind() == ParsedAttr::AT_CFIUncheckedCallee) {
7873 if (!unwrapped.isFunctionType())
7876 if (!unwrapped.get()->isFunctionProtoType()) {
7877 S.
Diag(
attr.getLoc(), diag::warn_attribute_wrong_decl_type)
7878 <<
attr <<
attr.isRegularKeywordAttribute()
7886 FPT->getReturnType(), FPT->getParamTypes(),
7887 FPT->getExtProtoInfo().withCFIUncheckedCallee(
true));
7892 if (
attr.getKind() == ParsedAttr::AT_CmseNSCall) {
7894 if (!unwrapped.isFunctionType())
7899 S.
Diag(
attr.getLoc(), diag::warn_attribute_ignored) <<
attr;
7906 unwrapped.get()->getExtInfo().withCmseNSCall(
true);
7913 if (
attr.getKind() == ParsedAttr::AT_NSReturnsRetained) {
7914 if (
attr.getNumArgs())
return true;
7917 if (!unwrapped.isFunctionType())
7922 attr.getLoc(), unwrapped.get()->getReturnType()))
7927 if (state.getSema().getLangOpts().ObjCAutoRefCount) {
7929 = unwrapped.get()->getExtInfo().withProducesResult(
true);
7932 type = state.getAttributedType(
7938 if (
attr.getKind() == ParsedAttr::AT_AnyX86NoCallerSavedRegisters) {
7943 if (!unwrapped.isFunctionType())
7947 unwrapped.get()->getExtInfo().withNoCallerSavedRegs(
true);
7952 if (
attr.getKind() == ParsedAttr::AT_AnyX86NoCfCheck) {
7954 S.
Diag(
attr.getLoc(), diag::warn_nocf_check_attribute_ignored);
7964 if (!unwrapped.isFunctionType())
7968 unwrapped.get()->getExtInfo().withNoCfCheck(
true);
7973 if (
attr.getKind() == ParsedAttr::AT_Regparm) {
7979 if (!unwrapped.isFunctionType())
7986 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
7988 <<
attr.isRegularKeywordAttribute();
7994 unwrapped.get()->getExtInfo().withRegParm(value);
7999 if (
attr.getKind() == ParsedAttr::AT_CFISalt) {
8000 if (
attr.getNumArgs() != 1)
8008 if (!unwrapped.isFunctionType())
8013 S.
Diag(
attr.getLoc(), diag::err_attribute_wrong_decl_type)
8014 <<
attr <<
attr.isRegularKeywordAttribute()
8024 FnTy->getParamTypes(), EPI);
8029 if (
attr.getKind() == ParsedAttr::AT_ArmStreaming ||
8030 attr.getKind() == ParsedAttr::AT_ArmStreamingCompatible ||
8031 attr.getKind() == ParsedAttr::AT_ArmPreserves ||
8032 attr.getKind() == ParsedAttr::AT_ArmIn ||
8033 attr.getKind() == ParsedAttr::AT_ArmOut ||
8034 attr.getKind() == ParsedAttr::AT_ArmInOut ||
8035 attr.getKind() == ParsedAttr::AT_ArmAgnostic) {
8039 if (
attr.getKind() == ParsedAttr::AT_ArmStreaming ||
8040 attr.getKind() == ParsedAttr::AT_ArmStreamingCompatible)
8044 if (!unwrapped.isFunctionType())
8051 S.
Diag(
attr.getLoc(), diag::warn_attribute_wrong_decl_type)
8052 <<
attr <<
attr.isRegularKeywordAttribute()
8059 switch (
attr.getKind()) {
8060 case ParsedAttr::AT_ArmStreaming:
8062 ParsedAttr::AT_ArmStreamingCompatible))
8066 case ParsedAttr::AT_ArmStreamingCompatible:
8071 case ParsedAttr::AT_ArmPreserves:
8075 case ParsedAttr::AT_ArmIn:
8079 case ParsedAttr::AT_ArmOut:
8083 case ParsedAttr::AT_ArmInOut:
8087 case ParsedAttr::AT_ArmAgnostic:
8092 llvm_unreachable(
"Unsupported attribute");
8096 FnTy->getParamTypes(), EPI);
8101 if (
attr.getKind() == ParsedAttr::AT_NoThrow) {
8103 if (!unwrapped.isFunctionType())
8116 if (Proto->hasExceptionSpec()) {
8117 switch (Proto->getExceptionSpecType()) {
8119 llvm_unreachable(
"This doesn't have an exception spec!");
8137 S.
Diag(
attr.getLoc(), diag::warn_nothrow_attribute_ignored);
8143 type = unwrapped.wrap(
8152 if (
attr.getKind() == ParsedAttr::AT_NonBlocking ||
8153 attr.getKind() == ParsedAttr::AT_NonAllocating ||
8154 attr.getKind() == ParsedAttr::AT_Blocking ||
8155 attr.getKind() == ParsedAttr::AT_Allocating) {
8160 if (!unwrapped.isFunctionType())
return false;
8175 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8178 <<
attr.isRegularKeywordAttribute();
8197 return S.
Diag(
attr.getLoc(), diag::warn_cconv_unsupported)
8202 return S.
Diag(
attr.getLoc(), diag::err_cconv_varargs)
8209 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8211 <<
attr.isRegularKeywordAttribute();
8223 auto EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
8232 const AttributedType *AT;
8236 while ((AT =
T->getAs<AttributedType>()) &&
8238 if (AT->isCallingConv())
8240 T = AT->getModifiedType();
8247 FunctionTypeUnwrapper Unwrapped(*
this,
T);
8253 Context.getDefaultCallingConvention(IsVariadic, HasThisPointer);
8260 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() && IsCtorOrDtor) {
8264 Diag(Loc, diag::warn_cconv_unsupported)
8273 Context.getDefaultCallingConvention(IsVariadic, !HasThisPointer);
8275 if (CurCC != DefaultCC)
8283 QualType Wrapped = Unwrapped.wrap(*
this, FT);
8284 T =
Context.getAdjustedType(
T, Wrapped);
8297 if (
Attr.getNumArgs() != 1) {
8304 Expr *SizeExpr =
Attr.getArgAsExpr(0);
8317 if (
Attr.getNumArgs() != 1) {
8323 Expr *SizeExpr =
Attr.getArgAsExpr(0);
8338 bool IsPolyUnsigned = Triple.getArch() == llvm::Triple::aarch64 ||
8339 Triple.getArch() == llvm::Triple::aarch64_32 ||
8340 Triple.getArch() == llvm::Triple::aarch64_be;
8342 if (IsPolyUnsigned) {
8344 return BTy->
getKind() == BuiltinType::UChar ||
8345 BTy->
getKind() == BuiltinType::UShort ||
8346 BTy->
getKind() == BuiltinType::ULong ||
8347 BTy->
getKind() == BuiltinType::ULongLong;
8350 return BTy->
getKind() == BuiltinType::SChar ||
8351 BTy->
getKind() == BuiltinType::Short ||
8352 BTy->
getKind() == BuiltinType::LongLong;
8358 if ((Triple.isArch64Bit() || Triple.getArch() == llvm::Triple::aarch64_32) &&
8359 BTy->
getKind() == BuiltinType::Double)
8362 return BTy->
getKind() == BuiltinType::SChar ||
8363 BTy->
getKind() == BuiltinType::UChar ||
8364 BTy->
getKind() == BuiltinType::Short ||
8365 BTy->
getKind() == BuiltinType::UShort ||
8366 BTy->
getKind() == BuiltinType::Int ||
8367 BTy->
getKind() == BuiltinType::UInt ||
8368 BTy->
getKind() == BuiltinType::Long ||
8369 BTy->
getKind() == BuiltinType::ULong ||
8370 BTy->
getKind() == BuiltinType::LongLong ||
8371 BTy->
getKind() == BuiltinType::ULongLong ||
8372 BTy->
getKind() == BuiltinType::Float ||
8373 BTy->
getKind() == BuiltinType::Half ||
8374 BTy->
getKind() == BuiltinType::BFloat16 ||
8375 BTy->
getKind() == BuiltinType::MFloat8;
8379 llvm::APSInt &Result) {
8380 const auto *AttrExpr =
Attr.getArgAsExpr(0);
8381 if (!AttrExpr->isTypeDependent()) {
8382 if (std::optional<llvm::APSInt> Res =
8383 AttrExpr->getIntegerConstantExpr(S.
Context)) {
8425 if (
Attr.getNumArgs() != 1) {
8426 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8432 llvm::APSInt numEltsInt(32);
8438 S.
Diag(
Attr.
getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
8445 unsigned numElts =
static_cast<unsigned>(numEltsInt.getZExtValue());
8446 unsigned vecSize = typeSize * numElts;
8447 if (vecSize != 64 && vecSize != 128) {
8448 S.
Diag(
Attr.
getLoc(), diag::err_attribute_bad_neon_vector_size) << CurType;
8460 assert((
Attr.getNumArgs() > 0 &&
Attr.getNumArgs() <= 3) &&
8461 "__ptrauth qualifier takes between 1 and 3 arguments");
8462 Expr *KeyArg =
Attr.getArgAsExpr(0);
8463 Expr *IsAddressDiscriminatedArg =
8464 Attr.getNumArgs() >= 2 ?
Attr.getArgAsExpr(1) :
nullptr;
8465 Expr *ExtraDiscriminatorArg =
8466 Attr.getNumArgs() >= 3 ?
Attr.getArgAsExpr(2) :
nullptr;
8475 bool IsInvalid =
false;
8476 unsigned IsAddressDiscriminated, ExtraDiscriminator;
8479 IsAddressDiscriminated);
8488 if (!
T->isSignableType(Ctx) && !
T->isDependentType()) {
8489 S.
Diag(
Attr.
getLoc(), diag::err_ptrauth_qualifier_invalid_target) <<
T;
8494 if (
T.getPointerAuth()) {
8506 assert((!IsAddressDiscriminatedArg || IsAddressDiscriminated <= 1) &&
8507 "address discriminator arg should be either 0 or 1");
8509 Key, IsAddressDiscriminated, ExtraDiscriminator,
8531 S.
Diag(
Attr.
getLoc(), diag::err_attribute_arm_feature_sve_bits_unsupported)
8538 if (
Attr.getNumArgs() != 1) {
8539 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8546 llvm::APSInt SveVectorSizeInBits(32);
8550 unsigned VecSize =
static_cast<unsigned>(SveVectorSizeInBits.getZExtValue());
8573 if (BT->getKind() == BuiltinType::SveBool) {
8578 VecSize /= TypeSize;
8585 const VectorType *VT = dyn_cast<VectorType>(CurType);
8588 diag::err_attribute_arm_mve_polymorphism);
8595 State.getSema().Context,
Attr),
8607 <<
Attr <<
"'zve32x'";
8614 if (!VScale || !VScale->first || VScale->first != VScale->second) {
8615 S.
Diag(
Attr.
getLoc(), diag::err_attribute_riscv_rvv_bits_unsupported)
8622 if (
Attr.getNumArgs() != 1) {
8623 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8630 llvm::APSInt RVVVectorSizeInBits(32);
8642 unsigned VecSize =
static_cast<unsigned>(RVVVectorSizeInBits.getZExtValue());
8646 unsigned MinElts = Info.
EC.getKnownMinValue();
8649 unsigned ExpectedSize = VScale->first * MinElts;
8671 ExpectedSize *= EltSize;
8672 NumElts = VecSize / EltSize;
8676 if (VecSize != ExpectedSize) {
8678 << VecSize << ExpectedSize;
8691 S.
Diag(
Attr.
getLoc(), diag::err_opencl_invalid_access_qualifier);
8697 QualType BaseTy = TypedefTy->desugar();
8699 std::string PrevAccessQual;
8701 if (TypedefTy->getDecl()->hasAttr<OpenCLAccessAttr>()) {
8702 OpenCLAccessAttr *
Attr =
8703 TypedefTy->getDecl()->getAttr<OpenCLAccessAttr>();
8706 PrevAccessQual =
"read_only";
8710 switch (ImgType->getKind()) {
8711 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8712 case BuiltinType::Id: \
8713 PrevAccessQual = #Access; \
8715 #include "clang/Basic/OpenCLImageTypes.def"
8717 llvm_unreachable(
"Unable to find corresponding image type.");
8720 llvm_unreachable(
"unexpected type");
8723 if (PrevAccessQual == AttrName.ltrim(
"_")) {
8729 S.
Diag(
Attr.
getLoc(), diag::err_opencl_multiple_access_qualifiers);
8732 S.
Diag(TypedefTy->getDecl()->getBeginLoc(),
8733 diag::note_opencl_typedef_access_qualifier) << PrevAccessQual;
8735 if (
Attr.getSemanticSpelling() == OpenCLAccessAttr::Keyword_write_only) {
8750 if (
Attr.getNumArgs() != 2) {
8751 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8756 Expr *RowsExpr =
Attr.getArgAsExpr(0);
8757 Expr *ColsExpr =
Attr.getArgAsExpr(1);
8765 Sema &S = State.getSema();
8768 S.
Diag(PA.
getLoc(), diag::err_attribute_too_few_arguments) << PA << 1;
8780 for (
unsigned Idx = 1; Idx < PA.
getNumArgs(); Idx++) {
8786 auto *AnnotateTypeAttr =
8787 AnnotateTypeAttr::Create(S.
Context, Str, Args.data(), Args.size(), PA);
8788 CurType = State.getAttributedType(AnnotateTypeAttr, CurType, CurType);
8794 if (State.getDeclarator().isDeclarationOfFunction()) {
8795 CurType = State.getAttributedType(
8800 State.getSema().Diag(
Attr.
getLoc(), diag::err_attribute_wrong_decl_type)
8807 if (State.getDeclarator().isDeclarationOfFunction()) {
8808 auto *
Attr = State.getSema().ParseLifetimeCaptureByAttr(PA,
"this");
8810 CurType = State.getAttributedType(
Attr, CurType, CurType);
8822 if (
Attr.getSemanticSpelling() == HLSLParamModifierAttr::Keyword_inout ||
8823 Attr.getSemanticSpelling() == HLSLParamModifierAttr::Keyword_out) {
8824 State.setParsedHLSLParamMod(
true);
8833 state.setParsedNoDeref(
false);
8849 if (
attr.isInvalid())
8852 if (
attr.isStandardAttributeSyntax() ||
attr.isRegularKeywordAttribute()) {
8857 if (
attr.isGNUScope()) {
8858 assert(
attr.isStandardAttributeSyntax());
8859 bool IsTypeAttr =
attr.isTypeAttr();
8861 state.getSema().Diag(
attr.getLoc(),
8863 ? diag::warn_gcc_ignores_type_attr
8864 : diag::warn_cxx11_gnu_attribute_on_type)
8870 !
attr.isTypeAttr()) {
8883 switch (
attr.getKind()) {
8886 if ((
attr.isStandardAttributeSyntax() ||
8887 attr.isRegularKeywordAttribute()) &&
8889 state.getSema().Diag(
attr.getLoc(), diag::err_attribute_not_type_attr)
8890 <<
attr <<
attr.isRegularKeywordAttribute();
8891 attr.setUsedAsTypeAttr();
8896 if (
attr.isStandardAttributeSyntax()) {
8897 state.getSema().DiagnoseUnknownAttribute(
attr);
8907 case ParsedAttr::AT_BTFTypeTag:
8909 attr.setUsedAsTypeAttr();
8912 case ParsedAttr::AT_MayAlias:
8915 attr.setUsedAsTypeAttr();
8917 case ParsedAttr::AT_OpenCLPrivateAddressSpace:
8918 case ParsedAttr::AT_OpenCLGlobalAddressSpace:
8919 case ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace:
8920 case ParsedAttr::AT_OpenCLGlobalHostAddressSpace:
8921 case ParsedAttr::AT_OpenCLLocalAddressSpace:
8922 case ParsedAttr::AT_OpenCLConstantAddressSpace:
8923 case ParsedAttr::AT_OpenCLGenericAddressSpace:
8924 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
8925 case ParsedAttr::AT_AddressSpace:
8927 attr.setUsedAsTypeAttr();
8932 attr.setUsedAsTypeAttr();
8934 case ParsedAttr::AT_VectorSize:
8936 attr.setUsedAsTypeAttr();
8938 case ParsedAttr::AT_ExtVectorType:
8940 attr.setUsedAsTypeAttr();
8942 case ParsedAttr::AT_NeonVectorType:
8944 attr.setUsedAsTypeAttr();
8946 case ParsedAttr::AT_NeonPolyVectorType:
8949 attr.setUsedAsTypeAttr();
8951 case ParsedAttr::AT_ArmSveVectorBits:
8953 attr.setUsedAsTypeAttr();
8955 case ParsedAttr::AT_ArmMveStrictPolymorphism: {
8957 attr.setUsedAsTypeAttr();
8960 case ParsedAttr::AT_RISCVRVVVectorBits:
8962 attr.setUsedAsTypeAttr();
8964 case ParsedAttr::AT_OpenCLAccess:
8966 attr.setUsedAsTypeAttr();
8968 case ParsedAttr::AT_PointerAuth:
8971 attr.setUsedAsTypeAttr();
8973 case ParsedAttr::AT_LifetimeBound:
8977 case ParsedAttr::AT_LifetimeCaptureBy:
8982 case ParsedAttr::AT_NoDeref: {
8987 if (
attr.isStandardAttributeSyntax()) {
8988 state.getSema().Diag(
attr.getLoc(), diag::warn_attribute_ignored)
8995 attr.setUsedAsTypeAttr();
8996 state.setParsedNoDeref(
true);
9000 case ParsedAttr::AT_MatrixType:
9002 attr.setUsedAsTypeAttr();
9005 case ParsedAttr::AT_WebAssemblyFuncref: {
9007 attr.setUsedAsTypeAttr();
9011 case ParsedAttr::AT_HLSLParamModifier: {
9013 attr.setUsedAsTypeAttr();
9017 case ParsedAttr::AT_SwiftAttr: {
9024 attr.setUsedAsTypeAttr();
9032 if (
type->canHaveNullability() ||
type->isDependentType() ||
9033 type->isArrayType() ||
9037 endIndex = state.getCurrentChunkIndex();
9039 endIndex = state.getDeclarator().getNumTypeObjects();
9040 bool allowOnArrayType =
9041 state.getDeclarator().isPrototypeContext() &&
9044 allowOnArrayType)) {
9048 attr.setUsedAsTypeAttr();
9052 case ParsedAttr::AT_ObjCKindOf:
9060 state.getSema().Diag(
attr.getLoc(),
9061 diag::err_objc_kindof_wrong_position)
9064 state.getDeclarator().getDeclSpec().getBeginLoc(),
9074 case ParsedAttr::AT_NoThrow:
9077 if (!state.getSema().getLangOpts().CPlusPlus)
9082 attr.setUsedAsTypeAttr();
9086 if (
attr.isStandardAttributeSyntax() ||
9087 attr.isRegularKeywordAttribute()) {
9104 case ParsedAttr::AT_AcquireHandle: {
9105 if (!
type->isFunctionType())
9108 if (
attr.getNumArgs() != 1) {
9109 state.getSema().Diag(
attr.getLoc(),
9110 diag::err_attribute_wrong_number_arguments)
9116 StringRef HandleType;
9117 if (!state.getSema().checkStringLiteralArgumentAttr(
attr, 0, HandleType))
9119 type = state.getAttributedType(
9120 AcquireHandleAttr::Create(state.getSema().Context, HandleType,
attr),
9122 attr.setUsedAsTypeAttr();
9125 case ParsedAttr::AT_AnnotateType: {
9127 attr.setUsedAsTypeAttr();
9130 case ParsedAttr::AT_HLSLResourceClass:
9131 case ParsedAttr::AT_HLSLROV:
9132 case ParsedAttr::AT_HLSLRawBuffer:
9133 case ParsedAttr::AT_HLSLContainedType: {
9138 state.getSema().HLSL().handleResourceTypeAttr(
type,
attr))
9139 attr.setUsedAsTypeAttr();
9147 !
type.getQualifiers().hasObjCLifetime() &&
9148 !
type.getQualifiers().hasObjCGCAttr() &&
9149 attr.getKind() != ParsedAttr::AT_ObjCGC &&
9150 attr.getKind() != ParsedAttr::AT_ObjCOwnership) {
9152 type = state.getSema().Context.getMacroQualifiedType(
type, MacroII);
9153 state.setExpansionLocForMacroQualifiedType(
9155 attr.getMacroExpansionLoc());
9162 if (
VarDecl *Var = dyn_cast<VarDecl>(DRE->getDecl())) {
9164 auto *Def = Var->getDefinition();
9170 Def = Var->getDefinition();
9177 if (Var->getPointOfInstantiation().isInvalid() && Def) {
9178 assert(Var->getTemplateSpecializationKind() ==
9180 "explicit instantiation with no point of instantiation");
9181 Var->setTemplateSpecializationKind(
9182 Var->getTemplateSpecializationKind(), PointOfInstantiation);
9202 if (
const auto CastE = dyn_cast<ExplicitCastExpr>(E)) {
9203 QualType DestType = CastE->getTypeAsWritten();
9204 if (
const auto *IAT =
Context.getAsIncompleteArrayType(DestType)) {
9209 IAT->getElementType(),
9246 if (RequireCompleteTypeImpl(Loc,
T, Kind, &Diagnoser))
9248 if (
auto *TD =
T->getAsTagDecl(); TD && !TD->isCompleteDefinitionRequired()) {
9249 TD->setCompleteDefinitionRequired();
9250 Consumer.HandleTagDeclRequiredDefinition(TD);
9282 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
9283 if (
auto *Pattern = RD->getTemplateInstantiationPattern())
9285 D = RD->getDefinition();
9286 }
else if (
auto *ED = dyn_cast<EnumDecl>(D)) {
9287 if (
auto *Pattern = ED->getTemplateInstantiationPattern())
9289 if (OnlyNeedComplete && (ED->isFixed() ||
getLangOpts().MSVCCompat)) {
9295 *Suggested =
nullptr;
9296 for (
auto *Redecl : ED->redecls()) {
9299 if (Redecl->isThisDeclarationADefinition() ||
9300 (Redecl->isCanonicalDecl() && !*Suggested))
9301 *Suggested = Redecl;
9306 D = ED->getDefinition();
9307 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
9308 if (
auto *Pattern = FD->getTemplateInstantiationPattern())
9310 D = FD->getDefinition();
9311 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
9312 if (
auto *Pattern = VD->getTemplateInstantiationPattern())
9314 D = VD->getDefinition();
9317 assert(D &&
"missing definition for pattern of instantiated definition");
9321 auto DefinitionIsAcceptable = [&] {
9341 if (DefinitionIsAcceptable())
9346 if (
auto *Source =
Context.getExternalSource()) {
9347 Source->CompleteRedeclChain(D);
9348 return DefinitionIsAcceptable();
9364 bool OnlyNeedComplete) {
9381 bool OnlyNeedComplete) {
9389 if (!RD->
hasAttr<MSInheritanceAttr>()) {
9391 bool BestCase =
false;
9411 RD->
addAttr(MSInheritanceAttr::CreateImplicit(
9412 S.
getASTContext(), BestCase, Loc, MSInheritanceAttr::Spelling(IM)));
9418 CompleteTypeKind Kind,
9419 TypeDiagnoser *Diagnoser) {
9428 if (
const auto *MPTy = dyn_cast<MemberPointerType>(
T.getCanonicalType())) {
9429 if (CXXRecordDecl *RD = MPTy->getMostRecentCXXRecordDecl();
9430 RD && !RD->isDependentType()) {
9432 if (
getLangOpts().CompleteMemberPointers && !RD->isBeingDefined() &&
9438 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
9445 NamedDecl *Def =
nullptr;
9457 NamedDecl *Suggested =
nullptr;
9463 if (Diagnoser && Suggested)
9466 return !TreatAsComplete;
9470 TempInst.Template = Def;
9471 TempInst.Entity = Def;
9472 TempInst.PointOfInstantiation = Loc;
9480 TagDecl *
Tag = dyn_cast_or_null<TagDecl>(Def);
9481 ObjCInterfaceDecl *IFace = dyn_cast_or_null<ObjCInterfaceDecl>(Def);
9493 if (
auto *Source =
Context.getExternalSource()) {
9494 if (Tag &&
Tag->hasExternalLexicalStorage())
9495 Source->CompleteType(Tag);
9497 Source->CompleteType(IFace);
9501 return RequireCompleteTypeImpl(Loc,
T, Kind, Diagnoser);
9508 if (
auto *RD = dyn_cast_or_null<CXXRecordDecl>(Tag)) {
9509 bool Instantiated =
false;
9510 bool Diagnosed =
false;
9511 if (RD->isDependentContext()) {
9515 }
else if (
auto *ClassTemplateSpec =
9516 dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
9517 if (ClassTemplateSpec->getSpecializationKind() ==
TSK_Undeclared) {
9521 Diagnoser, ClassTemplateSpec->hasStrictPackMatch());
9523 Instantiated =
true;
9526 CXXRecordDecl *Pattern = RD->getInstantiatedFromMemberClass();
9527 if (!RD->isBeingDefined() && Pattern) {
9528 MemberSpecializationInfo *MSI = RD->getMemberSpecializationInfo();
9529 assert(MSI &&
"Missing member specialization information?");
9539 Instantiated =
true;
9547 if (Diagnoser && Diagnosed)
9553 return RequireCompleteTypeImpl(Loc,
T, Kind, Diagnoser);
9563 Diagnoser->diagnose(*
this, Loc,
T);
9567 if (Tag && !
Tag->isInvalidDecl() && !
Tag->getLocation().isInvalid())
9568 Diag(
Tag->getLocation(),
Tag->isBeingDefined()
9569 ? diag::note_type_being_defined
9570 : diag::note_forward_declaration)
9571 <<
Context.getCanonicalTagType(Tag);
9604 default: llvm_unreachable(
"Invalid tag kind for literal type diagnostic!");
9610 assert(!
T->isDependentType() &&
"type should not be dependent");
9619 if (
T->isVariableArrayType())
9635 Diag(RD->getLocation(), diag::note_non_literal_lambda);
9643 if (RD->getNumVBases()) {
9644 Diag(RD->getLocation(), diag::note_non_literal_virtual_base)
9646 for (
const auto &I : RD->vbases())
9647 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
9648 << I.getSourceRange();
9649 }
else if (!RD->isAggregate() && !RD->hasConstexprNonCopyMoveConstructor() &&
9650 !RD->hasTrivialDefaultConstructor()) {
9651 Diag(RD->getLocation(), diag::note_non_literal_no_constexpr_ctors) << RD;
9652 }
else if (RD->hasNonLiteralTypeFieldsOrBases()) {
9653 for (
const auto &I : RD->bases()) {
9654 if (!I.getType()->isLiteralType(
Context)) {
9655 Diag(I.getBeginLoc(), diag::note_non_literal_base_class)
9656 << RD << I.getType() << I.getSourceRange();
9660 for (
const auto *I : RD->fields()) {
9661 if (!I->getType()->isLiteralType(
Context) ||
9662 I->getType().isVolatileQualified()) {
9663 Diag(I->getLocation(), diag::note_non_literal_field)
9664 << RD << I << I->getType()
9665 << I->getType().isVolatileQualified();
9670 : !RD->hasTrivialDestructor()) {
9675 assert(Dtor &&
"class has literal fields and bases but no dtor?");
9684 ? diag::note_non_literal_user_provided_dtor
9685 : diag::note_non_literal_nontrivial_dtor)
9711 if (
const TagType *TT =
T->getAs<TagType>())
9714 return Context.getTypeOfExprType(E, Kind);
9735 return Context.getCountAttributedType(WrappedTy, CountExpr, CountInBytes,
9745 if (
auto *ImplCastExpr = dyn_cast<ImplicitCastExpr>(E))
9746 IDExpr = ImplCastExpr->getSubExpr();
9748 if (
auto *PackExpr = dyn_cast<PackIndexingExpr>(E)) {
9750 IDExpr = PackExpr->getPackIdExpression();
9752 IDExpr = PackExpr->getSelectedExpr();
9768 if (
const auto *SNTTPE = dyn_cast<SubstNonTypeTemplateParmExpr>(IDExpr))
9769 return SNTTPE->getParameterType(
Context);
9777 if (
const auto *DRE = dyn_cast<DeclRefExpr>(IDExpr)) {
9782 if (
const auto *ME = dyn_cast<MemberExpr>(IDExpr)) {
9783 if (
const auto *VD = ME->getMemberDecl())
9785 return VD->getType();
9786 }
else if (
const auto *IR = dyn_cast<ObjCIvarRefExpr>(IDExpr)) {
9787 return IR->getDecl()->getType();
9788 }
else if (
const auto *PR = dyn_cast<ObjCPropertyRefExpr>(IDExpr)) {
9789 if (PR->isExplicitProperty())
9790 return PR->getExplicitProperty()->getType();
9791 }
else if (
const auto *PE = dyn_cast<PredefinedExpr>(IDExpr)) {
9792 return PE->getType();
9803 if (
auto *DRE = dyn_cast<DeclRefExpr>(IDExpr->
IgnoreParens())) {
9804 if (
auto *Var = dyn_cast<VarDecl>(DRE->getDecl())) {
9807 return Context.getLValueReferenceType(
T);
9812 return Context.getReferenceQualifiedType(E);
9824 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
9837 Diag(Loc, diag::err_expected_name_of_pack) << Pattern;
9843 : diag::ext_pack_indexing);
9850 bool FullySubstituted,
9861 IndexExpr = Res.
get();
9862 int64_t
V =
Value.getExtValue();
9863 if (FullySubstituted && (
V < 0 || V >= int64_t(Expansions.size()))) {
9865 <<
V << Pattern << Expansions.size();
9868 Index =
static_cast<unsigned>(
V);
9871 return Context.getPackIndexingType(Pattern, IndexExpr, FullySubstituted,
9877 assert(BaseType->isEnumeralType());
9878 EnumDecl *ED = BaseType->castAs<EnumType>()->getDecl();
9883 if (Underlying.
isNull()) {
9889 assert(!Underlying.
isNull());
9897 if (!BaseType->isEnumeralType()) {
9898 Diag(Loc, diag::err_only_enums_have_underlying_types);
9905 if (BaseType->isIncompleteType(&FwdDecl)) {
9906 Diag(Loc, diag::err_underlying_type_of_incomplete_enum) << BaseType;
9907 Diag(FwdDecl->
getLocation(), diag::note_forward_declaration) << FwdDecl;
9915 QualType Pointer = BaseType.isReferenceable() || BaseType->isVoidType()
9924 if (!BaseType->isAnyPointerType())
9933 return Context.getDecayedType(Underlying);
9942 Split.Quals.removeCVRQualifiers();
9943 return Context.getQualifiedType(Split);
9950 BaseType.isReferenceable()
9952 UKind == UnaryTransformType::AddLvalueReference,
9960 if (UKind == UnaryTransformType::RemoveAllExtents)
9961 return Context.getBaseElementType(BaseType);
9963 if (
const auto *AT =
Context.getAsArrayType(BaseType))
9964 return AT->getElementType();
9972 QualType T = BaseType.getNonReferenceType();
9973 if (UKind == UTTKind::RemoveCVRef &&
9974 (
T.isConstQualified() ||
T.isVolatileQualified())) {
9979 T =
Context.getQualifiedType(Unqual, Quals);
9986 if ((BaseType->isReferenceType() && UKind != UTTKind::RemoveRestrict) ||
9987 BaseType->isFunctionType())
9993 if (UKind == UTTKind::RemoveConst || UKind == UTTKind::RemoveCV)
9995 if (UKind == UTTKind::RemoveVolatile || UKind == UTTKind::RemoveCV)
9997 if (UKind == UTTKind::RemoveRestrict)
10000 return Context.getQualifiedType(Unqual, Quals);
10006 if (BaseType->isEnumeralType()) {
10008 if (
auto *
BitInt = dyn_cast<BitIntType>(Underlying)) {
10009 unsigned int Bits =
BitInt->getNumBits();
10013 S.
Diag(Loc, diag::err_make_signed_integral_only)
10014 << IsMakeSigned <<
true << BaseType << 1 << Underlying;
10018 S.
Diag(Loc, diag::err_make_signed_integral_only)
10019 << IsMakeSigned <<
false << BaseType << 1
10026 std::array<CanQualType *, 6> AllSignedIntegers = {
10030 AllSignedIntegers.data(), AllSignedIntegers.size() - Int128Unsupported);
10031 std::array<CanQualType *, 6> AllUnsignedIntegers = {
10036 AllUnsignedIntegers.size() -
10037 Int128Unsupported);
10039 IsMakeSigned ? &AvailableSignedIntegers : &AvailableUnsignedIntegers;
10043 llvm::find_if(*Consider, [&S, BaseSize](
const CanQual<Type> *
T) {
10047 assert(Result != Consider->end());
10048 return QualType((*Result)->getTypePtr(), 0);
10053 bool IsMakeSigned = UKind == UnaryTransformType::MakeSigned;
10054 if ((!BaseType->isIntegerType() && !BaseType->isEnumeralType()) ||
10055 BaseType->isBooleanType() ||
10056 (BaseType->isBitIntType() &&
10058 Diag(Loc, diag::err_make_signed_integral_only)
10059 << IsMakeSigned << BaseType->isBitIntType() << BaseType << 0;
10063 bool IsNonIntIntegral =
10064 BaseType->
isChar16Type() || BaseType->isChar32Type() ||
10065 BaseType->isWideCharType() || BaseType->isEnumeralType();
10070 : IsMakeSigned ?
Context.getCorrespondingSignedType(BaseType)
10071 :
Context.getCorrespondingUnsignedType(BaseType);
10072 if (Underlying.
isNull())
10078 bool CheckNothrow) {
10086 Loc, From, diag::err_incomplete_type_used_in_type_trait_expr)) ||
10089 diag::err_incomplete_type_used_in_type_trait_expr)))
10140 Expr *FromExprPtr = &FromExpr;
10154 if (BaseType->isDependentType())
10155 return Context.getUnaryTransformType(BaseType, BaseType, UKind);
10158 case UnaryTransformType::EnumUnderlyingType: {
10162 case UnaryTransformType::AddPointer: {
10166 case UnaryTransformType::RemovePointer: {
10170 case UnaryTransformType::Decay: {
10174 case UnaryTransformType::AddLvalueReference:
10175 case UnaryTransformType::AddRvalueReference: {
10179 case UnaryTransformType::RemoveAllExtents:
10180 case UnaryTransformType::RemoveExtent: {
10184 case UnaryTransformType::RemoveCVRef:
10185 case UnaryTransformType::RemoveReference: {
10189 case UnaryTransformType::RemoveConst:
10190 case UnaryTransformType::RemoveCV:
10191 case UnaryTransformType::RemoveRestrict:
10192 case UnaryTransformType::RemoveVolatile: {
10196 case UnaryTransformType::MakeSigned:
10197 case UnaryTransformType::MakeUnsigned: {
10215 int DisallowedKind = -1;
10216 if (
T->isArrayType())
10217 DisallowedKind = 1;
10218 else if (
T->isFunctionType())
10219 DisallowedKind = 2;
10220 else if (
T->isReferenceType())
10221 DisallowedKind = 3;
10222 else if (
T->isAtomicType())
10223 DisallowedKind = 4;
10224 else if (
T.hasQualifiers())
10225 DisallowedKind = 5;
10226 else if (
T->isSizelessType())
10227 DisallowedKind = 6;
10230 DisallowedKind = 7;
10231 else if (
T->isBitIntType())
10232 DisallowedKind = 8;
10235 DisallowedKind = 9;
10237 if (DisallowedKind != -1) {
10238 Diag(Loc, diag::err_atomic_specifier_bad_type) << DisallowedKind <<
T;
Defines the clang::ASTContext interface.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
Defines the clang::Preprocessor interface.
static QualType getUnderlyingType(const SubRegion *R)
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
static void HandleNeonVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S, VectorKind VecKind)
HandleNeonVectorTypeAttr - The "neon_vector_type" and "neon_polyvector_type" attributes are used to c...
static QualType deduceOpenCLPointeeAddrSpace(Sema &S, QualType PointeeType)
static bool isPermittedNeonBaseType(QualType &Ty, VectorKind VecKind, Sema &S)
static void distributeObjCPointerTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType type)
Given that an objc_gc attribute was written somewhere on a declaration other than on the declarator i...
static void maybeSynthesizeBlockSignature(TypeProcessingState &state, QualType declSpecType)
Add a synthetic '()' to a block-literal declarator if it is required, given the return type.
#define MS_TYPE_ATTRS_CASELIST
#define CALLING_CONV_ATTRS_CASELIST
static void emitNullabilityConsistencyWarning(Sema &S, SimplePointerKind PointerKind, SourceLocation PointerLoc, SourceLocation PointerEndLoc)
static void fixItNullability(Sema &S, DiagBuilderT &Diag, SourceLocation PointerLoc, NullabilityKind Nullability)
Creates a fix-it to insert a C-style nullability keyword at pointerLoc, taking into account whitespac...
static ExprResult checkArraySize(Sema &S, Expr *&ArraySize, llvm::APSInt &SizeVal, unsigned VLADiag, bool VLAIsError)
Check whether the specified array bound can be evaluated using the relevant language rules.
static Attr * createNullabilityAttr(ASTContext &Ctx, ParsedAttr &Attr, NullabilityKind NK)
static void HandleVectorSizeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S)
HandleVectorSizeAttribute - this attribute is only applicable to integral and float scalars,...
static void inferARCWriteback(TypeProcessingState &state, QualType &declSpecType)
Given that this is the declaration of a parameter under ARC, attempt to infer attributes and such for...
static TypeSourceInfo * GetTypeSourceInfoForDeclarator(TypeProcessingState &State, QualType T, TypeSourceInfo *ReturnTypeInfo)
Create and instantiate a TypeSourceInfo with type source information.
static bool BuildAddressSpaceIndex(Sema &S, LangAS &ASIdx, const Expr *AddrSpace, SourceLocation AttrLoc)
Build an AddressSpace index from a constant expression and diagnose any errors related to invalid add...
static void HandleBTFTypeTagAttribute(QualType &Type, const ParsedAttr &Attr, TypeProcessingState &State)
static void transferARCOwnershipToDeclaratorChunk(TypeProcessingState &state, Qualifiers::ObjCLifetime ownership, unsigned chunkIndex)
static bool handleObjCGCTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type)
handleObjCGCTypeAttr - Process the attribute((objc_gc)) type attribute on the specified type.
static void fillAtomicQualLoc(AtomicTypeLoc ATL, const DeclaratorChunk &Chunk)
static void HandleExtVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S)
Process the OpenCL-like ext_vector_type attribute when it occurs on a type.
static void HandleHLSLParamModifierAttr(TypeProcessingState &State, QualType &CurType, const ParsedAttr &Attr, Sema &S)
static void HandleLifetimeBoundAttr(TypeProcessingState &State, QualType &CurType, ParsedAttr &Attr)
static bool handleArmStateAttribute(Sema &S, FunctionProtoType::ExtProtoInfo &EPI, ParsedAttr &Attr, FunctionType::ArmStateValue State)
static bool handleArmAgnosticAttribute(Sema &S, FunctionProtoType::ExtProtoInfo &EPI, ParsedAttr &Attr)
static void distributeFunctionTypeAttrFromDeclSpec(TypeProcessingState &state, ParsedAttr &attr, QualType &declSpecType, CUDAFunctionTarget CFT)
A function type attribute was written in the decl spec.
static bool handleObjCPointerTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type)
static QualType inferARCLifetimeForPointee(Sema &S, QualType type, SourceLocation loc, bool isReference)
Given that we're building a pointer or reference to the given.
static bool handleNonBlockingNonAllocatingTypeAttr(TypeProcessingState &TPState, ParsedAttr &PAttr, QualType &QT, FunctionTypeUnwrapper &Unwrapped)
static QualType ChangeIntegralSignedness(Sema &S, QualType BaseType, bool IsMakeSigned, SourceLocation Loc)
static bool CheckNullabilityTypeSpecifier(Sema &S, TypeProcessingState *State, ParsedAttr *PAttr, QualType &QT, NullabilityKind Nullability, SourceLocation NullabilityLoc, bool IsContextSensitive, bool AllowOnArrayType, bool OverrideExisting)
#define OBJC_POINTER_TYPE_ATTRS_CASELIST
static void diagnoseBadTypeAttribute(Sema &S, const ParsedAttr &attr, QualType type)
diagnoseBadTypeAttribute - Diagnoses a type attribute which doesn't apply to the given type.
static PointerDeclaratorKind classifyPointerDeclarator(Sema &S, QualType type, Declarator &declarator, PointerWrappingDeclaratorKind &wrappingKind)
Classify the given declarator, whose type-specified is type, based on what kind of pointer it refers ...
static bool verifyValidIntegerConstantExpr(Sema &S, const ParsedAttr &Attr, llvm::APSInt &Result)
static void HandleSwiftAttr(TypeProcessingState &State, TypeAttrLocation TAL, QualType &QT, ParsedAttr &PAttr)
static bool handleMSPointerTypeQualifierAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type)
static bool shouldHaveNullability(QualType T)
static void HandleArmMveStrictPolymorphismAttr(TypeProcessingState &State, QualType &CurType, ParsedAttr &Attr)
static void warnAboutAmbiguousFunction(Sema &S, Declarator &D, DeclaratorChunk &DeclType, QualType RT)
Produce an appropriate diagnostic for an ambiguity between a function declarator and a C++ direct-ini...
static void distributeObjCPointerTypeAttrFromDeclarator(TypeProcessingState &state, ParsedAttr &attr, QualType &declSpecType)
Distribute an objc_gc type attribute that was written on the declarator.
static FileID getNullabilityCompletenessCheckFileID(Sema &S, SourceLocation loc)
static void HandleArmSveVectorBitsTypeAttr(QualType &CurType, ParsedAttr &Attr, Sema &S)
HandleArmSveVectorBitsTypeAttr - The "arm_sve_vector_bits" attribute is used to create fixed-length v...
#define FUNCTION_TYPE_ATTRS_CASELIST
static void HandleLifetimeCaptureByAttr(TypeProcessingState &State, QualType &CurType, ParsedAttr &PA)
static bool distributeNullabilityTypeAttr(TypeProcessingState &state, QualType type, ParsedAttr &attr)
Distribute a nullability type attribute that cannot be applied to the type specifier to a pointer,...
static void distributeTypeAttrsFromDeclarator(TypeProcessingState &state, QualType &declSpecType, CUDAFunctionTarget CFT)
Given that there are attributes written on the declarator or declaration itself, try to distribute an...
static void fillHLSLAttributedResourceTypeLoc(HLSLAttributedResourceTypeLoc TL, TypeProcessingState &State)
static bool isDependentOrGNUAutoType(QualType T)
static void distributeFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType type)
A function type attribute was written somewhere in a declaration other than on the declarator itself ...
static void HandleMatrixTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S)
HandleMatrixTypeAttr - "matrix_type" attribute, like ext_vector_type.
static bool HandleWebAssemblyFuncrefAttr(TypeProcessingState &State, QualType &QT, ParsedAttr &PAttr)
static bool hasOuterPointerLikeChunk(const Declarator &D, unsigned endIndex)
Returns true if any of the declarator chunks before endIndex include a level of indirection: array,...
static void HandleOpenCLAccessAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S)
Handle OpenCL Access Qualifier Attribute.
static NullabilityKind mapNullabilityAttrKind(ParsedAttr::Kind kind)
Map a nullability attribute kind to a nullability kind.
static bool distributeFunctionTypeAttrToInnermost(TypeProcessingState &state, ParsedAttr &attr, ParsedAttributesView &attrList, QualType &declSpecType, CUDAFunctionTarget CFT)
Try to distribute a function type attribute to the innermost function chunk or type.
#define NULLABILITY_TYPE_ATTRS_CASELIST
static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, TypeSourceInfo *&ReturnTypeInfo)
static void checkNullabilityConsistency(Sema &S, SimplePointerKind pointerKind, SourceLocation pointerLoc, SourceLocation pointerEndLoc=SourceLocation())
Complains about missing nullability if the file containing pointerLoc has other uses of nullability (...
static void transferARCOwnership(TypeProcessingState &state, QualType &declSpecTy, Qualifiers::ObjCLifetime ownership)
Used for transferring ownership in casts resulting in l-values.
static std::string getPrintableNameForEntity(DeclarationName Entity)
static std::string getFunctionQualifiersAsString(const FunctionProtoType *FnTy)
static QualType rebuildAttributedTypeWithoutNullability(ASTContext &Ctx, QualType Type)
Rebuild an attributed type without the nullability attribute on it.
static DeclaratorChunk * maybeMovePastReturnType(Declarator &declarator, unsigned i, bool onlyBlockPointers)
Given the index of a declarator chunk, check whether that chunk directly specifies the return type of...
static OpenCLAccessAttr::Spelling getImageAccess(const ParsedAttributesView &Attrs)
static void fillMatrixTypeLoc(MatrixTypeLoc MTL, const ParsedAttributesView &Attrs)
static UnaryTransformType::UTTKind TSTToUnaryTransformType(DeclSpec::TST SwitchTST)
static void HandleRISCVRVVVectorBitsTypeAttr(QualType &CurType, ParsedAttr &Attr, Sema &S)
HandleRISCVRVVVectorBitsTypeAttr - The "riscv_rvv_vector_bits" attribute is used to create fixed-leng...
static void HandleAddressSpaceTypeAttribute(QualType &Type, const ParsedAttr &Attr, TypeProcessingState &State)
HandleAddressSpaceTypeAttribute - Process an address_space attribute on the specified type.
static bool checkQualifiedFunction(Sema &S, QualType T, SourceLocation Loc, QualifiedFunctionKind QFK)
Check whether the type T is a qualified function type, and if it is, diagnose that it cannot be conta...
static bool checkOmittedBlockReturnType(Sema &S, Declarator &declarator, QualType Result)
Return true if this is omitted block return type.
static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T, const ParsedAttr &Attr, Sema &S)
Handle the __ptrauth qualifier.
static bool DiagnoseMultipleAddrSpaceAttributes(Sema &S, LangAS ASOld, LangAS ASNew, SourceLocation AttrLoc)
static void warnAboutRedundantParens(Sema &S, Declarator &D, QualType T)
Produce an appropriate diagnostic for a declarator with top-level parentheses.
static QualType ConvertDeclSpecToType(TypeProcessingState &state)
Convert the specified declspec to the appropriate type object.
static std::pair< QualType, TypeSourceInfo * > InventTemplateParameter(TypeProcessingState &state, QualType T, TypeSourceInfo *TrailingTSI, AutoType *Auto, InventedTemplateParameterInfo &Info)
static void distributeFunctionTypeAttrFromDeclarator(TypeProcessingState &state, ParsedAttr &attr, QualType &declSpecType, CUDAFunctionTarget CFT)
A function type attribute was written on the declarator or declaration.
static void diagnoseAndRemoveTypeQualifiers(Sema &S, const DeclSpec &DS, unsigned &TypeQuals, QualType TypeSoFar, unsigned RemoveTQs, unsigned DiagID)
static CallingConv getCCForDeclaratorChunk(Sema &S, Declarator &D, const ParsedAttributesView &AttrList, const DeclaratorChunk::FunctionTypeInfo &FTI, unsigned ChunkIndex)
Helper for figuring out the default CC for a function declarator type.
static unsigned getLiteralDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for literal type diagnostic message.
static void recordNullabilitySeen(Sema &S, SourceLocation loc)
Marks that a nullability feature has been used in the file containing loc.
static bool CheckBitIntElementType(Sema &S, SourceLocation AttrLoc, const BitIntType *BIT, bool ForMatrixType=false)
static void checkExtParameterInfos(Sema &S, ArrayRef< QualType > paramTypes, const FunctionProtoType::ExtProtoInfo &EPI, llvm::function_ref< SourceLocation(unsigned)> getParamLoc)
Check the extended parameter information.
static bool handleFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type, CUDAFunctionTarget CFT)
Process an individual function attribute.
static void transferARCOwnershipToDeclSpec(Sema &S, QualType &declSpecTy, Qualifiers::ObjCLifetime ownership)
static void BuildTypeCoupledDecls(Expr *E, llvm::SmallVectorImpl< TypeCoupledDeclRefInfo > &Decls)
static void assignInheritanceModel(Sema &S, CXXRecordDecl *RD)
Locks in the inheritance model for the given class and all of its bases.
static bool checkObjCKindOfType(TypeProcessingState &state, QualType &type, ParsedAttr &attr)
Check the application of the Objective-C '__kindof' qualifier to the given type.
static bool hasNullabilityAttr(const ParsedAttributesView &attrs)
Check whether there is a nullability attribute of any kind in the given attribute list.
static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type)
handleObjCOwnershipTypeAttr - Process an objc_ownership attribute on the specified type.
static void moveAttrFromListToList(ParsedAttr &attr, ParsedAttributesView &fromList, ParsedAttributesView &toList)
static void HandleAnnotateTypeAttr(TypeProcessingState &State, QualType &CurType, const ParsedAttr &PA)
static void fillAttributedTypeLoc(AttributedTypeLoc TL, TypeProcessingState &State)
static void fillDependentAddressSpaceTypeLoc(DependentAddressSpaceTypeLoc DASTL, const ParsedAttributesView &Attrs)
TypeAttrLocation
The location of a type attribute.
@ TAL_DeclChunk
The attribute is part of a DeclaratorChunk.
@ TAL_DeclSpec
The attribute is in the decl-specifier-seq.
@ TAL_DeclName
The attribute is immediately after the declaration's name.
static bool isOmittedBlockReturnType(const Declarator &D)
isOmittedBlockReturnType - Return true if this declarator is missing a return type because this is a ...
static TypeSourceInfo * GetFullTypeForDeclarator(TypeProcessingState &state, QualType declSpecType, TypeSourceInfo *TInfo)
static QualType GetEnumUnderlyingType(Sema &S, QualType BaseType, SourceLocation Loc)
static bool IsNoDerefableChunk(const DeclaratorChunk &Chunk)
static AttrT * createSimpleAttr(ASTContext &Ctx, ParsedAttr &AL)
static void diagnoseRedundantReturnTypeQualifiers(Sema &S, QualType RetTy, Declarator &D, unsigned FunctionChunkIndex)
static void processTypeAttrs(TypeProcessingState &state, QualType &type, TypeAttrLocation TAL, const ParsedAttributesView &attrs, CUDAFunctionTarget CFT=CUDAFunctionTarget::HostDevice)
static bool checkMutualExclusion(TypeProcessingState &state, const FunctionProtoType::ExtProtoInfo &EPI, ParsedAttr &Attr, AttributeCommonInfo::Kind OtherKind)
static Attr * getCCTypeAttr(ASTContext &Ctx, ParsedAttr &Attr)
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
__DEVICE__ int max(int __a, int __b)
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
TranslationUnitDecl * getTranslationUnitDecl() const
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
CanQualType UnsignedLongTy
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent, bool IsPack=false, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
TypedefDecl * getBuiltinVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_va_list type.
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
CanQualType UnsignedLongLongTy
CanQualType UnsignedShortTy
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
DiagnosticsEngine & getDiagnostics() const
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
CanQualType getCanonicalTagType(const TagDecl *TD) const
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const
Return the uniqued reference to the type for an Objective-C gc-qualified type.
QualType getPointerAuthType(QualType Ty, PointerAuthQualifier PointerAuth)
Return a type with the given __ptrauth qualifier.
uint64_t getCharWidth() const
Return the size of the character type, in bits.
QualType getBitIntType(bool Unsigned, unsigned NumBits) const
Return a bit-precise integer type with the specified signedness and bit count.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
TypeLoc getValueLoc() const
void setKWLoc(SourceLocation Loc)
void setParensRange(SourceRange Range)
Attr - This represents one attribute.
attr::Kind getKind() const
const char * getSpelling() const
SourceRange getRange() const
bool isContextSensitiveKeywordAttribute() const
bool isRegularKeywordAttribute() const
SourceLocation getLoc() const
const IdentifierInfo * getAttrName() const
ParsedAttr * create(IdentifierInfo *attrName, SourceRange attrRange, AttributeScopeInfo scope, ArgsUnion *args, unsigned numArgs, ParsedAttr::Form form, SourceLocation ellipsisLoc=SourceLocation())
Type source information for an attributed type.
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
void setAttr(const Attr *A)
bool hasExplicitTemplateArgs() const
const NestedNameSpecifierLoc getNestedNameSpecifierLoc() const
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
void setConceptReference(ConceptReference *CR)
NamedDecl * getFoundDecl() const
TemplateArgumentLoc getArgLoc(unsigned i) const
unsigned getNumArgs() const
TemplateDecl * getNamedConcept() const
DeclarationNameInfo getConceptNameInfo() const
void setRParenLoc(SourceLocation Loc)
TypeLoc getWrappedLoc() const
Comparison function object.
A fixed int type of a specified bitwidth.
unsigned getNumBits() const
void setCaretLoc(SourceLocation Loc)
TypeSpecifierWidth getWrittenWidthSpec() const
bool needsExtraLocalData() const
void setBuiltinLoc(SourceLocation Loc)
WrittenBuiltinSpecs & getWrittenBuiltinSpecs()
TypeSpecifierSign getWrittenSignSpec() const
void expandBuiltinRange(SourceRange Range)
This class is used for builtin types like 'int'.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
CXXRecordDecl * getMostRecentDecl()
bool hasUserProvidedDefaultConstructor() const
Whether this class has a user-provided default constructor per C++11.
bool hasDefinition() const
MSInheritanceModel calculateInheritanceModel() const
Calculate what the inheritance model would be for this class.
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
Represents a C++ nested-name-specifier or a global scope specifier.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
Represents a canonical, potentially-qualified type.
SourceLocation getBegin() const
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
TypeLoc getNextTypeLoc() const
static unsigned getNumAddressingBits(const ASTContext &Context, QualType ElementType, const llvm::APInt &NumElements)
Determine the number of bits required to address a member of.
static unsigned getMaxSizeBits(const ASTContext &Context)
Determine the maximum number of active bits that an array's size can require, which limits the maximu...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
bool isFunctionOrMethod() const
A reference to a declared variable, function, enum, etc.
Captures information about "declaration specifiers".
const WrittenBuiltinSpecs & getWrittenBuiltinSpecs() const
bool isTypeSpecPipe() const
static const TST TST_typeof_unqualType
SourceLocation getTypeSpecSignLoc() const
bool hasAutoTypeSpec() const
static const TST TST_typename
SourceLocation getEndLoc() const LLVM_READONLY
bool hasTypeSpecifier() const
Return true if any type-specifier has been found.
static const TST TST_char8
static const TST TST_BFloat16
Expr * getPackIndexingExpr() const
TST getTypeSpecType() const
SCS getStorageClassSpec() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isTypeSpecSat() const
SourceRange getSourceRange() const LLVM_READONLY
static const TST TST_auto_type
static const TST TST_interface
static const TST TST_double
static const TST TST_typeofExpr
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
TemplateIdAnnotation * getRepAsTemplateId() const
static const TST TST_union
static const TST TST_typename_pack_indexing
static const TST TST_char
static const TST TST_bool
static const TST TST_char16
static const TST TST_unknown_anytype
TSC getTypeSpecComplex() const
ParsedType getRepAsType() const
static const TST TST_accum
static const TST TST_half
ParsedAttributes & getAttributes()
SourceLocation getEllipsisLoc() const
bool isTypeAltiVecPixel() const
void ClearTypeQualifiers()
Clear out all of the type qualifiers.
SourceLocation getConstSpecLoc() const
static const TST TST_ibm128
Expr * getRepAsExpr() const
static const TST TST_enum
AttributePool & getAttributePool() const
static const TST TST_float128
static const TST TST_decltype
SourceRange getTypeSpecWidthRange() const
SourceLocation getTypeSpecTypeNameLoc() const
SourceLocation getTypeSpecWidthLoc() const
SourceLocation getRestrictSpecLoc() const
static const TST TST_typeof_unqualExpr
static const TST TST_class
bool hasTagDefinition() const
static const TST TST_decimal64
unsigned getParsedSpecifiers() const
Return a bitmask of which flavors of specifiers this DeclSpec includes.
bool isTypeAltiVecBool() const
bool isConstrainedAuto() const
static const TST TST_wchar
SourceLocation getTypeSpecComplexLoc() const
static const TST TST_void
bool isTypeAltiVecVector() const
static const TST TST_bitint
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
static const TST TST_float
static const TST TST_atomic
static const TST TST_fract
Decl * getRepAsDecl() const
static const TST TST_float16
static bool isTransformTypeTrait(TST T)
static const TST TST_unspecified
SourceLocation getAtomicSpecLoc() const
TypeSpecifierSign getTypeSpecSign() const
CXXScopeSpec & getTypeSpecScope()
SourceLocation getTypeSpecTypeLoc() const
static const TST TST_decltype_auto
static const TST TST_error
void forEachQualifier(llvm::function_ref< void(TQ, StringRef, SourceLocation)> Handle)
This method calls the passed in handler on each qual being set.
static const TST TST_decimal32
TypeSpecifierWidth getTypeSpecWidth() const
static const TST TST_char32
static const TST TST_decimal128
bool isTypeSpecOwned() const
SourceLocation getTypeSpecSatLoc() const
SourceRange getTypeofParensRange() const
SourceLocation getUnalignedSpecLoc() const
static const TST TST_int128
SourceLocation getVolatileSpecLoc() const
FriendSpecified isFriendSpecified() const
static const TST TST_typeofType
static const TST TST_auto
ConstexprSpecKind getConstexprSpecifier() const
static const TST TST_struct
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
bool isInvalidDecl() const
SourceLocation getLocation() const
void setImplicit(bool I=true)
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
std::string getAsString() const
Retrieve the human-readable string for this name.
NameKind getNameKind() const
Determine what kind of name this is.
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
const DeclaratorChunk * getInnermostNonParenChunk() const
Return the innermost (closest to the declarator) chunk of this declarator that is not a parens chunk,...
void AddInnermostTypeInfo(const DeclaratorChunk &TI)
Add a new innermost chunk to this declarator.
bool isFunctionDeclarationContext() const
Return true if this declaration appears in a context where a function declarator would be a function ...
FunctionDefinitionKind getFunctionDefinitionKind() const
const ParsedAttributes & getAttributes() const
SourceLocation getIdentifierLoc() const
bool hasTrailingReturnType() const
Determine whether a trailing return type was written (at any level) within this declarator.
SourceLocation getEndLoc() const LLVM_READONLY
bool isExpressionContext() const
Determine whether this declaration appears in a context where an expression could appear.
type_object_range type_objects() const
Returns the range of type objects, from the identifier outwards.
void setInvalidType(bool Val=true)
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
const ParsedAttributesView & getDeclarationAttributes() const
SourceLocation getEllipsisLoc() const
DeclaratorContext getContext() const
SourceLocation getBeginLoc() const LLVM_READONLY
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
bool isFirstDeclarator() const
SourceLocation getCommaLoc() const
AttributePool & getAttributePool() const
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
ParsedType getTrailingReturnType() const
Get the trailing return type appearing (at any level) within this declarator.
bool isInvalidType() const
bool isExplicitObjectMemberFunction()
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isFirstDeclarationOfMember()
Returns true if this declares a real member and not a friend.
bool isPrototypeContext() const
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
void setEllipsisLoc(SourceLocation EL)
const IdentifierInfo * getIdentifier() const
void setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
void setAttrNameLoc(SourceLocation loc)
void setAttrOperandParensRange(SourceRange range)
void setAttrExprOperand(Expr *e)
Represents an extended address space qualifier where the input address space value is dependent.
void copy(DependentNameTypeLoc Loc)
void setNameLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
bool getSuppressSystemWarnings() const
Wrap a function effect's condition expression in another struct so that FunctionProtoType's TrailingO...
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
RAII object that enters a new expression evaluation context.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getDefinition() const
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
A SourceLocation and its associated SourceManager.
unsigned getSpellingLineNumber(bool *Invalid=nullptr) const
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
A mutable set of FunctionEffects and possibly conditions attached to them.
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
SmallVector< Conflict > Conflicts
Represents an abstract function effect, using just an enumeration describing its kind.
Kind
Identifies the particular effect.
An immutable set of FunctionEffects and possibly conditions attached to them.
Represents a prototype with parameter type info, e.g.
Qualifiers getMethodQuals() const
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
unsigned getNumParams() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
void setParam(unsigned i, ParmVarDecl *VD)
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
A class which abstracts out some details necessary for making a call.
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
bool getProducesResult() const
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
static StringRef getNameForCallConv(CallingConv CC)
AArch64SMETypeAttributes
The AArch64 SME ACLE (Arm C/C++ Language Extensions) define a number of function type attributes that...
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateMask
static ArmStateValue getArmZT0State(unsigned AttrBits)
static ArmStateValue getArmZAState(unsigned AttrBits)
CallingConv getCallConv() const
QualType getReturnType() const
bool getHasRegParm() const
Type source information for HLSL attributed resource type.
TypeLoc getWrappedLoc() const
void setContainedTypeSourceInfo(TypeSourceInfo *TSI) const
void setSourceRange(const SourceRange &R)
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef getName() const
Return the actual identifier string.
A simple pair of identifier info and location.
void setIdentifierInfo(IdentifierInfo *Ident)
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
Describes an entity that is being initialized.
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
ElaboratedTypeKeyword getKeyword() const
void setAmpLoc(SourceLocation Loc)
An lvalue reference type, per C++11 [dcl.ref].
@ PPTMK_FullGeneralityMultipleInheritance
@ PPTMK_FullGeneralityVirtualInheritance
@ PPTMK_FullGeneralitySingleInheritance
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool requiresStrictPrototypes() const
Returns true if functions without prototypes or functions with an identifier list (aka K&R C function...
bool isImplicitIntAllowed() const
Returns true if implicit int is supported at all.
bool allowArrayReturnTypes() const
bool isTargetDevice() const
True when compiling for an offloading target device.
bool isImplicitIntRequired() const
Returns true if implicit int is part of the language requirements.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
Holds a QualType and a TypeSourceInfo* that came out of a declarator parsing.
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
Represents the results of name lookup.
TypeLoc getInnerLoc() const
void setExpansionLoc(SourceLocation Loc)
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
void setAttrRowOperand(Expr *e)
void setAttrColumnOperand(Expr *e)
void setAttrOperandParensRange(SourceRange range)
void setAttrNameLoc(SourceLocation loc)
static bool isValidElementType(QualType T)
Valid elements types are the following:
void setStarLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
A pointer to member type per C++ 8.3.3 - Pointers to members.
NestedNameSpecifier getQualifier() const
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
QualType getPointeeType() const
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
This represents a decl that may have a name.
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NamespaceAndPrefix getAsNamespaceAndPrefix() const
const Type * getAsType() const
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
Represents an ObjC class declaration.
void setNameLoc(SourceLocation Loc)
void setNameEndLoc(SourceLocation Loc)
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
Wraps an ObjCPointerType with source location information.
void setStarLoc(SourceLocation Loc)
Represents a pointer to an Objective C object.
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
static OpaquePtr make(QualType P)
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
OpenCL supported extensions and optional core features.
bool isAvailableOption(llvm::StringRef Ext, const LangOptions &LO) const
bool isSupported(llvm::StringRef Ext, const LangOptions &LO) const
void setEllipsisLoc(SourceLocation Loc)
A parameter attribute which changes the argument-passing ABI rule for the parameter.
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
Represents a parameter to a function.
ParsedAttr - Represents a syntactic attribute.
void setInvalid(bool b=true) const
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
bool isArgIdent(unsigned Arg) const
Expr * getArgAsExpr(unsigned Arg) const
AttributeCommonInfo::Kind getKind() const
void setUsedAsTypeAttr(bool Used=true)
bool checkAtMostNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at most as many args as Num.
bool hasMSPropertyAttr() const
void addAtEnd(ParsedAttr *newAttr)
bool hasAttribute(ParsedAttr::Kind K) const
void remove(ParsedAttr *ToBeRemoved)
void takeOneFrom(ParsedAttributes &Other, ParsedAttr *PA)
TypeLoc getValueLoc() const
void setKWLoc(SourceLocation Loc)
Pointer-authentication qualifiers.
static PointerAuthQualifier Create(unsigned Key, bool IsAddressDiscriminated, unsigned ExtraDiscriminator, PointerAuthenticationMode AuthenticationMode, bool IsIsaPointer, bool AuthenticatesNullValues)
@ MaxKey
The maximum supported pointer-authentication key.
void setStarLoc(SourceLocation Loc)
PointerType - C99 6.7.5.1 - Pointer Declarators.
SourceLocation getPragmaAssumeNonNullLoc() const
The location of the currently-active #pragma clang assume_nonnull begin.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
PointerAuthQualifier getPointerAuth() const
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
SplitQualType getSplitUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
UnqualTypeLoc getUnqualifiedLoc() const
The collection of all-type qualifiers we support.
void removeCVRQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
void addCVRUQualifiers(unsigned mask)
static Qualifiers fromCVRMask(unsigned CVR)
void setUnaligned(bool flag)
std::string getAsString() const
@ MaxAddressSpace
The maximum supported address space number.
void addObjCLifetime(ObjCLifetime type)
void setAmpAmpLoc(SourceLocation Loc)
QualType getPointeeType() const
bool isSpelledAsLValue() const
bool isFunctionDeclarationScope() const
isFunctionDeclarationScope - Return true if this scope is a function prototype scope.
A generic diagnostic builder for errors which may or may not be deferred.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
QualType ProcessResourceTypeAttributes(QualType Wrapped)
QualType getInoutParameterType(QualType Ty)
bool isCFError(RecordDecl *D)
IdentifierInfo * getNSErrorIdent()
Retrieve the identifier "NSError".
bool checkNSReturnsRetainedReturnType(SourceLocation loc, QualType type)
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Abstract base class used for diagnosing integer constant expression violations.
Sema - This implements semantic analysis and AST building for C.
bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a reachable definition.
QualType BuildParenType(QualType T)
Build a paren type including T.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Scope * getCurScope() const
Retrieve the parser's current scope.
bool hasStructuralCompatLayout(Decl *D, Decl *Suggested)
Determine if D and Suggested have a structurally compatible layout as described in C11 6....
bool checkArrayElementAlignment(QualType EltTy, SourceLocation Loc)
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
UnaryTransformType::UTTKind UTTKind
QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace, SourceLocation AttrLoc)
BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an expression is uninstantiated.
bool checkPointerAuthDiscriminatorArg(Expr *Arg, PointerAuthDiscArgKind Kind, unsigned &IntVal)
QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc)
QualType BuiltinAddRValueReference(QualType BaseType, SourceLocation Loc)
std::optional< FunctionEffectMode > ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName)
Try to parse the conditional expression attached to an effect attribute (e.g.
@ AcceptSizeless
Relax the normal rules for complete types so that they include sizeless built-in types.
class clang::Sema::DelayedDiagnostics DelayedDiagnostics
QualType BuildExtVectorType(QualType T, Expr *ArraySize, SourceLocation AttrLoc)
Build an ext-vector type.
const AttributedType * getCallingConvAttributedType(QualType T) const
Get the outermost AttributedType node that sets a calling convention.
bool hasMergedDefinitionInCurrentModule(const NamedDecl *Def)
bool BuiltinIsConvertible(QualType From, QualType To, SourceLocation Loc, bool CheckNothrow=false)
bool InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool Complain, bool PrimaryStrictPackMatch)
QualType BuildFunctionType(QualType T, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc, DeclarationName Entity, const FunctionProtoType::ExtProtoInfo &EPI)
Build a function type.
bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, TrivialABIHandling TAH=TrivialABIHandling::IgnoreTrivialABI, bool Diagnose=false)
Determine whether a defaulted or deleted special member function is trivial, as specified in C++11 [c...
void checkSpecializationReachability(SourceLocation Loc, NamedDecl *Spec)
ASTContext & getASTContext() const
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
void checkExceptionSpecification(bool IsTopLevel, ExceptionSpecificationType EST, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr, SmallVectorImpl< QualType > &Exceptions, FunctionProtoType::ExceptionSpecInfo &ESI)
Check the given exception-specification and update the exception specification information with the r...
void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given variable from its template.
bool CheckCallingConvAttr(const ParsedAttr &attr, CallingConv &CC, const FunctionDecl *FD=nullptr, CUDAFunctionTarget CFT=CUDAFunctionTarget::InvalidTarget)
Check validaty of calling convention attribute attr.
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
QualType BuildCountAttributedArrayOrPointerType(QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull)
std::string getFixItZeroInitializerForType(QualType T, SourceLocation Loc) const
Get a string to suggest for zero-initialization of a type.
bool CheckAttrNoArgs(const ParsedAttr &CurrAttr)
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc)
Build a bit-precise integer type.
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
QualType BuiltinRemoveReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
bool CheckFunctionReturnType(QualType T, SourceLocation Loc)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_TypeConstraint
A type constraint.
const LangOptions & getLangOpts() const
bool RequireCompleteExprType(Expr *E, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type of the given expression is complete.
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
QualType BuiltinEnumUnderlyingType(QualType BaseType, SourceLocation Loc)
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
const LangOptions & LangOpts
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
IdentifierInfo * InventAbbreviatedTemplateParameterTypeName(const IdentifierInfo *ParamName, unsigned Index)
Invent a new identifier for parameters of abbreviated templates.
bool checkConstantPointerAuthKey(Expr *keyExpr, unsigned &key)
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
void completeExprArrayBound(Expr *E)
bool hasExplicitCallingConv(QualType T)
bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value)
Checks a regparm attribute, returning true if it is ill-formed and otherwise setting numParams to the...
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
sema::FunctionScopeInfo * getCurFunction() const
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
QualType BuildMemberPointerType(QualType T, const CXXScopeSpec &SS, CXXRecordDecl *Cls, SourceLocation Loc, DeclarationName Entity)
Build a member pointer type T Class::*.
ExprResult DefaultLvalueConversion(Expr *E)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
QualType BuiltinDecay(QualType BaseType, SourceLocation Loc)
IdentifierInfo * getNullabilityKeyword(NullabilityKind nullability)
Retrieve the keyword associated.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
bool isAcceptable(const NamedDecl *D, AcceptableKind Kind)
Determine whether a declaration is acceptable (visible/reachable).
QualType getDecltypeForExpr(Expr *E)
getDecltypeForExpr - Given an expr, will return the decltype for that expression, according to the ru...
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
QualType BuiltinAddReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
bool hasVisibleMergedDefinition(const NamedDecl *Def)
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
CanThrowResult canThrow(const Stmt *E)
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
QualType BuildAtomicType(QualType T, SourceLocation Loc)
void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl, MissingImportKind MIK, bool Recover=true)
Diagnose that the specified declaration needs to be visible but isn't, and suggest a module import th...
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, TemplateDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
bool diagnoseConflictingFunctionEffect(const FunctionEffectsRef &FX, const FunctionEffectWithCondition &EC, SourceLocation NewAttrLoc)
Warn and return true if adding a function effect to a set would create a conflict.
TypeSourceInfo * ReplaceAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
TypeResult ActOnTypeName(Declarator &D)
bool isSFINAEContext() const
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
QualType BuildPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a pointer type.
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
QualType BuiltinAddPointer(QualType BaseType, SourceLocation Loc)
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
bool CheckImplicitNullabilityTypeSpecifier(QualType &Type, NullabilityKind Nullability, SourceLocation DiagLoc, bool AllowArrayTypes, bool OverrideExisting)
Check whether a nullability type specifier can be added to the given type through some means not writ...
void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc)
bool CheckDistantExceptionSpec(QualType T)
CheckDistantExceptionSpec - Check if the given type is a pointer or pointer to member to a function w...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
QualType BuildDecltypeType(Expr *E, bool AsUnevaluated=true)
If AsUnevaluated is false, E is treated as though it were an evaluated context, such as when building...
QualType BuildUnaryTransformType(QualType BaseType, UTTKind UKind, SourceLocation Loc)
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
TypeSourceInfo * GetTypeForDeclaratorCast(Declarator &D, QualType FromTy)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
QualType getCapturedDeclRefType(ValueDecl *Var, SourceLocation Loc)
Given a variable, determine the type that a reference to that variable will have in the given scope.
QualType BuiltinRemoveExtent(QualType BaseType, UTTKind UKind, SourceLocation Loc)
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
QualType BuiltinChangeCVRQualifiers(QualType BaseType, UTTKind UKind, SourceLocation Loc)
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
DiagnosticsEngine & Diags
OpenCLOptions & getOpenCLOptions()
QualType BuiltinRemovePointer(QualType BaseType, SourceLocation Loc)
QualType BuildArrayType(QualType T, ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity)
Build an array type.
bool CheckQualifiedFunctionForTypeId(QualType T, SourceLocation Loc)
friend class InitializationSequence
QualType BuildReadPipeType(QualType T, SourceLocation Loc)
Build a Read-only Pipe type.
void diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals, SourceLocation FallbackLoc, SourceLocation ConstQualLoc=SourceLocation(), SourceLocation VolatileQualLoc=SourceLocation(), SourceLocation RestrictQualLoc=SourceLocation(), SourceLocation AtomicQualLoc=SourceLocation(), SourceLocation UnalignedQualLoc=SourceLocation())
LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod
Controls member pointer representation format under the MS ABI.
llvm::BumpPtrAllocator BumpAlloc
QualType BuildWritePipeType(QualType T, SourceLocation Loc)
Build a Write-only Pipe type.
QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc)
QualType BuildTypeofExprType(Expr *E, TypeOfKind Kind)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns, SourceLocation AttrLoc)
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
bool hasAcceptableDefinition(NamedDecl *D, NamedDecl **Suggested, AcceptableKind Kind, bool OnlyNeedComplete=false)
QualType BuiltinChangeSignedness(QualType BaseType, UTTKind UKind, SourceLocation Loc)
void adjustMemberFunctionCC(QualType &T, bool HasThisPointer, bool IsCtorOrDtor, SourceLocation Loc)
Adjust the calling convention of a method to be the ABI default if it wasn't specified explicitly.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
bool isAbstractType(SourceLocation Loc, QualType T)
QualType BuildBlockPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a block pointer type.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
const char * getCharacterData(SourceLocation SL, bool *Invalid=nullptr) const
Return a pointer to the start of the specified location in the appropriate spelling MemoryBuffer.
CharSourceRange getImmediateExpansionRange(SourceLocation Loc) const
Return the start/end of the expansion information for an expansion location.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
const SrcMgr::SLocEntry & getSLocEntry(FileID FID, bool *Invalid=nullptr) const
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Information about a FileID, basically just the logical file that it represents and include stack info...
CharacteristicKind getFileCharacteristic() const
Return whether this is a system header or not.
SourceLocation getIncludeLoc() const
This is a discriminated union of FileInfo and ExpansionInfo.
const FileInfo & getFile() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
Represents the declaration of a struct/union/class/enum.
void setEmbeddedInDeclarator(bool isInDeclarator)
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isThisDeclarationADemotedDefinition() const
Whether this declaration was a definition in some module but was forced to be a declaration.
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
Exposes information about the current target.
virtual bool hasBitIntType() const
Determine whether the _BitInt type is supported on this target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual size_t getMaxBitIntWidth() const
virtual std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts, ArmStreamingKind Mode, llvm::StringMap< bool > *FeatureMap=nullptr) const
Returns target-specific min and max values VScale_Range.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
virtual bool allowHalfArgsAndReturns() const
Whether half args and returns are supported.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
virtual bool hasFloat16Type() const
Determine whether the _Float16 type is supported on this target.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
virtual bool hasBFloat16Type() const
Determine whether the _BFloat16 type is supported on this target.
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SourceLocation getRAngleLoc() const
void copy(TemplateSpecializationTypeLoc Loc)
Declaration of a template type parameter.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
const Type * getTypeForDecl() const
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void pushFullCopy(TypeLoc L)
Pushes a copy of the given TypeLoc onto this builder.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
unsigned getFullDataSize() const
Returns the size of the type source info data block.
AutoTypeLoc getContainedAutoTypeLoc() const
Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...
void * getOpaqueData() const
Get the pointer where source information is stored.
void copy(TypeLoc other)
Copies the other type loc into this one.
void initialize(ASTContext &Context, SourceLocation Loc) const
Initializes this to state that every location in this type is the given location.
SourceLocation getEndLoc() const
Get the end source location.
SourceLocation getBeginLoc() const
Get the begin source location.
void setUnmodifiedTInfo(TypeSourceInfo *TI) const
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isBlockPointerType() const
bool isBooleanType() const
QualType getRVVEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an RVV builtin type.
bool isIncompleteArrayType() const
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
bool isUndeducedAutoType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
CXXRecordDecl * castAsCXXRecordDecl() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
NestedNameSpecifier getPrefix() const
If this type represents a qualified-id, this returns its nested name specifier.
bool isSizelessBuiltinType() const
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
const Type * getArrayElementTypeNoTypeQual() const
If this is an array type, return the element type of the array, potentially with type qualifiers miss...
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool canHaveNullability(bool ResultIfUnknown=true) const
Determine whether the given type can have a nullability specifier applied to it, i....
QualType getSveEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an SVE builtin type.
bool isBitIntType() const
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isChar16Type() const
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool isMemberPointerType() const
bool isAtomicType() const
bool isObjCObjectType() const
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isRVVVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'riscv_rvv_vector_bits' type attribute,...
bool isRealFloatingType() const
Floating point categories.
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isObjCARCImplicitlyUnretainedType() const
Determines if this type, which must satisfy isObjCLifetimeType(), is implicitly __unsafe_unretained r...
bool isRecordType() const
bool isObjCRetainableType() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
void setParensRange(SourceRange range)
void setTypeofLoc(SourceLocation Loc)
Wrapper of type source information for a type with no direct qualifiers.
TypeLocClass getTypeLocClass() const
UnionParsedType ConversionFunctionId
When Kind == IK_ConversionFunctionId, the type that the conversion function names.
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
void setNameLoc(SourceLocation Loc)
Represents a GCC generic vector type.
VectorKind getVectorKind() const
static DelayedDiagnostic makeForbiddenType(SourceLocation loc, unsigned diagnostic, QualType type, unsigned argument)
Retains information about a function, method, or block that is currently being parsed.
Defines the clang::TargetInfo interface.
const internal::VariadicDynCastAllOfMatcher< Decl, TypedefDecl > typedefDecl
Matches typedef declarations.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Decl, RecordDecl > recordDecl
Matches class, struct, and union declarations.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
@ ExpectedParameterOrImplicitObjectParameter
@ ExpectedFunctionWithProtoType
void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
@ GNUAutoType
__auto_type (GNU extension)
@ DecltypeAuto
decltype(auto)
llvm::StringRef getParameterABISpelling(ParameterABI kind)
FunctionEffectMode
Used with attributes/effects with a boolean condition, e.g. nonblocking.
LLVM_READONLY bool isAsciiIdentifierContinue(unsigned char c)
NullabilityKind
Describes the nullability of a particular type.
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
llvm::PointerUnion< Expr *, IdentifierLoc * > ArgsUnion
A union of the various pointer types that can be passed to an ParsedAttr as an argument.
@ Success
Annotation was successful.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
TypeOfKind
The kind of 'typeof' expression we're after.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
@ AANT_ArgumentIntegerConstant
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
llvm::StringRef getNullabilitySpelling(NullabilityKind kind, bool isContextSensitive=false)
Retrieve the spelling of the given nullability kind.
ArraySizeModifier
Capture whether this is a normal array (e.g.
@ SwiftAsyncContext
This parameter (which must have pointer type) uses the special Swift asynchronous context-pointer ABI...
@ SwiftErrorResult
This parameter (which must have pointer-to-pointer type) uses the special Swift error-result ABI trea...
@ Ordinary
This parameter uses ordinary ABI rules for its type.
@ SwiftIndirectResult
This parameter (which must have pointer type) is a Swift indirect result parameter.
@ SwiftContext
This parameter (which must have pointer type) uses the special Swift context-pointer ABI treatment.
const FunctionProtoType * T
bool supportsVariadicCall(CallingConv CC)
Checks whether the given calling convention supports variadic calls.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
static bool isBlockPointer(Expr *Arg)
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
@ Keyword
The name has been typo-corrected to a keyword.
@ Type
The name was classified as a type.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ FirstTargetAddressSpace
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ NeonPoly
is ARM Neon polynomial vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ None
The alignment was not explicit in code.
@ ArrayBound
Array bound in array declarator or new-expression.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
ActionResult< Expr * > ExprResult
@ Parens
New-expression has a C++98 paren-delimited initializer.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
@ Implicit
An implicit conversion.
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
unsigned isStar
True if this dimension was [*]. In this case, NumElts is null.
unsigned TypeQuals
The type qualifiers for the array: const/volatile/restrict/__unaligned/_Atomic.
unsigned hasStatic
True if this dimension included the 'static' keyword.
Expr * NumElts
This is the size of the array, or null if [] or [*] was specified.
unsigned TypeQuals
For now, sema will catch these as invalid.
unsigned isVariadic
isVariadic - If this function has a prototype, and if that proto ends with ',...)',...
SourceLocation getTrailingReturnTypeLoc() const
Get the trailing-return-type location for this function declarator.
SourceLocation getLParenLoc() const
bool hasTrailingReturnType() const
Determine whether this function declarator had a trailing-return-type.
TypeAndRange * Exceptions
Pointer to a new[]'d array of TypeAndRange objects that contain the types in the function's dynamic e...
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
ParsedType getTrailingReturnType() const
Get the trailing-return-type for this function declarator.
unsigned RefQualifierIsLValueRef
Whether the ref-qualifier (if any) is an lvalue reference.
SourceLocation getExceptionSpecLocBeg() const
DeclSpec * MethodQualifiers
DeclSpec for the function with the qualifier related info.
SourceLocation getRefQualifierLoc() const
Retrieve the location of the ref-qualifier, if any.
SourceLocation getRParenLoc() const
SourceLocation getEllipsisLoc() const
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
unsigned getNumExceptions() const
Get the number of dynamic exception specifications.
bool hasMethodTypeQualifiers() const
Determine whether this method has qualifiers.
unsigned isAmbiguous
Can this declaration be a constructor-style initializer?
unsigned hasPrototype
hasPrototype - This is true if the function had at least one typed parameter.
bool hasRefQualifier() const
Determine whether this function declaration contains a ref-qualifier.
SourceRange getExceptionSpecRange() const
ExceptionSpecificationType getExceptionSpecType() const
Get the type of exception specification this function has.
Expr * NoexceptExpr
Pointer to the expression in the noexcept-specifier of this function, if it has one.
unsigned TypeQuals
The type qualifiers: const/volatile/restrict/__unaligned/_Atomic.
SourceLocation StarLoc
Location of the '*' token.
const IdentifierInfo * Ident
SourceLocation RestrictQualLoc
The location of the restrict-qualifier, if any.
SourceLocation ConstQualLoc
The location of the const-qualifier, if any.
SourceLocation VolatileQualLoc
The location of the volatile-qualifier, if any.
SourceLocation UnalignedQualLoc
The location of the __unaligned-qualifier, if any.
unsigned TypeQuals
The type qualifiers: const/volatile/restrict/unaligned/atomic.
SourceLocation AtomicQualLoc
The location of the _Atomic-qualifier, if any.
bool LValueRef
True if this is an lvalue reference, false if it's an rvalue reference.
bool HasRestrict
The type qualifier: restrict. [GNU] C++ extension.
One instance of this struct is used for each type in a declarator that is parsed.
const ParsedAttributesView & getAttrs() const
If there are attributes applied to this declaratorchunk, return them.
SourceLocation EndLoc
EndLoc - If valid, the place where this chunck ends.
static DeclaratorChunk getFunction(bool HasProto, bool IsAmbiguous, SourceLocation LParenLoc, ParamInfo *Params, unsigned NumParams, SourceLocation EllipsisLoc, SourceLocation RParenLoc, bool RefQualifierIsLvalueRef, SourceLocation RefQualifierLoc, SourceLocation MutableLoc, ExceptionSpecificationType ESpecType, SourceRange ESpecRange, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, ArrayRef< NamedDecl * > DeclsInPrototype, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult(), SourceLocation TrailingReturnTypeLoc=SourceLocation(), DeclSpec *MethodQualifiers=nullptr)
DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
MemberPointerTypeInfo Mem
SourceLocation Loc
Loc - The place where this type was defined.
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
Describes whether we've seen any nullability information for the given file.
SourceLocation PointerEndLoc
The end location for the first pointer declarator in the file.
SourceLocation PointerLoc
The first pointer declarator (of any pointer kind) in the file that does not have a corresponding nul...
bool SawTypeNullability
Whether we saw any type nullability annotations in the given file.
uint8_t PointerKind
Which kind of pointer declarator we saw.
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Holds information about the various types of exception specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionTypeExtraAttributeInfo ExtraAttributeInfo
unsigned AArch64SMEAttributes
SourceLocation EllipsisLoc
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
RefQualifierKind RefQualifier
unsigned HasTrailingReturn
void setArmSMEAttribute(AArch64SMETypeAttributes Kind, bool Enable=true)
FunctionType::ExtInfo ExtInfo
TypeSourceInfo * ContainedTyInfo
SmallVector< NamedDecl *, 4 > TemplateParams
Store the list of the template parameters for a generic lambda or an abbreviated function template.
unsigned AutoTemplateParameterDepth
If this is a generic lambda or abbreviated function template, use this as the depth of each 'auto' pa...
static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into an elaborated type keyword.
NestedNameSpecifier Prefix
Describes how types, statements, expressions, and declarations should be printed.
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
@ Memoization
Added for Template instantiation observation.
Abstract class used to diagnose incomplete types.
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
SplitQualType getSingleStepDesugaredType() const
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
bool IsEquivalent(Decl *D1, Decl *D2)
Determine whether the two declarations are structurally equivalent.
Information about a template-id annotation token.
const IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.