45#include "llvm/ADT/ArrayRef.h"
46#include "llvm/ADT/STLForwardCompat.h"
47#include "llvm/ADT/StringExtras.h"
48#include "llvm/IR/DerivedTypes.h"
49#include "llvm/Support/ErrorHandling.h"
64 if (
D.getContext() != DeclaratorContext::BlockLiteral ||
65 D.getDeclSpec().hasTypeSpecifier())
68 if (
D.getNumTypeObjects() == 0)
71 if (
D.getNumTypeObjects() == 1 &&
83 bool useExpansionLoc =
true;
84 switch (
attr.getKind()) {
85 case ParsedAttr::AT_ObjCGC:
88 case ParsedAttr::AT_ObjCOwnership:
94 useExpansionLoc =
false;
99 StringRef name =
attr.getAttrName()->getName();
103 attr.isArgIdent(0) ?
attr.getArgAsIdent(0)->getIdentifierInfo() :
nullptr;
104 if (useExpansionLoc && loc.
isMacroID() && II) {
105 if (II->
isStr(
"strong")) {
107 }
else if (II->
isStr(
"weak")) {
112 S.
Diag(loc,
attr.isRegularKeywordAttribute()
113 ? diag::err_type_attribute_wrong_type
114 : diag::warn_type_attribute_wrong_type)
115 << name << WhichType <<
type;
120#define OBJC_POINTER_TYPE_ATTRS_CASELIST \
121 case ParsedAttr::AT_ObjCGC: \
122 case ParsedAttr::AT_ObjCOwnership
125#define CALLING_CONV_ATTRS_CASELIST \
126 case ParsedAttr::AT_CDecl: \
127 case ParsedAttr::AT_FastCall: \
128 case ParsedAttr::AT_StdCall: \
129 case ParsedAttr::AT_ThisCall: \
130 case ParsedAttr::AT_RegCall: \
131 case ParsedAttr::AT_Pascal: \
132 case ParsedAttr::AT_SwiftCall: \
133 case ParsedAttr::AT_SwiftAsyncCall: \
134 case ParsedAttr::AT_VectorCall: \
135 case ParsedAttr::AT_AArch64VectorPcs: \
136 case ParsedAttr::AT_AArch64SVEPcs: \
137 case ParsedAttr::AT_DeviceKernel: \
138 case ParsedAttr::AT_MSABI: \
139 case ParsedAttr::AT_SysVABI: \
140 case ParsedAttr::AT_Pcs: \
141 case ParsedAttr::AT_IntelOclBicc: \
142 case ParsedAttr::AT_PreserveMost: \
143 case ParsedAttr::AT_PreserveAll: \
144 case ParsedAttr::AT_M68kRTD: \
145 case ParsedAttr::AT_PreserveNone: \
146 case ParsedAttr::AT_RISCVVectorCC: \
147 case ParsedAttr::AT_RISCVVLSCC
150#define FUNCTION_TYPE_ATTRS_CASELIST \
151 case ParsedAttr::AT_NSReturnsRetained: \
152 case ParsedAttr::AT_NoReturn: \
153 case ParsedAttr::AT_NonBlocking: \
154 case ParsedAttr::AT_NonAllocating: \
155 case ParsedAttr::AT_Blocking: \
156 case ParsedAttr::AT_Allocating: \
157 case ParsedAttr::AT_Regparm: \
158 case ParsedAttr::AT_CFIUncheckedCallee: \
159 case ParsedAttr::AT_CFISalt: \
160 case ParsedAttr::AT_CmseNSCall: \
161 case ParsedAttr::AT_ArmStreaming: \
162 case ParsedAttr::AT_ArmStreamingCompatible: \
163 case ParsedAttr::AT_ArmPreserves: \
164 case ParsedAttr::AT_ArmIn: \
165 case ParsedAttr::AT_ArmOut: \
166 case ParsedAttr::AT_ArmInOut: \
167 case ParsedAttr::AT_ArmAgnostic: \
168 case ParsedAttr::AT_AnyX86NoCallerSavedRegisters: \
169 case ParsedAttr::AT_AnyX86NoCfCheck: \
170 CALLING_CONV_ATTRS_CASELIST
173#define MS_TYPE_ATTRS_CASELIST \
174 case ParsedAttr::AT_Ptr32: \
175 case ParsedAttr::AT_Ptr64: \
176 case ParsedAttr::AT_SPtr: \
177 case ParsedAttr::AT_UPtr
180#define NULLABILITY_TYPE_ATTRS_CASELIST \
181 case ParsedAttr::AT_TypeNonNull: \
182 case ParsedAttr::AT_TypeNullable: \
183 case ParsedAttr::AT_TypeNullableResult: \
184 case ParsedAttr::AT_TypeNullUnspecified
189 class TypeProcessingState {
213 using TypeAttrPair = std::pair<const AttributedType*, const Attr*>;
215 bool AttrsForTypesSorted =
true;
219 llvm::DenseMap<const MacroQualifiedType *, SourceLocation> LocsForMacros;
227 bool ParsedHLSLParamMod;
231 : sema(sema), declarator(declarator),
233 ParsedHLSLParamMod(
false) {}
235 Sema &getSema()
const {
243 bool isProcessingDeclSpec()
const {
247 unsigned getCurrentChunkIndex()
const {
251 void setCurrentChunkIndex(
unsigned idx) {
257 if (isProcessingDeclSpec())
258 return getMutableDeclSpec().getAttributes();
263 void saveDeclSpecAttrs() {
265 if (!savedAttrs.empty())
268 DeclSpec &spec = getMutableDeclSpec();
269 llvm::append_range(savedAttrs,
276 ignoredTypeAttrs.push_back(&
attr);
282 for (
auto *
Attr : ignoredTypeAttrs)
292 AttrsForTypes.push_back({cast<AttributedType>(
T.getTypePtr()), A});
293 AttrsForTypesSorted =
false;
298 QualType getBTFTagAttributedType(
const BTFTypeTagAttr *BTFAttr,
310 auto *NewAttrTy = cast<AttributedType>(
T.getTypePtr());
311 for (TypeAttrPair &A : AttrsForTypes) {
312 if (A.first == AttrTy)
315 AttrsForTypesSorted =
false;
322 if (!AttrsForTypesSorted) {
323 llvm::stable_sort(AttrsForTypes, llvm::less_first());
324 AttrsForTypesSorted =
true;
329 for (
auto It = llvm::partition_point(
331 [=](
const TypeAttrPair &A) {
return A.first < AT; });
332 It != AttrsForTypes.end() && It->first == AT; ++It) {
334 const Attr *Result = It->second;
335 It->second =
nullptr;
340 llvm_unreachable(
"no Attr* for AttributedType*");
345 auto FoundLoc = LocsForMacros.find(MQT);
346 assert(FoundLoc != LocsForMacros.end() &&
347 "Unable to find macro expansion location for MacroQualifedType");
348 return FoundLoc->second;
353 LocsForMacros[MQT] =
Loc;
356 void setParsedNoDeref(
bool parsed) { parsedNoDeref = parsed; }
358 bool didParseNoDeref()
const {
return parsedNoDeref; }
360 void setParsedHLSLParamMod(
bool Parsed) { ParsedHLSLParamMod = Parsed; }
362 bool didParseHLSLParamMod()
const {
return ParsedHLSLParamMod; }
364 ~TypeProcessingState() {
365 if (savedAttrs.empty())
368 getMutableDeclSpec().getAttributes().clearListOnly();
370 getMutableDeclSpec().getAttributes().addAtEnd(AL);
374 DeclSpec &getMutableDeclSpec()
const {
416 if (
attr.getKind() == ParsedAttr::AT_ObjCGC)
418 assert(
attr.getKind() == ParsedAttr::AT_ObjCOwnership);
433 bool onlyBlockPointers) {
439 for (; i != 0; --i) {
441 switch (fnChunk.
Kind) {
457 for (--i; i != 0; --i) {
459 switch (ptrChunk.
Kind) {
469 if (onlyBlockPointers)
478 llvm_unreachable(
"bad declarator chunk kind");
484 llvm_unreachable(
"bad declarator chunk kind");
501 Declarator &declarator = state.getDeclarator();
504 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
506 switch (chunk.
Kind) {
512 if (state.isProcessingDeclSpec() &&
513 attr.getKind() == ParsedAttr::AT_ObjCOwnership)
516 if (!destChunk) destChunk = &chunk;
529 if (state.isProcessingDeclSpec() &&
530 attr.getKind() == ParsedAttr::AT_ObjCOwnership) {
557 Declarator &declarator = state.getDeclarator();
561 unsigned innermost = -1U;
562 bool considerDeclSpec =
true;
565 switch (chunk.
Kind) {
579 considerDeclSpec =
false;
587 if (considerDeclSpec) {
592 state.saveDeclSpecAttrs();
601 if (innermost != -1U) {
609 state.addIgnoredTypeAttr(
attr);
618 Declarator &declarator = state.getDeclarator();
622 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
624 switch (chunk.
Kind) {
651 Declarator &declarator = state.getDeclarator();
671 state.saveDeclSpecAttrs();
675 state,
attr, state.getCurrentAttributes(), declSpecType, CFT))
680 state.addIgnoredTypeAttr(
attr);
691 Declarator &declarator = state.getDeclarator();
701 state.addIgnoredTypeAttr(
attr);
726 if (
attr.isStandardAttributeSyntax() ||
attr.isRegularKeywordAttribute())
729 switch (
attr.getKind()) {
746 case ParsedAttr::AT_ObjCKindOf:
759 Declarator &declarator = state.getDeclarator();
805 {}, loc, loc, declarator));
820 typedef std::pair<DeclSpec::TQ, SourceLocation> QualLoc;
825 if (!(RemoveTQs & Qual.first))
829 if (TypeQuals & Qual.first)
830 S.
Diag(Qual.second, DiagID)
835 TypeQuals &= ~Qual.first;
849 if (AL.isInvalid() || !AL.isTypeAttr())
852 diag::warn_block_literal_attributes_on_omitted_return_type)
854 ToBeRemoved.push_back(&AL);
864 diag::warn_block_literal_qualifiers_on_omitted_return_type);
870static OpenCLAccessAttr::Spelling
873 if (AL.getKind() == ParsedAttr::AT_OpenCLAccess)
874 return static_cast<OpenCLAccessAttr::Spelling
>(AL.getSemanticSpelling());
875 return OpenCLAccessAttr::Keyword_read_only;
881#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
883 return UnaryTransformType::Enum;
884#include "clang/Basic/TransformTypeTraits.def"
886 llvm_unreachable(
"attempted to parse a non-unary transform builtin");
900 Sema &S = state.getSema();
901 Declarator &declarator = state.getDeclarator();
921 "Unknown TSS value");
935 "Unknown TSS value");
944 "Unknown TSS value");
949 "Unknown TSS value");
954 "Unknown TSS value");
963 declarator.
getContext() == DeclaratorContext::LambdaExpr) {
967 }
else if (declarator.
getContext() == DeclaratorContext::LambdaExpr ||
982 S.
Diag(DeclLoc, diag::warn_missing_type_specifier)
991 S.
Diag(DeclLoc, diag::err_missing_type_specifier)
1000 S.
Diag(DeclLoc, diag::err_missing_actual_pipe_type)
1005 "implicit int is disabled?");
1006 S.
Diag(DeclLoc, diag::ext_missing_type_specifier)
1016 case TypeSpecifierWidth::Unspecified:
1017 Result = Context.
IntTy;
1019 case TypeSpecifierWidth::Short:
1022 case TypeSpecifierWidth::Long:
1025 case TypeSpecifierWidth::LongLong:
1033 diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);
1041 case TypeSpecifierWidth::Unspecified:
1044 case TypeSpecifierWidth::Short:
1047 case TypeSpecifierWidth::Long:
1050 case TypeSpecifierWidth::LongLong:
1058 diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);
1073 if (Result.isNull()) {
1074 Result = Context.
IntTy;
1081 case TypeSpecifierWidth::Short:
1084 case TypeSpecifierWidth::Unspecified:
1087 case TypeSpecifierWidth::Long:
1090 case TypeSpecifierWidth::LongLong:
1091 llvm_unreachable(
"Unable to specify long long as _Accum width");
1104 case TypeSpecifierWidth::Short:
1107 case TypeSpecifierWidth::Unspecified:
1110 case TypeSpecifierWidth::Long:
1113 case TypeSpecifierWidth::LongLong:
1114 llvm_unreachable(
"Unable to specify long long as _Fract width");
1164 ?
"cl_khr_fp64 and __opencl_c_fp64"
1191 Result = Context.
IntTy;
1202 Result = Context.
IntTy;
1213 "No qualifiers on tag names!");
1226 "Can't handle qualifiers on typedef names yet!");
1228 if (Result.isNull()) {
1239 assert(!Result.isNull() &&
"Didn't get a type for typeof?");
1240 if (!Result->isDependentType())
1246 ? TypeOfKind::Unqualified
1247 : TypeOfKind::Qualified);
1252 assert(
E &&
"Didn't get an expression for typeof?");
1256 ? TypeOfKind::Unqualified
1257 : TypeOfKind::Qualified);
1258 if (Result.isNull()) {
1259 Result = Context.
IntTy;
1266 assert(
E &&
"Didn't get an expression for decltype?");
1269 if (Result.isNull()) {
1270 Result = Context.
IntTy;
1277 assert(
E &&
"Didn't get an expression for pack indexing");
1281 if (Result.isNull()) {
1283 Result = Context.
IntTy;
1288#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
1289#include "clang/Basic/TransformTypeTraits.def"
1291 assert(!Result.isNull() &&
"Didn't get a type for the transformation?");
1295 if (Result.isNull()) {
1296 Result = Context.
IntTy;
1304 ? AutoTypeKeyword::DecltypeAuto
1305 : AutoTypeKeyword::Auto;
1311 TypeConstraintConcept =
1312 cast<TemplateDecl>(TemplateId->Template.get().getAsTemplateDecl());
1317 TemplateId->NumArgs);
1319 for (
const auto &ArgLoc : TemplateArgsInfo.
arguments())
1320 TemplateArgs.push_back(ArgLoc.getArgument());
1327 TypeConstraintConcept, TemplateArgs);
1341 assert(!Result.isNull() &&
"Didn't get a type for _Atomic?");
1343 if (Result.isNull()) {
1344 Result = Context.
IntTy;
1349#define GENERIC_IMAGE_TYPE(ImgType, Id) \
1350 case DeclSpec::TST_##ImgType##_t: \
1351 switch (getImageAccess(DS.getAttributes())) { \
1352 case OpenCLAccessAttr::Keyword_write_only: \
1353 Result = Context.Id##WOTy; \
1355 case OpenCLAccessAttr::Keyword_read_write: \
1356 Result = Context.Id##RWTy; \
1358 case OpenCLAccessAttr::Keyword_read_only: \
1359 Result = Context.Id##ROTy; \
1361 case OpenCLAccessAttr::SpellingNotCalculated: \
1362 llvm_unreachable("Spelling not yet calculated"); \
1365#include "clang/Basic/OpenCLImageTypes.def"
1367#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1368 case DeclSpec::TST_##Name: \
1369 Result = Context.SingletonId; \
1371#include "clang/Basic/HLSLIntangibleTypes.def"
1374 Result = Context.
IntTy;
1382 if (Result->containsErrors())
1387 bool IsOpenCLC30Compatible =
1396 if ((Result->isImageType() || Result->isSamplerT()) &&
1397 (IsOpenCLC30Compatible &&
1400 << 0 << Result <<
"__opencl_c_images";
1402 }
else if (Result->isOCLImage3dWOType() &&
1407 << (IsOpenCLC30Compatible
1408 ?
"cl_khr_3d_image_writes and __opencl_c_3d_image_writes"
1409 :
"cl_khr_3d_image_writes");
1429 unsigned typeSize =
static_cast<unsigned>(Context.
getTypeSize(Result));
1430 assert(typeSize > 0 &&
"type size for vector must be greater than 0 bits");
1431 VectorKind VecKind = VectorKind::AltiVecVector;
1433 VecKind = VectorKind::AltiVecPixel;
1435 VecKind = VectorKind::AltiVecBool;
1436 Result = Context.
getVectorType(Result, 128/typeSize, VecKind);
1447 if (declarator.
getContext() == DeclaratorContext::BlockLiteral)
1461 if (AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
1472 if (AL.isStandardAttributeSyntax() && AL.isClangScope() &&
1473 !(AL.getKind() == ParsedAttr::AT_MatrixType &&
1475 S.
Diag(AL.getLoc(), diag::warn_type_attribute_deprecated_on_decl)
1503 if (Result->isFunctionType()) {
1504 unsigned DiagId = diag::warn_typecheck_function_qualifiers_ignored;
1506 DiagId = diag::ext_typecheck_function_qualifiers_unspecified;
1522 if (TypeQuals && Result->isReferenceType()) {
1524 S, DS, TypeQuals, Result,
1526 diag::warn_typecheck_reference_qualifiers);
1533 && TypeQuals & Result.getCVRQualifiers()) {
1560 assert(!Result.isNull() &&
"This function should not return a null type");
1575 const auto *AT = dyn_cast<AutoType>(
T);
1576 return AT && AT->isGNUAutoType();
1593 unsigned DiagID = 0;
1607 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
1613 DiagID = diag::err_typecheck_invalid_restrict_not_pointer;
1624 ? diag::warn_c23_compat_restrict_on_array_of_pointers
1625 : diag::ext_restrict_on_array_of_pointers_c23);
1633 unsigned CVRAU,
const DeclSpec *DS) {
1667 Split.Quals.addCVRQualifiers(CVR);
1685 if (!
type->isObjCLifetimeType() ||
1695 if (
type.isConstQualified()) {
1701 }
else if (
type->isObjCARCImplicitlyUnretainedType()) {
1719 diag::err_arc_indirect_no_ownership,
type, isReference));
1721 S.
Diag(loc, diag::err_arc_indirect_no_ownership) <<
type << isReference;
1725 assert(implicitLifetime &&
"didn't infer any lifetime!");
1766enum QualifiedFunctionKind { QFK_BlockPointer, QFK_Pointer, QFK_Reference };
1772 QualifiedFunctionKind QFK) {
1779 S.
Diag(
Loc, diag::err_compound_qualified_function_type)
1780 << QFK << isa<FunctionType>(
T.IgnoreParens()) <<
T
1791 Diag(
Loc, diag::err_qualified_function_typeid)
1810 Diag(
Loc, diag::err_illegal_decl_pointer_to_reference)
1818 Diag(
Loc, diag::err_opencl_function_pointer) << 0;
1823 Diag(
Loc, diag::err_hlsl_pointers_unsupported) << 0;
1843 if (
T.isWebAssemblyReferenceType()) {
1844 Diag(
Loc, diag::err_wasm_reference_pr) << 0;
1850 Diag(
Loc, diag::err_wasm_table_pr) << 0;
1863 "Unresolved overloaded function type");
1891 Diag(
Loc, diag::err_reference_to_void);
1896 Diag(
Loc, diag::err_hlsl_pointers_unsupported) << 1;
1906 Diag(
Loc, diag::err_opencl_function_pointer) << 1;
1919 T.isWebAssemblyReferenceType()) {
1920 Diag(
Loc, diag::err_wasm_reference_pr) << 1;
1924 Diag(
Loc, diag::err_wasm_table_pr) << 1;
1947 llvm::APSInt Bits(32);
1954 size_t NumBits = Bits.getZExtValue();
1955 if (!IsUnsigned && NumBits < 2) {
1956 Diag(
Loc, diag::err_bit_int_bad_size) << 0;
1960 if (IsUnsigned && NumBits < 1) {
1961 Diag(
Loc, diag::err_bit_int_bad_size) << 1;
1967 Diag(
Loc, diag::err_bit_int_max_size)
1981 llvm::APSInt &SizeVal,
unsigned VLADiag,
2006 VLADiagnoser(
unsigned VLADiag,
bool VLAIsError)
2007 : VLADiag(VLADiag), VLAIsError(VLAIsError) {}
2011 return S.
Diag(
Loc, diag::err_array_size_non_int) <<
T;
2016 IsVLA = !VLAIsError;
2022 return S.
Diag(
Loc, diag::ext_vla_folded_to_constant);
2024 } Diagnoser(VLADiag, VLAIsError);
2028 if (Diagnoser.IsVLA)
2042 if (Size.isMultipleOf(Alignment))
2045 Diag(
Loc, diag::err_array_element_alignment)
2046 << EltTy << Size.getQuantity() << Alignment.
getQuantity();
2051 Expr *ArraySize,
unsigned Quals,
2068 Diag(
Loc, diag::err_illegal_decl_array_of_references)
2074 Diag(
Loc, diag::err_array_incomplete_or_sizeless_type) << 0 <<
T;
2079 diag::err_array_of_abstract_type))
2086 if (!MPTy->getQualifier().isDependent())
2092 if (!
T.isWebAssemblyReferenceType() &&
2094 diag::err_array_incomplete_or_sizeless_type))
2100 const auto *ATy = dyn_cast<ArrayType>(
T);
2101 if (ATy && ATy->getElementType().isWebAssemblyReferenceType()) {
2102 Diag(
Loc, diag::err_wasm_reftype_multidimensional_array);
2108 Diag(
Loc, diag::err_array_incomplete_or_sizeless_type) << 1 <<
T;
2113 Diag(
Loc, diag::err_illegal_decl_array_of_functions)
2121 if (RD->hasFlexibleArrayMember())
2122 Diag(
Loc, diag::ext_flexible_array_in_array) <<
T;
2124 Diag(
Loc, diag::err_objc_array_of_interfaces) <<
T;
2135 ArraySize =
Result.get();
2139 if (ArraySize && !ArraySize->
isPRValue()) {
2144 ArraySize =
Result.get();
2167 if (
const auto *CondExpr = dyn_cast_if_present<ConditionalOperator>(
2169 std::optional<llvm::APSInt> LHS =
2170 CondExpr->getLHS()->getIntegerConstantExpr(
Context);
2171 std::optional<llvm::APSInt> RHS =
2172 CondExpr->getRHS()->getIntegerConstantExpr(
Context);
2173 return LHS && RHS && LHS->isNegative() != RHS->isNegative();
2183 VLADiag = diag::err_opencl_vla;
2186 VLADiag = diag::warn_vla_used;
2189 VLADiag = diag::err_vla_in_sfinae;
2192 VLADiag = diag::err_openmp_vla_in_task_untied;
2197 ? diag::ext_vla_cxx_in_gnu_mode_static_assert
2198 : diag::ext_vla_cxx_static_assert;
2200 VLADiag =
getLangOpts().GNUMode ? diag::ext_vla_cxx_in_gnu_mode
2201 : diag::ext_vla_cxx;
2204 VLADiag = diag::ext_vla;
2245 if (ConstVal.isSigned() && ConstVal.isNegative()) {
2252 diag::err_typecheck_negative_array_size)
2256 if (ConstVal == 0 && !
T.isWebAssemblyReferenceType()) {
2261 : diag::ext_typecheck_zero_array_size)
2266 unsigned ActiveSizeBits =
2270 : ConstVal.getActiveBits();
2286 IsCUDADevice ? diag::err_cuda_vla : diag::err_vla_unsupported)
2287 << (IsCUDADevice ? llvm::to_underlying(
CUDA().CurrentTarget()) : 0);
2291 FSI->setHasVLA(
Loc);
2299 : diag::ext_c99_array_usage)
2310 Diag(
Loc, diag::err_opencl_invalid_type_array) << ArrType;
2320 bool ForMatrixType =
false) {
2323 if (!llvm::isPowerOf2_32(NumBits))
2324 return S.
Diag(AttrLoc, diag::err_attribute_invalid_bitint_vector_type)
2338 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << CurType;
2350 std::optional<llvm::APSInt> VecSize =
2353 Diag(AttrLoc, diag::err_attribute_argument_type)
2364 if (!VecSize->isIntN(61)) {
2366 Diag(AttrLoc, diag::err_attribute_size_too_large)
2370 uint64_t VectorSizeBits = VecSize->getZExtValue() * 8;
2373 if (VectorSizeBits == 0) {
2374 Diag(AttrLoc, diag::err_attribute_zero_size)
2379 if (!TypeSize || VectorSizeBits % TypeSize) {
2380 Diag(AttrLoc, diag::err_attribute_invalid_size)
2385 if (VectorSizeBits / TypeSize > std::numeric_limits<uint32_t>::max()) {
2386 Diag(AttrLoc, diag::err_attribute_size_too_large)
2410 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) <<
T;
2419 std::optional<llvm::APSInt> vecSize =
2422 Diag(AttrLoc, diag::err_attribute_argument_type)
2428 if (!vecSize->isIntN(32)) {
2429 Diag(AttrLoc, diag::err_attribute_size_too_large)
2435 unsigned vectorSize =
static_cast<unsigned>(vecSize->getZExtValue());
2437 if (vectorSize == 0) {
2438 Diag(AttrLoc, diag::err_attribute_zero_size)
2452 "Should never build a matrix type when it is disabled");
2457 Diag(AttrLoc, diag::err_attribute_invalid_matrix_type) << ElementTy;
2471 std::optional<llvm::APSInt> ValueRows =
2473 std::optional<llvm::APSInt> ValueColumns =
2480 if (!ValueRows && !ValueColumns) {
2481 Diag(AttrLoc, diag::err_attribute_argument_type)
2489 Diag(AttrLoc, diag::err_attribute_argument_type)
2495 if (!ValueColumns) {
2496 Diag(AttrLoc, diag::err_attribute_argument_type)
2502 unsigned MatrixRows =
static_cast<unsigned>(ValueRows->getZExtValue());
2503 unsigned MatrixColumns =
static_cast<unsigned>(ValueColumns->getZExtValue());
2504 if (MatrixRows == 0 && MatrixColumns == 0) {
2505 Diag(AttrLoc, diag::err_attribute_zero_size)
2506 <<
"matrix" << RowRange << ColRange;
2509 if (MatrixRows == 0) {
2510 Diag(AttrLoc, diag::err_attribute_zero_size) <<
"matrix" << RowRange;
2513 if (MatrixColumns == 0) {
2514 Diag(AttrLoc, diag::err_attribute_zero_size) <<
"matrix" << ColRange;
2518 Diag(AttrLoc, diag::err_attribute_size_too_large)
2519 << RowRange <<
"matrix row";
2523 Diag(AttrLoc, diag::err_attribute_size_too_large)
2524 << ColRange <<
"matrix column";
2533 Diag(
Loc, diag::err_func_returning_array_function)
2541 Diag(
Loc, diag::err_parameters_retval_cannot_have_fp16_type) << 1 <<
2549 Diag(
Loc, diag::err_object_cannot_be_passed_returned_by_value)
2555 if (
T.getPointerAuth()) {
2556 Diag(
Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 0;
2560 if (
T.hasNonTrivialToPrimitiveDestructCUnion() ||
2561 T.hasNonTrivialToPrimitiveCopyCUnion())
2568 Diag(
Loc, diag::warn_deprecated_volatile_return) <<
T;
2583 bool emittedError =
false;
2585 enum class RequiredCC { OnlySwift, SwiftOrSwiftAsync };
2586 auto checkCompatible = [&](
unsigned paramIndex, RequiredCC required) {
2588 (required == RequiredCC::OnlySwift)
2591 if (isCompatible || emittedError)
2593 S.
Diag(getParamLoc(paramIndex), diag::err_swift_param_attr_not_swiftcall)
2595 << (required == RequiredCC::OnlySwift);
2596 emittedError =
true;
2598 for (
size_t paramIndex = 0, numParams = paramTypes.size();
2599 paramIndex != numParams; ++paramIndex) {
2610 checkCompatible(paramIndex, RequiredCC::SwiftOrSwiftAsync);
2611 if (paramIndex != 0 &&
2614 S.
Diag(getParamLoc(paramIndex),
2615 diag::err_swift_indirect_result_not_first);
2620 checkCompatible(paramIndex, RequiredCC::SwiftOrSwiftAsync);
2629 checkCompatible(paramIndex, RequiredCC::OnlySwift);
2630 if (paramIndex == 0 ||
2633 S.
Diag(getParamLoc(paramIndex),
2634 diag::err_swift_error_result_not_after_swift_context);
2638 llvm_unreachable(
"bad ABI kind");
2650 for (
unsigned Idx = 0, Cnt = ParamTypes.size(); Idx < Cnt; ++Idx) {
2654 Diag(
Loc, diag::err_param_with_void_type);
2659 Diag(
Loc, diag::err_parameters_retval_cannot_have_fp16_type) << 0 <<
2663 Diag(
Loc, diag::err_wasm_table_as_function_parameter);
2667 Diag(
Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
2674 Diag(
Loc, diag::warn_deprecated_volatile_param) << ParamType;
2676 ParamTypes[Idx] = ParamType;
2681 [=](
unsigned i) {
return Loc; });
2707 D <<
"member pointer";
2715 Diag(
Loc, diag::err_distant_exception_spec);
2722 Diag(
Loc, diag::err_illegal_decl_mempointer_to_reference)
2728 Diag(
Loc, diag::err_illegal_decl_mempointer_to_void)
2736 Diag(
Loc, diag::err_opencl_function_pointer) << 0;
2741 Diag(
Loc, diag::err_hlsl_pointers_unsupported) << 0;
2760 Diag(
Loc, diag::err_nonfunction_block_type);
2776 if (TInfo) *TInfo =
nullptr;
2781 if (
const LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) {
2782 QT = LIT->getType();
2783 DI = LIT->getTypeSourceInfo();
2786 if (TInfo) *TInfo = DI;
2792 unsigned chunkIndex);
2799 Sema &S = state.getSema();
2800 Declarator &declarator = state.getDeclarator();
2806 unsigned outermostPointerIndex = 0;
2808 unsigned numPointers = 0;
2810 unsigned chunkIndex = i;
2812 switch (chunk.
Kind) {
2822 outermostPointerIndex = chunkIndex;
2830 if (numPointers != 1)
return;
2832 outermostPointerIndex = chunkIndex;
2850 if (numPointers == 1) {
2868 }
else if (numPointers == 2) {
2881 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership)
2885 outermostPointerIndex);
2907 }
const QualKinds[5] = {
2921 for (
auto &
E : QualKinds) {
2922 if (Quals &
E.Mask) {
2923 if (!QualStr.empty()) QualStr +=
' ';
2940 << QualStr <<
NumQuals << FixIts[0] << FixIts[1] << FixIts[2] << FixIts[3];
2946 unsigned FunctionChunkIndex) {
2948 D.getTypeObject(FunctionChunkIndex).Fun;
2956 for (
unsigned OuterChunkIndex = FunctionChunkIndex + 1,
2957 End =
D.getNumTypeObjects();
2958 OuterChunkIndex != End; ++OuterChunkIndex) {
2960 switch (OuterChunk.
Kind) {
2967 diag::warn_qual_return_type,
2989 D.getIdentifierLoc());
2993 llvm_unreachable(
"unknown declarator chunk kind");
3005 D.getDeclSpec().getTypeQualifiers(),
3006 D.getIdentifierLoc(),
3007 D.getDeclSpec().getConstSpecLoc(),
3008 D.getDeclSpec().getVolatileSpecLoc(),
3009 D.getDeclSpec().getRestrictSpecLoc(),
3010 D.getDeclSpec().getAtomicSpecLoc(),
3011 D.getDeclSpec().getUnalignedSpecLoc());
3014static std::pair<QualType, TypeSourceInfo *>
3018 Sema &S = state.getSema();
3022 const unsigned AutoParameterPosition = Info.
TemplateParams.size();
3023 const bool IsParameterPack =
D.hasEllipsis();
3034 D.getDeclSpec().getTypeSpecTypeLoc(),
3035 D.getIdentifierLoc(),
3036 TemplateParameterDepth, AutoParameterPosition,
3038 D.getIdentifier(), AutoParameterPosition),
false,
3039 IsParameterPack,
Auto->isConstrained());
3044 if (
Auto->isConstrained()) {
3051 for (
unsigned Idx = 0; Idx < AutoLoc.
getNumArgs(); ++Idx) {
3052 if (
D.getEllipsisLoc().isInvalid() && !
Invalid &&
3064 InventedTemplateParam,
D.getEllipsisLoc());
3078 if (
D.getEllipsisLoc().isInvalid()) {
3093 D.getDeclSpec().getTypeSpecScope().getWithLocInContext(S.
Context),
3097 USD ? cast<NamedDecl>(USD) : CD,
3099 InventedTemplateParam,
D.getEllipsisLoc());
3109 QualType NewT = state.ReplaceAutoType(
T, Replacement);
3113 return {NewT, NewTSI};
3122 Sema &SemaRef = state.getSema();
3125 ReturnTypeInfo =
nullptr;
3128 TagDecl *OwnedTagDecl =
nullptr;
3138 if (!
D.isInvalidType() &&
D.getDeclSpec().isTypeSpecOwned()) {
3139 OwnedTagDecl = cast<TagDecl>(
D.getDeclSpec().getRepAsDecl());
3152 D.getMutableDeclSpec().getAttributes());
3179 bool DeducedIsTrailingReturnType =
false;
3180 if (Deduced && isa<AutoType>(Deduced) &&
D.hasTrailingReturnType()) {
3183 DeducedIsTrailingReturnType =
true;
3193 bool IsCXXAutoType =
3195 bool IsDeducedReturnType =
false;
3197 switch (
D.getContext()) {
3236 assert(Info &&
"No LambdaScopeInfo on the stack!");
3242 if (!DeducedIsTrailingReturnType)
3247 if (
D.isStaticMember() ||
D.isFunctionDeclarator())
3250 if (isa<ObjCContainerDecl>(SemaRef.
CurContext)) {
3253 switch (cast<TagDecl>(SemaRef.
CurContext)->getTagKind()) {
3255 llvm_unreachable(
"unhandled tag kind");
3257 Error = Cxx ? 1 : 2;
3260 Error = Cxx ? 3 : 4;
3270 if (
D.getDeclSpec().isFriendSpecified())
3279 if (isa<DeducedTemplateSpecializationType>(Deduced) &&
3291 if (isa<DeducedTemplateSpecializationType>(Deduced) &&
3292 !
D.getNumTypeObjects() &&
3305 if (!SemaRef.
getLangOpts().CPlusPlus14 || !IsCXXAutoType)
3307 IsDeducedReturnType =
true;
3310 if (!SemaRef.
getLangOpts().CPlusPlus14 || !IsCXXAutoType)
3312 IsDeducedReturnType =
true;
3315 if (isa<DeducedTemplateSpecializationType>(Deduced))
3317 if (SemaRef.
getLangOpts().CPlusPlus23 && IsCXXAutoType &&
3318 !
Auto->isDecltypeAuto())
3337 if (!IsCXXAutoType && !isa<DeducedTemplateSpecializationType>(Deduced))
3350 if (
D.isFunctionDeclarator() &&
3351 (!SemaRef.
getLangOpts().CPlusPlus11 || !IsCXXAutoType))
3354 SourceRange AutoRange =
D.getDeclSpec().getTypeSpecTypeLoc();
3361 switch (
Auto->getKeyword()) {
3367 assert(isa<DeducedTemplateSpecializationType>(Deduced) &&
3368 "unknown auto type");
3372 auto *DTST = dyn_cast<DeducedTemplateSpecializationType>(Deduced);
3375 SemaRef.
Diag(AutoRange.
getBegin(), diag::err_auto_not_allowed)
3377 <<
QualType(Deduced, 0) << AutoRange;
3382 D.setInvalidType(
true);
3388 unsigned DiagId = 0;
3390 DiagId = diag::warn_cxx11_compat_generic_lambda;
3391 else if (IsDeducedReturnType)
3392 DiagId = diag::warn_cxx11_compat_deduced_return_type;
3394 DiagId = diag::warn_cxx98_compat_auto_type_specifier;
3397 SemaRef.
Diag(AutoRange.
getBegin(), DiagId) << AutoRange;
3405 unsigned DiagID = 0;
3406 switch (
D.getContext()) {
3411 llvm_unreachable(
"parser should not have allowed this");
3427 DiagID = diag::err_type_defined_in_alias_template;
3439 DiagID = diag::err_type_defined_in_type_specifier;
3449 DiagID = diag::err_type_defined_in_param_type;
3455 DiagID = diag::err_type_defined_in_condition;
3462 D.setInvalidType(
true);
3466 assert(!
T.isNull() &&
"This function should not return a null type");
3475 assert(FTI.
isAmbiguous &&
"no direct-initializer / function ambiguity");
3491 if (!
D.isFunctionDeclarator() ||
3505 FTI.
NumParams ? diag::warn_parens_disambiguated_as_function_declaration
3506 : diag::warn_empty_parens_are_function_decl)
3514 if (!
D.isFirstDeclarator() &&
D.getIdentifier()) {
3517 if (Comma.getFileID() != Name.getFileID() ||
3518 Comma.getSpellingLineNumber() != Name.getSpellingLineNumber()) {
3522 S.
Diag(
D.getCommaLoc(), diag::note_empty_parens_function_call)
3524 <<
D.getIdentifier();
3525 Result.suppressDiagnostics();
3538 S.
Diag(B, diag::note_additional_parens_for_variable_declaration)
3553 S.
Diag(DeclType.
Loc, diag::note_empty_parens_default_ctor)
3561 S.
Diag(DeclType.
Loc, diag::note_empty_parens_zero_initialize)
3572 "do not have redundant top-level parentheses");
3581 bool CouldBeTemporaryObject =
3582 S.
getLangOpts().CPlusPlus &&
D.isExpressionContext() &&
3583 !
D.isInvalidType() &&
D.getIdentifier() &&
3586 D.getDeclSpec().getTypeQualifiers() == 0 &&
D.isFirstDeclarator();
3588 bool StartsWithDeclaratorId =
true;
3589 for (
auto &
C :
D.type_objects()) {
3596 StartsWithDeclaratorId =
false;
3601 CouldBeTemporaryObject =
false;
3609 CouldBeTemporaryObject =
false;
3610 StartsWithDeclaratorId =
false;
3620 CouldBeTemporaryObject =
false;
3627 CouldBeTemporaryObject =
false;
3628 StartsWithDeclaratorId =
false;
3638 if (CouldBeTemporaryObject) {
3642 CouldBeTemporaryObject =
false;
3643 Result.suppressDiagnostics();
3648 if (!CouldBeTemporaryObject) {
3653 if (StartsWithDeclaratorId &&
D.getCXXScopeSpec().isValid()) {
3672 S.
Diag(
Paren.Loc, diag::warn_redundant_parens_around_declarator)
3678 S.
Diag(
Paren.Loc, diag::warn_parens_disambiguated_as_variable_declaration)
3679 << ParenRange <<
D.getIdentifier();
3681 if (!RD || !RD->hasDefinition() || RD->hasNonTrivialDestructor())
3682 S.
Diag(
Paren.Loc, diag::note_raii_guard_add_name)
3684 <<
D.getIdentifier();
3690 S.
Diag(
Paren.Loc, diag::note_remove_parens_for_variable_declaration)
3706 switch (AL.getKind()) {
3725 bool IsCXXInstanceMethod =
false;
3731 unsigned I = ChunkIndex;
3732 bool FoundNonParen =
false;
3733 while (I && !FoundNonParen) {
3736 FoundNonParen =
true;
3739 if (FoundNonParen) {
3742 IsCXXInstanceMethod =
3747 IsCXXInstanceMethod =
3751 assert(
D.isFunctionDeclarator());
3755 IsCXXInstanceMethod =
3756 D.isFirstDeclarationOfMember() &&
3758 !
D.isStaticMember();
3763 IsCXXInstanceMethod);
3771 if (Triple.isSPIRV() && Triple.getVendor() != llvm::Triple::AMD) {
3772 for (
const ParsedAttr &AL :
D.getDeclSpec().getAttributes()) {
3773 if (AL.getKind() == ParsedAttr::AT_CUDAGlobal) {
3781 for (
const ParsedAttr &AL :
D.getDeclSpec().getAttributes()) {
3782 if (AL.getKind() == ParsedAttr::AT_DeviceKernel) {
3794 enum class SimplePointerKind {
3803 switch (nullability) {
3805 if (!Ident__Nonnull)
3807 return Ident__Nonnull;
3810 if (!Ident__Nullable)
3812 return Ident__Nullable;
3815 if (!Ident__Nullable_result)
3817 return Ident__Nullable_result;
3820 if (!Ident__Null_unspecified)
3822 return Ident__Null_unspecified;
3824 llvm_unreachable(
"Unknown nullability kind.");
3831 if (AL.getKind() == ParsedAttr::AT_TypeNonNull ||
3832 AL.getKind() == ParsedAttr::AT_TypeNullable ||
3833 AL.getKind() == ParsedAttr::AT_TypeNullableResult ||
3834 AL.getKind() == ParsedAttr::AT_TypeNullUnspecified)
3843 enum class PointerDeclaratorKind {
3851 MaybePointerToCFRef,
3855 NSErrorPointerPointer,
3861 enum class PointerWrappingDeclaratorKind {
3875static PointerDeclaratorKind
3877 PointerWrappingDeclaratorKind &wrappingKind) {
3878 unsigned numNormalPointers = 0;
3881 if (
type->isDependentType())
3882 return PointerDeclaratorKind::NonPointer;
3887 switch (chunk.
Kind) {
3889 if (numNormalPointers == 0)
3890 wrappingKind = PointerWrappingDeclaratorKind::Array;
3899 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
3900 : PointerDeclaratorKind::SingleLevelPointer;
3906 if (numNormalPointers == 0)
3907 wrappingKind = PointerWrappingDeclaratorKind::Reference;
3911 ++numNormalPointers;
3912 if (numNormalPointers > 2)
3913 return PointerDeclaratorKind::MultiLevelPointer;
3919 unsigned numTypeSpecifierPointers = 0;
3923 ++numNormalPointers;
3925 if (numNormalPointers > 2)
3926 return PointerDeclaratorKind::MultiLevelPointer;
3928 type = ptrType->getPointeeType();
3929 ++numTypeSpecifierPointers;
3935 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
3936 : PointerDeclaratorKind::SingleLevelPointer;
3941 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
3942 : PointerDeclaratorKind::SingleLevelPointer;
3947 ++numNormalPointers;
3948 ++numTypeSpecifierPointers;
3951 if (
auto objcClassDecl = objcObjectPtr->getInterfaceDecl()) {
3953 numNormalPointers == 2 && numTypeSpecifierPointers < 2) {
3954 return PointerDeclaratorKind::NSErrorPointerPointer;
3963 if (objcClass->getInterface()->getIdentifier() ==
3965 if (numNormalPointers == 2 && numTypeSpecifierPointers < 2)
3966 return PointerDeclaratorKind::NSErrorPointerPointer;
3973 if (numNormalPointers == 0)
3974 return PointerDeclaratorKind::NonPointer;
3978 if (numNormalPointers == 2 && numTypeSpecifierPointers < 2 &&
3980 return PointerDeclaratorKind::CFErrorRefPointer;
3988 switch (numNormalPointers) {
3990 return PointerDeclaratorKind::NonPointer;
3993 return PointerDeclaratorKind::SingleLevelPointer;
3996 return PointerDeclaratorKind::MaybePointerToCFRef;
3999 return PointerDeclaratorKind::MultiLevelPointer;
4008 if (ctx->isFunctionOrMethod())
4011 if (ctx->isFileContext())
4022 bool invalid =
false;
4024 if (invalid || !sloc.
isFile())
4042template <
typename DiagBuilderT>
4051 if (!FixItLoc.
isValid() || FixItLoc == PointerLoc)
4060 InsertionTextBuf +=
" ";
4061 StringRef InsertionText = InsertionTextBuf.str();
4064 InsertionText = InsertionText.drop_back();
4065 }
else if (NextChar[-1] ==
'[') {
4066 if (NextChar[0] ==
']')
4067 InsertionText = InsertionText.drop_back().drop_front();
4069 InsertionText = InsertionText.drop_front();
4072 InsertionText = InsertionText.drop_back().drop_front();
4079 SimplePointerKind PointerKind,
4084 if (PointerKind == SimplePointerKind::Array) {
4085 S.
Diag(PointerLoc, diag::warn_nullability_missing_array);
4087 S.
Diag(PointerLoc, diag::warn_nullability_missing)
4088 <<
static_cast<unsigned>(PointerKind);
4091 auto FixItLoc = PointerEndLoc.
isValid() ? PointerEndLoc : PointerLoc;
4092 if (FixItLoc.isMacroID())
4096 auto Diag = S.
Diag(FixItLoc, diag::note_nullability_fix_it);
4097 Diag << static_cast<unsigned>(Nullability);
4098 Diag << static_cast<unsigned>(PointerKind);
4127 if (pointerKind == SimplePointerKind::Array)
4128 diagKind = diag::warn_nullability_missing_array;
4130 diagKind = diag::warn_nullability_missing;
4136 fileNullability.
PointerKind =
static_cast<unsigned>(pointerKind);
4168 auto kind =
static_cast<SimplePointerKind
>(fileNullability.
PointerKind);
4183 unsigned i = endIndex;
4211template<
typename AttrT>
4214 return ::new (Ctx) AttrT(Ctx, AL);
4221 return createSimpleAttr<TypeNonNullAttr>(Ctx,
Attr);
4224 return createSimpleAttr<TypeNullableAttr>(Ctx,
Attr);
4227 return createSimpleAttr<TypeNullableResultAttr>(Ctx,
Attr);
4230 return createSimpleAttr<TypeNullUnspecifiedAttr>(Ctx,
Attr);
4232 llvm_unreachable(
"unknown NullabilityKind");
4243 if (ASOld != ASNew) {
4244 S.
Diag(AttrLoc, diag::err_attribute_address_multiple_qualifiers);
4249 diag::warn_attribute_address_multiple_identical_qualifiers);
4263 !isa<RecordType, TemplateSpecializationType>(
4274 Sema &S = state.getSema();
4280 if (
D.getIdentifier())
4281 Name =
D.getIdentifier();
4284 bool IsTypedefName =
4300 bool IsClassTemplateDeduction = isa<DeducedTemplateSpecializationType>(DT);
4302 for (
unsigned I = 0,
E =
D.getNumTypeObjects(); I !=
E; ++I) {
4303 unsigned Index =
E - I - 1;
4305 unsigned DiagId = IsClassTemplateDeduction
4306 ? diag::err_deduced_class_template_compound_type
4307 : diag::err_decltype_auto_compound_type;
4308 unsigned DiagKind = 0;
4309 switch (DeclChunk.
Kind) {
4313 if (IsClassTemplateDeduction) {
4318 if (
D.isFunctionDeclarationContext() &&
4319 D.isFunctionDeclarator(FnIndex) && FnIndex == Index)
4321 DiagId = diag::err_decltype_auto_function_declarator_not_declaration;
4339 S.
Diag(DeclChunk.
Loc, DiagId) << DiagKind;
4340 D.setInvalidType(
true);
4347 std::optional<NullabilityKind> inferNullability;
4348 bool inferNullabilityCS =
false;
4349 bool inferNullabilityInnerOnly =
false;
4350 bool inferNullabilityInnerOnlyComplete =
false;
4353 bool inAssumeNonNullRegion =
false;
4355 if (assumeNonNullLoc.
isValid()) {
4356 inAssumeNonNullRegion =
true;
4370 } complainAboutMissingNullability = CAMN_No;
4371 unsigned NumPointersRemaining = 0;
4372 auto complainAboutInferringWithinChunk = PointerWrappingDeclaratorKind::None;
4374 if (IsTypedefName) {
4378 complainAboutMissingNullability = CAMN_InnerPointers;
4382 ++NumPointersRemaining;
4385 for (
unsigned i = 0, n =
D.getNumTypeObjects(); i != n; ++i) {
4387 switch (chunk.
Kind) {
4395 ++NumPointersRemaining;
4403 ++NumPointersRemaining;
4408 bool isFunctionOrMethod =
false;
4409 switch (
auto context = state.getDeclarator().getContext()) {
4415 isFunctionOrMethod =
true;
4419 if (state.getDeclarator().isObjCIvar() && !isFunctionOrMethod) {
4420 complainAboutMissingNullability = CAMN_No;
4425 if (state.getDeclarator().isObjCWeakProperty()) {
4428 complainAboutMissingNullability = CAMN_No;
4429 if (inAssumeNonNullRegion) {
4439 complainAboutMissingNullability = CAMN_Yes;
4442 auto wrappingKind = PointerWrappingDeclaratorKind::None;
4444 case PointerDeclaratorKind::NonPointer:
4445 case PointerDeclaratorKind::MultiLevelPointer:
4449 case PointerDeclaratorKind::SingleLevelPointer:
4451 if (inAssumeNonNullRegion) {
4452 complainAboutInferringWithinChunk = wrappingKind;
4459 case PointerDeclaratorKind::CFErrorRefPointer:
4460 case PointerDeclaratorKind::NSErrorPointerPointer:
4463 if (isFunctionOrMethod && inAssumeNonNullRegion)
4467 case PointerDeclaratorKind::MaybePointerToCFRef:
4468 if (isFunctionOrMethod) {
4472 auto hasCFReturnsAttr =
4474 return AttrList.hasAttribute(ParsedAttr::AT_CFReturnsRetained) ||
4475 AttrList.hasAttribute(ParsedAttr::AT_CFReturnsNotRetained);
4477 if (
const auto *InnermostChunk =
D.getInnermostNonParenChunk()) {
4478 if (hasCFReturnsAttr(
D.getDeclarationAttributes()) ||
4479 hasCFReturnsAttr(
D.getAttributes()) ||
4480 hasCFReturnsAttr(InnermostChunk->getAttrs()) ||
4481 hasCFReturnsAttr(
D.getDeclSpec().getAttributes())) {
4483 inferNullabilityInnerOnly =
true;
4493 complainAboutMissingNullability = CAMN_Yes;
4521 auto isVaList = [&S](
QualType T) ->
bool {
4527 if (typedefTy->getDecl() == vaListTypedef)
4529 if (
auto *name = typedefTy->getDecl()->getIdentifier())
4530 if (name->isStr(
"va_list"))
4532 typedefTy = typedefTy->desugar()->getAs<
TypedefType>();
4533 }
while (typedefTy);
4539 auto inferPointerNullability =
4544 if (NumPointersRemaining > 0)
4545 --NumPointersRemaining;
4552 if (inferNullability && !inferNullabilityInnerOnlyComplete) {
4555 ? ParsedAttr::Form::ContextSensitiveKeyword()
4556 : ParsedAttr::Form::Keyword(
false ,
4562 attrs.addAtEnd(nullabilityAttr);
4564 if (inferNullabilityCS) {
4565 state.getDeclarator().getMutableDeclSpec().getObjCQualifiers()
4569 if (pointerLoc.isValid() &&
4570 complainAboutInferringWithinChunk !=
4571 PointerWrappingDeclaratorKind::None) {
4573 S.
Diag(pointerLoc, diag::warn_nullability_inferred_on_nested_type);
4574 Diag << static_cast<int>(complainAboutInferringWithinChunk);
4578 if (inferNullabilityInnerOnly)
4579 inferNullabilityInnerOnlyComplete =
true;
4580 return nullabilityAttr;
4585 switch (complainAboutMissingNullability) {
4589 case CAMN_InnerPointers:
4590 if (NumPointersRemaining == 0)
4606 if (NumPointersRemaining > 0)
4607 --NumPointersRemaining;
4609 SimplePointerKind pointerKind = SimplePointerKind::Pointer;
4611 pointerKind = SimplePointerKind::BlockPointer;
4613 pointerKind = SimplePointerKind::MemberPointer;
4615 if (
auto *
attr = inferPointerNullability(
4616 pointerKind,
D.getDeclSpec().getTypeSpecTypeLoc(),
4618 D.getMutableDeclSpec().getAttributes(),
4619 D.getMutableDeclSpec().getAttributePool())) {
4620 T = state.getAttributedType(
4626 if (complainAboutMissingNullability == CAMN_Yes &&
T->
isArrayType() &&
4630 D.getDeclSpec().getTypeSpecTypeLoc());
4634 bool ExpectNoDerefChunk =
4635 state.getCurrentAttributes().hasAttribute(ParsedAttr::AT_NoDeref);
4645 bool AreDeclaratorChunksValid =
true;
4646 for (
unsigned i = 0, e =
D.getNumTypeObjects(); i != e; ++i) {
4647 unsigned chunkIndex = e - i - 1;
4648 state.setCurrentChunkIndex(chunkIndex);
4651 switch (DeclType.
Kind) {
4659 if (!LangOpts.Blocks)
4660 S.
Diag(DeclType.
Loc, diag::err_blocks_disable) << LangOpts.OpenCL;
4663 inferPointerNullability(SimplePointerKind::BlockPointer, DeclType.
Loc,
4665 state.getDeclarator().getAttributePool());
4671 if (LangOpts.OpenCL)
4680 S.
Diag(
D.getIdentifierLoc(), diag::err_distant_exception_spec);
4681 D.setInvalidType(
true);
4686 inferPointerNullability(SimplePointerKind::Pointer, DeclType.
Loc,
4688 state.getDeclarator().getAttributePool());
4700 if (LangOpts.OpenCL) {
4703 S.
Diag(
D.getIdentifierLoc(), diag::err_opencl_pointer_to_type) <<
T;
4704 D.setInvalidType(
true);
4716 S.
Diag(
D.getIdentifierLoc(), diag::err_distant_exception_spec);
4717 D.setInvalidType(
true);
4730 S.
Diag(
D.getIdentifierLoc(), diag::err_distant_exception_spec);
4731 D.setInvalidType(
true);
4741 if (chunkIndex != 0 && !ArraySize &&
4742 D.getDeclSpec().getAttributes().hasMSPropertyAttr()) {
4760 S.
Diag(DeclType.
Loc, diag::err_array_star_outside_prototype);
4762 D.setInvalidType(
true);
4769 if (!(
D.isPrototypeContext() ||
4771 S.
Diag(DeclType.
Loc, diag::err_array_static_outside_prototype)
4773 :
"type qualifier");
4778 D.setInvalidType(
true);
4784 S.
Diag(DeclType.
Loc, diag::err_array_static_not_outermost)
4786 :
"type qualifier");
4790 D.setInvalidType(
true);
4796 if (complainAboutMissingNullability == CAMN_Yes &&
4812 IsQualifiedFunction =
4817 if (!
D.isInvalidType()) {
4821 return SS.isInvalid() ||
4843 ? dyn_cast_if_present<ParmVarDecl>(FTI.
Params[0].
Param)
4846 bool IsFunctionDecl =
D.getInnermostNonParenChunk() == &DeclType;
4847 if (
First &&
First->isExplicitObjectParameter() &&
4858 !IsClassType(
D.getCXXScopeSpec())) {
4861 diag::err_explicit_object_parameter_nonmember)
4863 <<
First->getSourceRange();
4866 diag::err_explicit_object_parameter_invalid)
4867 <<
First->getSourceRange();
4872 AreDeclaratorChunksValid =
false;
4877 if (
D.getDeclSpec().hasAutoTypeSpec() &&
4880 S.
Diag(
D.getDeclSpec().getTypeSpecTypeLoc(),
4882 ? diag::err_auto_missing_trailing_return
4883 : diag::err_deduced_return_type);
4885 D.setInvalidType(
true);
4886 AreDeclaratorChunksValid =
false;
4888 S.
Diag(
D.getDeclSpec().getTypeSpecTypeLoc(),
4889 diag::warn_cxx11_compat_deduced_return_type);
4893 if (isa<ParenType>(
T)) {
4896 D.setInvalidType(
true);
4898 AreDeclaratorChunksValid =
false;
4899 }
else if (
D.getName().
getKind() ==
4903 diag::err_deduction_guide_with_complex_decl)
4905 D.setInvalidType(
true);
4907 AreDeclaratorChunksValid =
false;
4910 (
T.hasQualifiers() || !isa<AutoType>(
T) ||
4911 cast<AutoType>(
T)->getKeyword() !=
4913 cast<AutoType>(
T)->isConstrained())) {
4924 S.
Diag(
Loc, diag::err_trailing_return_without_auto) <<
T << SR;
4925 D.setInvalidType(
true);
4927 AreDeclaratorChunksValid =
false;
4933 D.setInvalidType(
true);
4943 if (InventedParamInfo) {
4945 state,
T, TInfo,
Auto, *InventedParamInfo);
4956 if (!
D.isInvalidType() &&
4961 unsigned diagID = diag::err_func_returning_array_function;
4964 if (chunkIndex == 0 &&
4966 diagID = diag::err_block_returning_array_function;
4969 D.setInvalidType(
true);
4970 AreDeclaratorChunksValid =
false;
4979 S.
Diag(
D.getIdentifierLoc(), diag::err_opencl_invalid_return)
4981 D.setInvalidType(
true);
4983 }
else if (!S.
getLangOpts().NativeHalfArgsAndReturns &&
4985 S.
Diag(
D.getIdentifierLoc(),
4986 diag::err_parameters_retval_cannot_have_fp16_type) << 1;
4987 D.setInvalidType(
true);
4992 if (
T.getPointerAuth()) {
4993 S.
Diag(DeclType.
Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 0;
4996 if (LangOpts.OpenCL) {
5001 S.
Diag(
D.getIdentifierLoc(), diag::err_opencl_invalid_return)
5003 D.setInvalidType(
true);
5010 "__cl_clang_variadic_functions", S.
getLangOpts()) &&
5011 !(
D.getIdentifier() &&
5012 ((
D.getIdentifier()->getName() ==
"printf" &&
5014 D.getIdentifier()->getName().starts_with(
"__")))) {
5015 S.
Diag(
D.getIdentifierLoc(), diag::err_opencl_variadic_function);
5016 D.setInvalidType(
true);
5028 DiagLoc =
D.getDeclSpec().getTypeSpecTypeLoc();
5031 S.
Diag(DiagLoc, diag::err_object_cannot_be_passed_returned_by_value)
5043 AreDeclaratorChunksValid =
false;
5046 D.setInvalidType(
true);
5055 D.getFunctionDefinitionKind() ==
5060 S.
Diag(DeclType.
Loc, diag::err_func_returning_qualified_void) <<
T;
5067 if (
T.isVolatileQualified() && S.
getLangOpts().CPlusPlus20)
5068 S.
Diag(DeclType.
Loc, diag::warn_deprecated_volatile_return) <<
T;
5073 if (
T.getQualifiers().hasObjCLifetime()) {
5075 if (chunkIndex + 1 <
D.getNumTypeObjects()) {
5078 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership) {
5079 AttrLoc = AL.getLoc();
5085 for (
const ParsedAttr &AL :
D.getDeclSpec().getAttributes()) {
5086 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership) {
5087 AttrLoc = AL.getLoc();
5101 S.
Diag(AttrLoc, diag::warn_arc_lifetime_result_type)
5102 <<
T.getQualifiers().getObjCLifetime();
5106 if (LangOpts.CPlusPlus &&
D.getDeclSpec().hasTagDefinition()) {
5109 TagDecl *Tag = cast<TagDecl>(
D.getDeclSpec().getRepAsDecl());
5110 S.
Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
5118 diag::err_exception_spec_in_typedef)
5144 diag::warn_c17_compat_ellipsis_only_parameter);
5145 else if (!
D.getDeclarationAttributes().hasAttribute(
5146 ParsedAttr::AT_Overloadable) &&
5147 !
D.getAttributes().hasAttribute(
5148 ParsedAttr::AT_Overloadable) &&
5149 !
D.getDeclSpec().getAttributes().hasAttribute(
5150 ParsedAttr::AT_Overloadable))
5158 diag::err_ident_list_in_fn_declaration);
5159 D.setInvalidType(
true);
5164 AreDeclaratorChunksValid =
false;
5187 bool HasAnyInterestingExtParameterInfos =
false;
5189 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
5192 assert(!ParamTy.
isNull() &&
"Couldn't parse type?");
5203 ParamTy = Context.
IntTy;
5208 ParamTy = Context.
IntTy;
5213 S.
Diag(DeclType.
Loc, diag::err_void_param_qualified);
5215 for (
const auto *A : Param->
attrs()) {
5216 S.
Diag(A->getLoc(), diag::warn_attribute_on_void_param)
5217 << A << A->getRange();
5224 diag::err_void_explicit_object_param);
5242 }
else if (!S.
getLangOpts().NativeHalfArgsAndReturns &&
5245 diag::err_parameters_retval_cannot_have_fp16_type) << 0;
5253 if (BTy->getKind() == BuiltinType::Float) {
5265 if (LangOpts.ObjCAutoRefCount && Param->
hasAttr<NSConsumedAttr>()) {
5266 ExtParameterInfos[i] = ExtParameterInfos[i].withIsConsumed(
true);
5267 HasAnyInterestingExtParameterInfos =
true;
5271 ExtParameterInfos[i] =
5272 ExtParameterInfos[i].withABI(
attr->getABI());
5273 HasAnyInterestingExtParameterInfos =
true;
5276 if (Param->
hasAttr<PassObjectSizeAttr>()) {
5277 ExtParameterInfos[i] = ExtParameterInfos[i].withHasPassObjectSize();
5278 HasAnyInterestingExtParameterInfos =
true;
5281 if (Param->
hasAttr<NoEscapeAttr>()) {
5282 ExtParameterInfos[i] = ExtParameterInfos[i].withIsNoEscape(
true);
5283 HasAnyInterestingExtParameterInfos =
true;
5286 ParamTys.push_back(ParamTy);
5289 if (HasAnyInterestingExtParameterInfos) {
5298 Expr *NoexceptExpr =
nullptr;
5304 DynamicExceptions.reserve(N);
5305 DynamicExceptionRanges.reserve(N);
5306 for (
unsigned I = 0; I != N; ++I) {
5317 DynamicExceptionRanges,
5324 auto IsClassMember = [&]() {
5325 return (!state.getDeclarator().getCXXScopeSpec().isEmpty() &&
5326 state.getDeclarator()
5330 state.getDeclarator().getContext() ==
5332 state.getDeclarator().getContext() ==
5336 if (state.getSema().getLangOpts().OpenCLCPlusPlus && IsClassMember()) {
5345 D.setInvalidType(
true);
5365 inferPointerNullability(SimplePointerKind::MemberPointer, DeclType.
Loc,
5367 state.getDeclarator().getAttributePool());
5371 D.setInvalidType(
true);
5372 AreDeclaratorChunksValid =
false;
5380 D.setInvalidType(
true);
5381 AreDeclaratorChunksValid =
false;
5391 D.getMutableDeclSpec().getAttributes());
5397 D.setInvalidType(
true);
5399 AreDeclaratorChunksValid =
false;
5408 S.
Diag(DeclType.
Loc, diag::warn_noderef_on_non_pointer_or_array);
5410 ExpectNoDerefChunk = state.didParseNoDeref();
5414 if (ExpectNoDerefChunk)
5415 S.
Diag(state.getDeclarator().getBeginLoc(),
5416 diag::warn_noderef_on_non_pointer_or_array);
5429 bool IsBlock =
false;
5431 switch (DeclType.Kind) {
5443 S.
Diag(DeclType.Loc, diag::warn_strict_prototypes)
5455 assert(!
T.isNull() &&
"T must not be null after this point");
5459 assert(FnTy &&
"Why oh why is there not a FunctionProtoType here?");
5472 ExplicitObjectMember,
5476 Kind = DeductionGuide;
5477 else if (!
D.getCXXScopeSpec().isSet()) {
5480 !
D.getDeclSpec().isFriendSpecified())
5490 if (
D.isFunctionDeclarator(I)) {
5494 if (
P &&
P->isExplicitObjectParameter())
5495 Kind = ExplicitObjectMember;
5521 if (IsQualifiedFunction &&
5524 (Kind !=
Member ||
D.isExplicitObjectMemberFunction() ||
5527 D.isStaticMember())) &&
5533 if (
D.isFunctionDeclarator(I)) {
5546 if (!RemovalLocs.empty()) {
5547 llvm::sort(RemovalLocs,
5549 RemovalRange =
SourceRange(RemovalLocs.front(), RemovalLocs.back());
5550 Loc = RemovalLocs.front();
5554 S.
Diag(
Loc, diag::err_invalid_qualified_function_type)
5555 << Kind <<
D.isFunctionDeclarator() <<
T
5567 for (
unsigned i = 0, e =
D.getNumTypeObjects(); i != e; ++i) {
5577 for (
ParsedAttr &AL :
D.getDeclarationAttributes()) {
5578 if (!AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
5586 state.diagnoseIgnoredTypeAttrs(
T);
5597 if (
T.isVolatileQualified() && S.
getLangOpts().CPlusPlus20 &&
5600 S.
Diag(
D.getIdentifierLoc(), diag::warn_deprecated_volatile_param) <<
T;
5604 if (
D.hasEllipsis()) {
5609 switch (
D.getContext()) {
5624 S.
Diag(
D.getEllipsisLoc(),
5625 diag::err_function_parameter_pack_without_parameter_packs)
5645 S.
Diag(
D.getEllipsisLoc(),
5646 LangOpts.CPlusPlus11
5647 ? diag::warn_cxx98_compat_variadic_templates
5648 : diag::ext_variadic_templates);
5677 S.
Diag(
D.getEllipsisLoc(),
5678 diag::err_ellipsis_in_declarator_not_parameter);
5684 assert(!
T.isNull() &&
"T must not be null at the end of this function");
5685 if (!AreDeclaratorChunksValid)
5697 TypeProcessingState state(*
this,
D);
5701 if (
D.isPrototypeContext() &&
getLangOpts().ObjCAutoRefCount)
5720 unsigned chunkIndex) {
5721 Sema &S = state.getSema();
5729 const char *attrStr =
nullptr;
5730 switch (ownership) {
5748 &Args, 1, ParsedAttr::Form::GNU());
5757 Sema &S = state.getSema();
5761 bool hasIndirection =
false;
5762 for (
unsigned i = 0, e =
D.getNumTypeObjects(); i != e; ++i) {
5764 switch (chunk.
Kind) {
5773 hasIndirection =
true;
5806 TypeProcessingState state(*
this,
D);
5821 TypeProcessingState &State) {
5826 TypeProcessingState &State) {
5828 State.getSema().HLSL().TakeLocForHLSLAttribute(TL.
getTypePtr());
5836 if (AL.getKind() == ParsedAttr::AT_MatrixType) {
5845 llvm_unreachable(
"no matrix_type attribute found at the expected location!");
5850 switch (Chunk.
Kind) {
5855 llvm_unreachable(
"cannot be _Atomic qualified");
5873 class TypeSpecLocFiller :
public TypeLocVisitor<TypeSpecLocFiller> {
5876 TypeProcessingState &State;
5880 TypeSpecLocFiller(
Sema &S,
ASTContext &Context, TypeProcessingState &State,
5882 : SemaRef(S), Context(Context), State(State), DS(DS) {}
5899 State.getExpansionLocForMacroQualifiedType(TL.
getTypePtr()));
5916 TL.
set(TL.
getTypePtr()->getKeyword() != ElaboratedTypeKeyword::None
5931 TL.
set(TL.
getTypePtr()->getKeyword() != ElaboratedTypeKeyword::None
5946 TL.
set(TL.
getTypePtr()->getKeyword() != ElaboratedTypeKeyword::None
6039 void VisitDependentTemplateSpecializationTypeLoc(
6068 if (TemplateId->
NumArgs > 0) {
6080 FoundDecl = cast<NamedDecl>(USD);
6082 FoundDecl = cast_if_present<NamedDecl>(TN.getAsTemplateDecl());
6090 void VisitDeducedTemplateSpecializationTypeLoc(
6109 ElaboratedTypeKeyword::None
6150 void VisitTypeLoc(
TypeLoc TL) {
6156 class DeclaratorLocFiller :
public TypeLocVisitor<DeclaratorLocFiller> {
6158 TypeProcessingState &State;
6162 DeclaratorLocFiller(
ASTContext &Context, TypeProcessingState &State,
6164 : Context(Context), State(State), Chunk(Chunk) {}
6167 llvm_unreachable(
"qualified type locs not expected here!");
6170 llvm_unreachable(
"decayed type locs not expected here!");
6173 llvm_unreachable(
"array parameter type locs not expected here!");
6230 for (
unsigned i = 0, e = TL.
getNumParams(), tpi = 0; i != e; ++i) {
6269 void VisitTypeLoc(
TypeLoc TL) {
6270 llvm_unreachable(
"unsupported TypeLoc kind in declarator!");
6279 if (AL.getKind() == ParsedAttr::AT_AddressSpace) {
6288 "no address_space attribute found at the expected location!");
6302 Sema &S = State.getSema();
6309 if (isa<PackExpansionType>(
T)) {
6314 for (
unsigned i = 0, e =
D.getNumTypeObjects(); i != e; ++i) {
6318 D.getDeclSpec().getAttributes().hasMSPropertyAttr())
6328 bool HasDesugaredTypeLoc =
true;
6329 while (HasDesugaredTypeLoc) {
6331 case TypeLoc::MacroQualified: {
6334 State.getExpansionLocForMacroQualifiedType(TL.
getTypePtr()));
6339 case TypeLoc::Attributed: {
6346 case TypeLoc::Adjusted:
6347 case TypeLoc::BTFTagAttributed: {
6352 case TypeLoc::DependentAddressSpace: {
6360 HasDesugaredTypeLoc =
false;
6365 DeclaratorLocFiller(S.
Context, State,
D.getTypeObject(i)).Visit(CurrTL);
6371 if (ReturnTypeInfo) {
6376 TypeSpecLocFiller(S, S.
Context, State,
D.getDeclSpec()).Visit(CurrTL);
6391 "LocInfoType's TypeClass conflicts with an existing Type class");
6397 llvm_unreachable(
"LocInfoType leaked into the type system; an opaque TypeTy*"
6398 " was used directly instead of getting the QualType through"
6399 " GetTypeFromParser");
6405 assert(
D.getIdentifier() ==
nullptr &&
6406 "Type name should have no identifier!");
6410 if (
D.isInvalidType())
6443 const Expr *AddrSpace,
6446 std::optional<llvm::APSInt> OptAddrSpace =
6448 if (!OptAddrSpace) {
6449 S.
Diag(AttrLoc, diag::err_attribute_argument_type)
6454 llvm::APSInt &addrSpace = *OptAddrSpace;
6457 if (addrSpace.isSigned()) {
6458 if (addrSpace.isNegative()) {
6459 S.
Diag(AttrLoc, diag::err_attribute_address_space_negative)
6463 addrSpace.setIsSigned(
false);
6466 llvm::APSInt
max(addrSpace.getBitWidth());
6470 if (addrSpace >
max) {
6471 S.
Diag(AttrLoc, diag::err_attribute_address_space_too_high)
6502 Diag(AttrLoc, diag::err_attribute_address_multiple_qualifiers);
6518 TypeProcessingState &State) {
6519 Sema &S = State.getSema();
6525 if (!
Attr.diagnoseLangOpts(S)) {
6531 if (
Attr.getNumArgs() != 1) {
6532 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
6539 auto *StrLiteral = dyn_cast<StringLiteral>(
Attr.getArgAsExpr(0));
6548 StringRef BTFTypeTag = StrLiteral->getString();
6549 Type = State.getBTFTagAttributedType(
6550 ::new (Ctx) BTFTypeTagAttr(Ctx,
Attr, BTFTypeTag),
Type);
6558 TypeProcessingState &State) {
6559 Sema &S = State.getSema();
6564 S.
Diag(
Attr.
getLoc(), diag::err_attribute_address_function_type);
6570 if (
Attr.
getKind() == ParsedAttr::AT_AddressSpace) {
6573 if (
Attr.getNumArgs() != 1) {
6580 Expr *ASArgExpr =
Attr.getArgAsExpr(0);
6589 ::new (Ctx) AddressSpaceAttr(Ctx,
Attr,
static_cast<unsigned>(ASIdx));
6601 if (EquivType.
isNull()) {
6605 T = State.getAttributedType(ASAttr,
Type, EquivType);
6607 T = State.getAttributedType(ASAttr,
Type,
Type);
6618 :
Attr.asOpenCLLangAS();
6620 ASIdx =
Attr.asHLSLLangAS();
6623 llvm_unreachable(
"Invalid address space");
6641 bool NonObjCPointer =
false;
6643 if (!
type->isDependentType() && !
type->isUndeducedType()) {
6651 NonObjCPointer =
true;
6652 }
else if (!
type->isObjCRetainableType()) {
6658 if (state.isProcessingDeclSpec()) {
6666 Sema &S = state.getSema();
6672 if (!
attr.isArgIdent(0)) {
6673 S.
Diag(AttrLoc, diag::err_attribute_argument_type) <<
attr
6681 if (II->
isStr(
"none"))
6683 else if (II->
isStr(
"strong"))
6685 else if (II->
isStr(
"weak"))
6687 else if (II->
isStr(
"autoreleasing"))
6690 S.
Diag(AttrLoc, diag::warn_attribute_type_not_supported) <<
attr << II;
6707 =
type.getQualifiers().getObjCLifetime()) {
6710 S.
Diag(AttrLoc, diag::err_attr_objc_ownership_redundant)
6717 if (previousLifetime != lifetime) {
6720 const Type *prevTy =
nullptr;
6721 while (!prevTy || prevTy != underlyingType.
Ty) {
6722 prevTy = underlyingType.
Ty;
6731 if (NonObjCPointer) {
6732 StringRef name =
attr.getAttrName()->getName();
6741 S.
Diag(AttrLoc, diag::warn_type_attribute_wrong_type) << name
6758 type = state.getAttributedType(
6759 createSimpleAttr<ObjCInertUnsafeUnretainedAttr>(S.
Context,
attr),
6765 if (!NonObjCPointer)
6782 diagnostic,
type, 0));
6784 S.
Diag(loc, diagnostic);
6793 unsigned diagnostic =
6794 (S.
getLangOpts().ObjCWeakRuntime ? diag::err_arc_weak_disabled
6795 : diag::err_arc_weak_no_runtime);
6798 diagnoseOrDelay(S, AttrLoc, diagnostic,
type);
6810 if (
Class->isArcWeakrefUnavailable()) {
6811 S.
Diag(AttrLoc, diag::err_arc_unsupported_weak_class);
6812 S.
Diag(ObjT->getInterfaceDecl()->getLocation(),
6813 diag::note_class_declared);
6828 Sema &S = state.getSema();
6831 if (!
type->isPointerType() &&
6832 !
type->isObjCObjectPointerType() &&
6833 !
type->isBlockPointerType())
6837 S.
Diag(
attr.getLoc(), diag::err_attribute_multiple_objc_gc);
6843 if (!
attr.isArgIdent(0)) {
6844 S.
Diag(
attr.getLoc(), diag::err_attribute_argument_type)
6850 if (
attr.getNumArgs() > 1) {
6851 S.
Diag(
attr.getLoc(), diag::err_attribute_wrong_number_arguments) <<
attr
6858 if (II->
isStr(
"weak"))
6860 else if (II->
isStr(
"strong"))
6863 S.
Diag(
attr.getLoc(), diag::warn_attribute_type_not_supported)
6873 if (
attr.getLoc().isValid())
6874 type = state.getAttributedType(
6891 struct FunctionTypeUnwrapper {
6910 const Type *Ty =
T.getTypePtr();
6911 if (isa<FunctionType>(Ty)) {
6912 Fn = cast<FunctionType>(Ty);
6914 }
else if (isa<ParenType>(Ty)) {
6915 T = cast<ParenType>(Ty)->getInnerType();
6917 }
else if (isa<ConstantArrayType>(Ty) || isa<VariableArrayType>(Ty) ||
6918 isa<IncompleteArrayType>(Ty)) {
6919 T = cast<ArrayType>(Ty)->getElementType();
6920 Stack.push_back(Array);
6921 }
else if (isa<PointerType>(Ty)) {
6924 }
else if (isa<BlockPointerType>(Ty)) {
6926 Stack.push_back(BlockPointer);
6927 }
else if (isa<MemberPointerType>(Ty)) {
6929 Stack.push_back(MemberPointer);
6930 }
else if (isa<ReferenceType>(Ty)) {
6933 }
else if (isa<AttributedType>(Ty)) {
6934 T = cast<AttributedType>(Ty)->getEquivalentType();
6935 Stack.push_back(Attributed);
6936 }
else if (isa<MacroQualifiedType>(Ty)) {
6937 T = cast<MacroQualifiedType>(Ty)->getUnderlyingType();
6938 Stack.push_back(MacroQualified);
6947 Stack.push_back(Desugar);
6952 bool isFunctionType()
const {
return (Fn !=
nullptr); }
6957 if (
New == get())
return Original;
6960 return wrap(S.
Context, Original, 0);
6965 if (I == Stack.size())
6974 return wrap(
C, SplitOld.
Ty, I);
6975 return C.getQualifiedType(wrap(
C, SplitOld.
Ty, I), SplitOld.
Quals);
6979 if (I == Stack.size())
return QualType(Fn, 0);
6981 switch (
static_cast<WrapKind
>(Stack[I++])) {
6988 return wrap(
C, cast<AttributedType>(Old)->getEquivalentType(), I);
6991 QualType New = wrap(
C, cast<ParenType>(Old)->getInnerType(), I);
6992 return C.getParenType(
New);
6995 case MacroQualified:
6999 if (
const auto *CAT = dyn_cast<ConstantArrayType>(Old)) {
7001 return C.getConstantArrayType(
New, CAT->getSize(), CAT->getSizeExpr(),
7002 CAT->getSizeModifier(),
7003 CAT->getIndexTypeCVRQualifiers());
7006 if (
const auto *VAT = dyn_cast<VariableArrayType>(Old)) {
7008 return C.getVariableArrayType(
New, VAT->getSizeExpr(),
7009 VAT->getSizeModifier(),
7010 VAT->getIndexTypeCVRQualifiers());
7013 const auto *IAT = cast<IncompleteArrayType>(Old);
7015 return C.getIncompleteArrayType(
New, IAT->getSizeModifier(),
7016 IAT->getIndexTypeCVRQualifiers());
7021 return C.getPointerType(
New);
7024 case BlockPointer: {
7026 return C.getBlockPointerType(
New);
7029 case MemberPointer: {
7039 if (isa<LValueReferenceType>(OldRef))
7042 return C.getRValueReferenceType(
New);
7046 llvm_unreachable(
"unknown wrapping kind");
7053 Sema &S = State.getSema();
7057 default: llvm_unreachable(
"Unknown attribute kind");
7058 case ParsedAttr::AT_Ptr32:
7059 A = createSimpleAttr<Ptr32Attr>(S.
Context, PAttr);
7061 case ParsedAttr::AT_Ptr64:
7062 A = createSimpleAttr<Ptr64Attr>(S.
Context, PAttr);
7064 case ParsedAttr::AT_SPtr:
7065 A = createSimpleAttr<SPtrAttr>(S.
Context, PAttr);
7067 case ParsedAttr::AT_UPtr:
7068 A = createSimpleAttr<UPtrAttr>(S.
Context, PAttr);
7072 std::bitset<attr::LastAttr> Attrs;
7075 if (
const TypedefType *TT = dyn_cast<TypedefType>(Desugared)) {
7076 Desugared = TT->desugar();
7089 if (Attrs[NewAttrKind]) {
7090 S.
Diag(PAttr.
getLoc(), diag::warn_duplicate_attribute_exact) << PAttr;
7093 Attrs[NewAttrKind] =
true;
7097 if (Attrs[attr::Ptr32] && Attrs[attr::Ptr64]) {
7098 S.
Diag(PAttr.
getLoc(), diag::err_attributes_are_not_compatible)
7100 <<
"'__ptr64'" << 0;
7102 }
else if (Attrs[attr::SPtr] && Attrs[attr::UPtr]) {
7103 S.
Diag(PAttr.
getLoc(), diag::err_attributes_are_not_compatible)
7111 if (!isa<PointerType>(Desugared)) {
7115 S.
Diag(PAttr.
getLoc(), diag::err_attribute_no_member_pointers) << PAttr;
7117 S.
Diag(PAttr.
getLoc(), diag::err_attribute_pointers_only) << PAttr << 0;
7125 if (PtrWidth == 32) {
7126 if (Attrs[attr::Ptr64])
7128 else if (Attrs[attr::UPtr])
7130 }
else if (PtrWidth == 64 && Attrs[attr::Ptr32]) {
7147 assert(PAttr.
getKind() == ParsedAttr::AT_WebAssemblyFuncref);
7149 Sema &S = State.getSema();
7150 Attr *A = createSimpleAttr<WebAssemblyFuncrefAttr>(S.
Context, PAttr);
7152 std::bitset<attr::LastAttr> Attrs;
7154 const auto *AT = dyn_cast<AttributedType>(QT);
7156 Attrs[AT->getAttrKind()] =
true;
7157 AT = dyn_cast<AttributedType>(AT->getModifiedType());
7162 if (Attrs[NewAttrKind]) {
7163 S.
Diag(PAttr.
getLoc(), diag::warn_duplicate_attribute_exact) << PAttr;
7181 Sema &S = State.getSema();
7182 auto &
D = State.getDeclarator();
7188 if (State.isProcessingDeclSpec()) {
7189 if (!(
D.isPrototypeContext() ||
7193 if (
auto *chunk =
D.getInnermostNonParenChunk()) {
7216 auto chunkIdx = State.getCurrentChunkIndex();
7217 if (chunkIdx >= 1 &&
7220 D.getTypeObject(chunkIdx - 1).
getAttrs());
7225 auto *A = ::new (S.
Context) SwiftAttrAttr(S.
Context, PAttr, Str);
7226 QT = State.getAttributedType(A, QT, QT);
7233 auto Attributed = dyn_cast<AttributedType>(
Type.getTypePtr());
7238 if (Attributed->getImmediateNullability())
7239 return Attributed->getModifiedType();
7243 Ctx, Attributed->getModifiedType());
7244 assert(Modified.
getTypePtr() != Attributed->getModifiedType().getTypePtr());
7246 Attributed->getEquivalentType(),
7247 Attributed->getAttr());
7253 case ParsedAttr::AT_TypeNonNull:
7256 case ParsedAttr::AT_TypeNullable:
7259 case ParsedAttr::AT_TypeNullableResult:
7262 case ParsedAttr::AT_TypeNullUnspecified:
7266 llvm_unreachable(
"not a nullability attribute kind");
7273 bool IsContextSensitive,
bool AllowOnArrayType,
bool OverrideExisting) {
7274 bool Implicit = (State ==
nullptr);
7280 while (
auto *Attributed = dyn_cast<AttributedType>(Desugared.
getTypePtr())) {
7282 if (
auto ExistingNullability = Attributed->getImmediateNullability()) {
7284 if (Nullability == *ExistingNullability) {
7288 S.
Diag(NullabilityLoc, diag::warn_nullability_duplicate)
7295 if (!OverrideExisting) {
7297 S.
Diag(NullabilityLoc, diag::err_nullability_conflicting)
7307 Desugared = Attributed->getModifiedType();
7315 if (Nullability != *ExistingNullability && !
Implicit) {
7316 S.
Diag(NullabilityLoc, diag::err_nullability_conflicting)
7324 if (
auto typedefNullability =
7326 if (*typedefNullability == *ExistingNullability) {
7339 !(AllowOnArrayType && Desugared->
isArrayType())) {
7341 S.
Diag(NullabilityLoc, diag::err_nullability_nonpointer)
7349 if (IsContextSensitive) {
7351 const Type *pointeeType =
nullptr;
7360 S.
Diag(NullabilityLoc, diag::err_nullability_cs_multilevel)
7362 S.
Diag(NullabilityLoc, diag::note_nullability_type_specifier)
7374 QT = State->getAttributedType(A, QT, QT);
7383 bool AllowOnArrayType) {
7389 Nullability, NullabilityLoc,
7390 IsContextSensitive, AllowOnArrayType,
7397 bool AllowArrayTypes,
7398 bool OverrideExisting) {
7400 *
this,
nullptr,
nullptr,
Type, Nullability, DiagLoc,
7401 false, AllowArrayTypes, OverrideExisting);
7408 Sema &S = state.getSema();
7410 if (isa<ObjCTypeParamType>(
type)) {
7412 type = state.getAttributedType(
7425 S.
Diag(
attr.getLoc(), diag::err_objc_kindof_nonobject)
7434 objType->getBaseType(), objType->getTypeArgsAsWritten(),
7435 objType->getProtocols(),
7436 objType->isObjCUnqualifiedId() ?
false :
true);
7441 if (
auto nullability =
type->getNullability()) {
7444 assert(
attr.getAttributeSpellingListIndex() == 0 &&
7445 "multiple spellings for __kindof?");
7448 equivType = state.getAttributedType(A, equivType, equivType);
7453 type = state.getAttributedType(
7466 Declarator &declarator = state.getDeclarator();
7469 auto moveToChunk = [&](
DeclaratorChunk &chunk,
bool inFunction) ->
bool {
7482 PK_MemberFunctionPointer,
7487 : inFunction? PK_MemberFunctionPointer : PK_MemberPointer;
7489 auto diag = state.getSema().Diag(
attr.getLoc(),
7490 diag::warn_nullability_declspec)
7492 attr.isContextSensitiveKeywordAttribute())
7494 <<
static_cast<unsigned>(pointerKind);
7500 state.getSema().getPreprocessor().getLocForEndOfToken(
7502 " " +
attr.getAttrName()->getName().str() +
" ");
7512 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
7514 switch (chunk.
Kind) {
7518 return moveToChunk(chunk,
false);
7530 return moveToChunk(*dest,
true);
7546 assert(!
Attr.isInvalid());
7549 llvm_unreachable(
"not a calling convention attribute");
7550 case ParsedAttr::AT_CDecl:
7551 return createSimpleAttr<CDeclAttr>(Ctx,
Attr);
7552 case ParsedAttr::AT_FastCall:
7553 return createSimpleAttr<FastCallAttr>(Ctx,
Attr);
7554 case ParsedAttr::AT_StdCall:
7555 return createSimpleAttr<StdCallAttr>(Ctx,
Attr);
7556 case ParsedAttr::AT_ThisCall:
7557 return createSimpleAttr<ThisCallAttr>(Ctx,
Attr);
7558 case ParsedAttr::AT_RegCall:
7559 return createSimpleAttr<RegCallAttr>(Ctx,
Attr);
7560 case ParsedAttr::AT_Pascal:
7561 return createSimpleAttr<PascalAttr>(Ctx,
Attr);
7562 case ParsedAttr::AT_SwiftCall:
7563 return createSimpleAttr<SwiftCallAttr>(Ctx,
Attr);
7564 case ParsedAttr::AT_SwiftAsyncCall:
7565 return createSimpleAttr<SwiftAsyncCallAttr>(Ctx,
Attr);
7566 case ParsedAttr::AT_VectorCall:
7567 return createSimpleAttr<VectorCallAttr>(Ctx,
Attr);
7568 case ParsedAttr::AT_AArch64VectorPcs:
7569 return createSimpleAttr<AArch64VectorPcsAttr>(Ctx,
Attr);
7570 case ParsedAttr::AT_AArch64SVEPcs:
7571 return createSimpleAttr<AArch64SVEPcsAttr>(Ctx,
Attr);
7572 case ParsedAttr::AT_ArmStreaming:
7573 return createSimpleAttr<ArmStreamingAttr>(Ctx,
Attr);
7574 case ParsedAttr::AT_DeviceKernel:
7575 return createSimpleAttr<DeviceKernelAttr>(Ctx,
Attr);
7576 case ParsedAttr::AT_Pcs: {
7581 if (
Attr.isArgExpr(0))
7582 Str = cast<StringLiteral>(
Attr.getArgAsExpr(0))->getString();
7584 Str =
Attr.getArgAsIdent(0)->getIdentifierInfo()->getName();
7585 PcsAttr::PCSType
Type;
7586 if (!PcsAttr::ConvertStrToPCSType(Str,
Type))
7587 llvm_unreachable(
"already validated the attribute");
7588 return ::new (Ctx) PcsAttr(Ctx,
Attr,
Type);
7590 case ParsedAttr::AT_IntelOclBicc:
7591 return createSimpleAttr<IntelOclBiccAttr>(Ctx,
Attr);
7592 case ParsedAttr::AT_MSABI:
7593 return createSimpleAttr<MSABIAttr>(Ctx,
Attr);
7594 case ParsedAttr::AT_SysVABI:
7595 return createSimpleAttr<SysVABIAttr>(Ctx,
Attr);
7596 case ParsedAttr::AT_PreserveMost:
7597 return createSimpleAttr<PreserveMostAttr>(Ctx,
Attr);
7598 case ParsedAttr::AT_PreserveAll:
7599 return createSimpleAttr<PreserveAllAttr>(Ctx,
Attr);
7600 case ParsedAttr::AT_M68kRTD:
7601 return createSimpleAttr<M68kRTDAttr>(Ctx,
Attr);
7602 case ParsedAttr::AT_PreserveNone:
7603 return createSimpleAttr<PreserveNoneAttr>(Ctx,
Attr);
7604 case ParsedAttr::AT_RISCVVectorCC:
7605 return createSimpleAttr<RISCVVectorCCAttr>(Ctx,
Attr);
7606 case ParsedAttr::AT_RISCVVLSCC: {
7609 unsigned ABIVLen = 128;
7610 if (
Attr.getNumArgs()) {
7611 std::optional<llvm::APSInt> MaybeABIVLen =
7612 Attr.getArgAsExpr(0)->getIntegerConstantExpr(Ctx);
7614 llvm_unreachable(
"Invalid RISC-V ABI VLEN");
7615 ABIVLen = MaybeABIVLen->getZExtValue();
7618 return ::new (Ctx) RISCVVLSCCAttr(Ctx,
Attr, ABIVLen);
7621 llvm_unreachable(
"unexpected attribute kind!");
7624std::optional<FunctionEffectMode>
7629 std::optional<llvm::APSInt> ConditionValue =
7631 if (!ConditionValue) {
7637 return std::nullopt;
7646 FunctionTypeUnwrapper &Unwrapped) {
7648 if (!Unwrapped.isFunctionType())
7651 Sema &S = TPState.getSema();
7655 if (FPT ==
nullptr) {
7656 S.
Diag(PAttr.
getLoc(), diag::err_func_with_effects_no_prototype)
7663 bool IsNonBlocking = PAttr.
getKind() == ParsedAttr::AT_NonBlocking ||
7664 PAttr.
getKind() == ParsedAttr::AT_Blocking;
7667 Expr *CondExpr =
nullptr;
7669 if (PAttr.
getKind() == ParsedAttr::AT_NonBlocking ||
7670 PAttr.
getKind() == ParsedAttr::AT_NonAllocating) {
7679 std::optional<FunctionEffectMode> MaybeMode =
7685 NewMode = *MaybeMode;
7720 assert(
Success &&
"effect conflicts should have been diagnosed above");
7724 FPT->getParamTypes(), EPI);
7733 auto OtherAttr = llvm::find_if(
7734 state.getCurrentAttributes(),
7735 [OtherKind](
const ParsedAttr &A) { return A.getKind() == OtherKind; });
7736 if (OtherAttr == state.getCurrentAttributes().end() || OtherAttr->isInvalid())
7739 Sema &S = state.getSema();
7741 << *OtherAttr <<
Attr
7742 << (OtherAttr->isRegularKeywordAttribute() ||
7744 S.
Diag(OtherAttr->getLoc(), diag::note_conflicting_attribute);
7752 if (!
Attr.getNumArgs()) {
7758 for (
unsigned I = 0; I <
Attr.getNumArgs(); ++I) {
7759 StringRef StateName;
7764 if (StateName !=
"sme_za_state") {
7765 S.
Diag(LiteralLoc, diag::err_unknown_arm_state) << StateName;
7772 S.
Diag(
Attr.
getLoc(), diag::err_conflicting_attributes_arm_agnostic);
7787 if (!
Attr.getNumArgs()) {
7793 for (
unsigned I = 0; I <
Attr.getNumArgs(); ++I) {
7794 StringRef StateName;
7801 if (StateName ==
"za") {
7804 }
else if (StateName ==
"zt0") {
7808 S.
Diag(LiteralLoc, diag::err_unknown_arm_state) << StateName;
7814 S.
Diag(LiteralLoc, diag::err_conflicting_attributes_arm_agnostic);
7823 S.
Diag(LiteralLoc, diag::err_conflicting_attributes_arm_state)
7839 Sema &S = state.getSema();
7841 FunctionTypeUnwrapper unwrapped(S,
type);
7843 if (
attr.getKind() == ParsedAttr::AT_NoReturn) {
7848 if (!unwrapped.isFunctionType())
7857 if (
attr.getKind() == ParsedAttr::AT_CFIUncheckedCallee) {
7859 if (!unwrapped.isFunctionType())
7862 if (!unwrapped.get()->isFunctionProtoType()) {
7863 S.
Diag(
attr.getLoc(), diag::warn_attribute_wrong_decl_type)
7864 <<
attr <<
attr.isRegularKeywordAttribute()
7872 FPT->getReturnType(), FPT->getParamTypes(),
7873 FPT->getExtProtoInfo().withCFIUncheckedCallee(
true));
7874 type = unwrapped.wrap(S, cast<FunctionType>(
type.getTypePtr()));
7878 if (
attr.getKind() == ParsedAttr::AT_CmseNSCall) {
7880 if (!unwrapped.isFunctionType())
7885 S.
Diag(
attr.getLoc(), diag::warn_attribute_ignored) <<
attr;
7899 if (
attr.getKind() == ParsedAttr::AT_NSReturnsRetained) {
7900 if (
attr.getNumArgs())
return true;
7903 if (!unwrapped.isFunctionType())
7908 attr.getLoc(), unwrapped.get()->getReturnType()))
7913 if (state.getSema().getLangOpts().ObjCAutoRefCount) {
7918 type = state.getAttributedType(
7919 createSimpleAttr<NSReturnsRetainedAttr>(S.
Context,
attr),
7924 if (
attr.getKind() == ParsedAttr::AT_AnyX86NoCallerSavedRegisters) {
7929 if (!unwrapped.isFunctionType())
7938 if (
attr.getKind() == ParsedAttr::AT_AnyX86NoCfCheck) {
7940 S.
Diag(
attr.getLoc(), diag::warn_nocf_check_attribute_ignored);
7950 if (!unwrapped.isFunctionType())
7959 if (
attr.getKind() == ParsedAttr::AT_Regparm) {
7965 if (!unwrapped.isFunctionType())
7972 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
7974 <<
attr.isRegularKeywordAttribute();
7985 if (
attr.getKind() == ParsedAttr::AT_CFISalt) {
7986 if (
attr.getNumArgs() != 1)
7994 if (!unwrapped.isFunctionType())
7999 S.
Diag(
attr.getLoc(), diag::err_attribute_wrong_decl_type)
8000 <<
attr <<
attr.isRegularKeywordAttribute()
8010 FnTy->getParamTypes(), EPI);
8015 if (
attr.getKind() == ParsedAttr::AT_ArmStreaming ||
8016 attr.getKind() == ParsedAttr::AT_ArmStreamingCompatible ||
8017 attr.getKind() == ParsedAttr::AT_ArmPreserves ||
8018 attr.getKind() == ParsedAttr::AT_ArmIn ||
8019 attr.getKind() == ParsedAttr::AT_ArmOut ||
8020 attr.getKind() == ParsedAttr::AT_ArmInOut ||
8021 attr.getKind() == ParsedAttr::AT_ArmAgnostic) {
8025 if (
attr.getKind() == ParsedAttr::AT_ArmStreaming ||
8026 attr.getKind() == ParsedAttr::AT_ArmStreamingCompatible)
8030 if (!unwrapped.isFunctionType())
8037 S.
Diag(
attr.getLoc(), diag::warn_attribute_wrong_decl_type)
8038 <<
attr <<
attr.isRegularKeywordAttribute()
8045 switch (
attr.getKind()) {
8046 case ParsedAttr::AT_ArmStreaming:
8048 ParsedAttr::AT_ArmStreamingCompatible))
8052 case ParsedAttr::AT_ArmStreamingCompatible:
8057 case ParsedAttr::AT_ArmPreserves:
8061 case ParsedAttr::AT_ArmIn:
8065 case ParsedAttr::AT_ArmOut:
8069 case ParsedAttr::AT_ArmInOut:
8073 case ParsedAttr::AT_ArmAgnostic:
8078 llvm_unreachable(
"Unsupported attribute");
8082 FnTy->getParamTypes(), EPI);
8087 if (
attr.getKind() == ParsedAttr::AT_NoThrow) {
8089 if (!unwrapped.isFunctionType())
8102 if (Proto->hasExceptionSpec()) {
8103 switch (Proto->getExceptionSpecType()) {
8105 llvm_unreachable(
"This doesn't have an exception spec!");
8123 S.
Diag(
attr.getLoc(), diag::warn_nothrow_attribute_ignored);
8129 type = unwrapped.wrap(
8138 if (
attr.getKind() == ParsedAttr::AT_NonBlocking ||
8139 attr.getKind() == ParsedAttr::AT_NonAllocating ||
8140 attr.getKind() == ParsedAttr::AT_Blocking ||
8141 attr.getKind() == ParsedAttr::AT_Allocating) {
8146 if (!unwrapped.isFunctionType())
return false;
8161 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8164 <<
attr.isRegularKeywordAttribute();
8183 return S.
Diag(
attr.getLoc(), diag::warn_cconv_unsupported)
8188 return S.
Diag(
attr.getLoc(), diag::err_cconv_varargs)
8195 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8197 <<
attr.isRegularKeywordAttribute();
8209 auto EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
8233 FunctionTypeUnwrapper Unwrapped(*
this,
T);
8235 bool IsVariadic = (isa<FunctionProtoType>(FT) &&
8236 cast<FunctionProtoType>(FT)->isVariadic());
8250 Diag(
Loc, diag::warn_cconv_unsupported)
8261 if (CurCC != DefaultCC)
8269 QualType Wrapped = Unwrapped.wrap(*
this, FT);
8283 if (
Attr.getNumArgs() != 1) {
8290 Expr *SizeExpr =
Attr.getArgAsExpr(0);
8303 if (
Attr.getNumArgs() != 1) {
8309 Expr *SizeExpr =
Attr.getArgAsExpr(0);
8324 bool IsPolyUnsigned = Triple.getArch() == llvm::Triple::aarch64 ||
8325 Triple.getArch() == llvm::Triple::aarch64_32 ||
8326 Triple.getArch() == llvm::Triple::aarch64_be;
8328 if (IsPolyUnsigned) {
8330 return BTy->
getKind() == BuiltinType::UChar ||
8331 BTy->
getKind() == BuiltinType::UShort ||
8332 BTy->
getKind() == BuiltinType::ULong ||
8333 BTy->
getKind() == BuiltinType::ULongLong;
8336 return BTy->
getKind() == BuiltinType::SChar ||
8337 BTy->
getKind() == BuiltinType::Short ||
8338 BTy->
getKind() == BuiltinType::LongLong;
8344 if ((Triple.isArch64Bit() || Triple.getArch() == llvm::Triple::aarch64_32) &&
8345 BTy->
getKind() == BuiltinType::Double)
8348 return BTy->
getKind() == BuiltinType::SChar ||
8349 BTy->
getKind() == BuiltinType::UChar ||
8350 BTy->
getKind() == BuiltinType::Short ||
8351 BTy->
getKind() == BuiltinType::UShort ||
8352 BTy->
getKind() == BuiltinType::Int ||
8353 BTy->
getKind() == BuiltinType::UInt ||
8354 BTy->
getKind() == BuiltinType::Long ||
8355 BTy->
getKind() == BuiltinType::ULong ||
8356 BTy->
getKind() == BuiltinType::LongLong ||
8357 BTy->
getKind() == BuiltinType::ULongLong ||
8358 BTy->
getKind() == BuiltinType::Float ||
8359 BTy->
getKind() == BuiltinType::Half ||
8360 BTy->
getKind() == BuiltinType::BFloat16 ||
8361 BTy->
getKind() == BuiltinType::MFloat8;
8366 const auto *AttrExpr =
Attr.getArgAsExpr(0);
8367 if (!AttrExpr->isTypeDependent()) {
8368 if (std::optional<llvm::APSInt> Res =
8369 AttrExpr->getIntegerConstantExpr(S.
Context)) {
8411 if (
Attr.getNumArgs() != 1) {
8412 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8418 llvm::APSInt numEltsInt(32);
8424 S.
Diag(
Attr.
getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
8431 unsigned numElts =
static_cast<unsigned>(numEltsInt.getZExtValue());
8432 unsigned vecSize = typeSize * numElts;
8433 if (vecSize != 64 && vecSize != 128) {
8434 S.
Diag(
Attr.
getLoc(), diag::err_attribute_bad_neon_vector_size) << CurType;
8446 assert((
Attr.getNumArgs() > 0 &&
Attr.getNumArgs() <= 3) &&
8447 "__ptrauth qualifier takes between 1 and 3 arguments");
8448 Expr *KeyArg =
Attr.getArgAsExpr(0);
8449 Expr *IsAddressDiscriminatedArg =
8450 Attr.getNumArgs() >= 2 ?
Attr.getArgAsExpr(1) :
nullptr;
8451 Expr *ExtraDiscriminatorArg =
8452 Attr.getNumArgs() >= 3 ?
Attr.getArgAsExpr(2) :
nullptr;
8461 bool IsInvalid =
false;
8462 unsigned IsAddressDiscriminated, ExtraDiscriminator;
8465 IsAddressDiscriminated);
8475 S.
Diag(
Attr.
getLoc(), diag::err_ptrauth_qualifier_invalid_target) <<
T;
8480 if (
T.getPointerAuth()) {
8492 assert((!IsAddressDiscriminatedArg || IsAddressDiscriminated <= 1) &&
8493 "address discriminator arg should be either 0 or 1");
8495 Key, IsAddressDiscriminated, ExtraDiscriminator,
8517 S.
Diag(
Attr.
getLoc(), diag::err_attribute_arm_feature_sve_bits_unsupported)
8524 if (
Attr.getNumArgs() != 1) {
8525 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8532 llvm::APSInt SveVectorSizeInBits(32);
8536 unsigned VecSize =
static_cast<unsigned>(SveVectorSizeInBits.getZExtValue());
8559 if (BT->getKind() == BuiltinType::SveBool) {
8564 VecSize /= TypeSize;
8571 const VectorType *VT = dyn_cast<VectorType>(CurType);
8574 diag::err_attribute_arm_mve_polymorphism);
8580 State.getAttributedType(createSimpleAttr<ArmMveStrictPolymorphismAttr>(
8581 State.getSema().Context,
Attr),
8593 <<
Attr <<
"'zve32x'";
8600 if (!VScale || !VScale->first || VScale->first != VScale->second) {
8601 S.
Diag(
Attr.
getLoc(), diag::err_attribute_riscv_rvv_bits_unsupported)
8608 if (
Attr.getNumArgs() != 1) {
8609 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8616 llvm::APSInt RVVVectorSizeInBits(32);
8628 unsigned VecSize =
static_cast<unsigned>(RVVVectorSizeInBits.getZExtValue());
8632 unsigned MinElts = Info.
EC.getKnownMinValue();
8635 unsigned ExpectedSize = VScale->first * MinElts;
8657 ExpectedSize *= EltSize;
8658 NumElts = VecSize / EltSize;
8662 if (VecSize != ExpectedSize) {
8664 << VecSize << ExpectedSize;
8677 S.
Diag(
Attr.
getLoc(), diag::err_opencl_invalid_access_qualifier);
8683 QualType BaseTy = TypedefTy->desugar();
8685 std::string PrevAccessQual;
8687 if (TypedefTy->getDecl()->hasAttr<OpenCLAccessAttr>()) {
8688 OpenCLAccessAttr *
Attr =
8689 TypedefTy->getDecl()->getAttr<OpenCLAccessAttr>();
8692 PrevAccessQual =
"read_only";
8696 switch (ImgType->getKind()) {
8697 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8698 case BuiltinType::Id: \
8699 PrevAccessQual = #Access; \
8701 #include "clang/Basic/OpenCLImageTypes.def"
8703 llvm_unreachable(
"Unable to find corresponding image type.");
8706 llvm_unreachable(
"unexpected type");
8709 if (PrevAccessQual == AttrName.ltrim(
"_")) {
8715 S.
Diag(
Attr.
getLoc(), diag::err_opencl_multiple_access_qualifiers);
8718 S.
Diag(TypedefTy->getDecl()->getBeginLoc(),
8719 diag::note_opencl_typedef_access_qualifier) << PrevAccessQual;
8721 if (
Attr.getSemanticSpelling() == OpenCLAccessAttr::Keyword_write_only) {
8736 if (
Attr.getNumArgs() != 2) {
8737 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8742 Expr *RowsExpr =
Attr.getArgAsExpr(0);
8743 Expr *ColsExpr =
Attr.getArgAsExpr(1);
8751 Sema &S = State.getSema();
8754 S.
Diag(PA.
getLoc(), diag::err_attribute_too_few_arguments) << PA << 1;
8766 for (
unsigned Idx = 1; Idx < PA.
getNumArgs(); Idx++) {
8772 auto *AnnotateTypeAttr =
8773 AnnotateTypeAttr::Create(S.
Context, Str, Args.data(), Args.size(), PA);
8774 CurType = State.getAttributedType(AnnotateTypeAttr, CurType, CurType);
8780 if (State.getDeclarator().isDeclarationOfFunction()) {
8781 CurType = State.getAttributedType(
8782 createSimpleAttr<LifetimeBoundAttr>(State.getSema().Context,
Attr),
8786 State.getSema().Diag(
Attr.
getLoc(), diag::err_attribute_wrong_decl_type)
8793 if (State.getDeclarator().isDeclarationOfFunction()) {
8794 auto *
Attr = State.getSema().ParseLifetimeCaptureByAttr(PA,
"this");
8796 CurType = State.getAttributedType(
Attr, CurType, CurType);
8808 if (
Attr.getSemanticSpelling() == HLSLParamModifierAttr::Keyword_inout ||
8809 Attr.getSemanticSpelling() == HLSLParamModifierAttr::Keyword_out) {
8810 State.setParsedHLSLParamMod(
true);
8819 if (
Attr.
getKind() != ParsedAttr::AT_DeviceKernel)
8821 return DeviceKernelAttr::isAMDGPUSpelling(
Attr);
8829 state.setParsedNoDeref(
false);
8845 if (
attr.isInvalid())
8848 if (
attr.isStandardAttributeSyntax() ||
attr.isRegularKeywordAttribute()) {
8853 if (
attr.isGNUScope()) {
8854 assert(
attr.isStandardAttributeSyntax());
8855 bool IsTypeAttr =
attr.isTypeAttr();
8857 state.getSema().Diag(
attr.getLoc(),
8859 ? diag::warn_gcc_ignores_type_attr
8860 : diag::warn_cxx11_gnu_attribute_on_type)
8866 !
attr.isTypeAttr()) {
8879 switch (
attr.getKind()) {
8882 if ((
attr.isStandardAttributeSyntax() ||
8883 attr.isRegularKeywordAttribute()) &&
8885 state.getSema().Diag(
attr.getLoc(), diag::err_attribute_not_type_attr)
8886 <<
attr <<
attr.isRegularKeywordAttribute();
8887 attr.setUsedAsTypeAttr();
8892 if (
attr.isStandardAttributeSyntax()) {
8893 state.getSema().DiagnoseUnknownAttribute(
attr);
8903 case ParsedAttr::AT_BTFTypeTag:
8905 attr.setUsedAsTypeAttr();
8908 case ParsedAttr::AT_MayAlias:
8911 attr.setUsedAsTypeAttr();
8913 case ParsedAttr::AT_OpenCLPrivateAddressSpace:
8914 case ParsedAttr::AT_OpenCLGlobalAddressSpace:
8915 case ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace:
8916 case ParsedAttr::AT_OpenCLGlobalHostAddressSpace:
8917 case ParsedAttr::AT_OpenCLLocalAddressSpace:
8918 case ParsedAttr::AT_OpenCLConstantAddressSpace:
8919 case ParsedAttr::AT_OpenCLGenericAddressSpace:
8920 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
8921 case ParsedAttr::AT_AddressSpace:
8923 attr.setUsedAsTypeAttr();
8928 attr.setUsedAsTypeAttr();
8930 case ParsedAttr::AT_VectorSize:
8932 attr.setUsedAsTypeAttr();
8934 case ParsedAttr::AT_ExtVectorType:
8936 attr.setUsedAsTypeAttr();
8938 case ParsedAttr::AT_NeonVectorType:
8940 attr.setUsedAsTypeAttr();
8942 case ParsedAttr::AT_NeonPolyVectorType:
8945 attr.setUsedAsTypeAttr();
8947 case ParsedAttr::AT_ArmSveVectorBits:
8949 attr.setUsedAsTypeAttr();
8951 case ParsedAttr::AT_ArmMveStrictPolymorphism: {
8953 attr.setUsedAsTypeAttr();
8956 case ParsedAttr::AT_RISCVRVVVectorBits:
8958 attr.setUsedAsTypeAttr();
8960 case ParsedAttr::AT_OpenCLAccess:
8962 attr.setUsedAsTypeAttr();
8964 case ParsedAttr::AT_PointerAuth:
8967 attr.setUsedAsTypeAttr();
8969 case ParsedAttr::AT_LifetimeBound:
8973 case ParsedAttr::AT_LifetimeCaptureBy:
8978 case ParsedAttr::AT_NoDeref: {
8983 if (
attr.isStandardAttributeSyntax()) {
8984 state.getSema().Diag(
attr.getLoc(), diag::warn_attribute_ignored)
8989 type = state.getAttributedType(createSimpleAttr<NoDerefAttr>(Ctx,
attr),
8991 attr.setUsedAsTypeAttr();
8992 state.setParsedNoDeref(
true);
8996 case ParsedAttr::AT_MatrixType:
8998 attr.setUsedAsTypeAttr();
9001 case ParsedAttr::AT_WebAssemblyFuncref: {
9003 attr.setUsedAsTypeAttr();
9007 case ParsedAttr::AT_HLSLParamModifier: {
9009 attr.setUsedAsTypeAttr();
9013 case ParsedAttr::AT_SwiftAttr: {
9020 attr.setUsedAsTypeAttr();
9028 if (
type->canHaveNullability() ||
type->isDependentType() ||
9029 type->isArrayType() ||
9033 endIndex = state.getCurrentChunkIndex();
9035 endIndex = state.getDeclarator().getNumTypeObjects();
9036 bool allowOnArrayType =
9037 state.getDeclarator().isPrototypeContext() &&
9040 allowOnArrayType)) {
9044 attr.setUsedAsTypeAttr();
9048 case ParsedAttr::AT_ObjCKindOf:
9056 state.getSema().Diag(
attr.getLoc(),
9057 diag::err_objc_kindof_wrong_position)
9060 state.getDeclarator().getDeclSpec().getBeginLoc(),
9070 case ParsedAttr::AT_NoThrow:
9073 if (!state.getSema().getLangOpts().CPlusPlus)
9080 attr.setUsedAsTypeAttr();
9084 if (
attr.isStandardAttributeSyntax() ||
9085 attr.isRegularKeywordAttribute()) {
9102 case ParsedAttr::AT_AcquireHandle: {
9103 if (!
type->isFunctionType())
9106 if (
attr.getNumArgs() != 1) {
9107 state.getSema().Diag(
attr.getLoc(),
9108 diag::err_attribute_wrong_number_arguments)
9114 StringRef HandleType;
9115 if (!state.getSema().checkStringLiteralArgumentAttr(
attr, 0, HandleType))
9117 type = state.getAttributedType(
9118 AcquireHandleAttr::Create(state.getSema().Context, HandleType,
attr),
9120 attr.setUsedAsTypeAttr();
9123 case ParsedAttr::AT_AnnotateType: {
9125 attr.setUsedAsTypeAttr();
9128 case ParsedAttr::AT_HLSLResourceClass:
9129 case ParsedAttr::AT_HLSLROV:
9130 case ParsedAttr::AT_HLSLRawBuffer:
9131 case ParsedAttr::AT_HLSLContainedType: {
9136 state.getSema().HLSL().handleResourceTypeAttr(
type,
attr))
9137 attr.setUsedAsTypeAttr();
9144 if (isa<AttributedType>(
type) &&
attr.hasMacroIdentifier() &&
9145 !
type.getQualifiers().hasObjCLifetime() &&
9146 !
type.getQualifiers().hasObjCGCAttr() &&
9147 attr.getKind() != ParsedAttr::AT_ObjCGC &&
9148 attr.getKind() != ParsedAttr::AT_ObjCOwnership) {
9150 type = state.getSema().Context.getMacroQualifiedType(
type, MacroII);
9151 state.setExpansionLocForMacroQualifiedType(
9152 cast<MacroQualifiedType>(
type.getTypePtr()),
9153 attr.getMacroExpansionLoc());
9160 if (
VarDecl *Var = dyn_cast<VarDecl>(DRE->getDecl())) {
9162 auto *Def = Var->getDefinition();
9168 Def = Var->getDefinition();
9175 if (Var->getPointOfInstantiation().isInvalid() && Def) {
9176 assert(Var->getTemplateSpecializationKind() ==
9178 "explicit instantiation with no point of instantiation");
9179 Var->setTemplateSpecializationKind(
9180 Var->getTemplateSpecializationKind(), PointOfInstantiation);
9200 if (
const auto CastE = dyn_cast<ExplicitCastExpr>(
E)) {
9201 QualType DestType = CastE->getTypeAsWritten();
9207 IAT->getElementType(),
9244 if (RequireCompleteTypeImpl(
Loc,
T, Kind, &Diagnoser))
9247 TD->setCompleteDefinitionRequired();
9265 return Ctx.IsEquivalent(
D, Suggested);
9276 if (isa<TagDecl>(
D) && cast<TagDecl>(
D)->isBeingDefined()) {
9280 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(
D)) {
9281 if (
auto *Pattern = RD->getTemplateInstantiationPattern())
9283 D = RD->getDefinition();
9284 }
else if (
auto *ED = dyn_cast<EnumDecl>(
D)) {
9285 if (
auto *Pattern = ED->getTemplateInstantiationPattern())
9287 if (OnlyNeedComplete && (ED->isFixed() ||
getLangOpts().MSVCCompat)) {
9293 *Suggested =
nullptr;
9294 for (
auto *Redecl : ED->redecls()) {
9297 if (Redecl->isThisDeclarationADefinition() ||
9298 (Redecl->isCanonicalDecl() && !*Suggested))
9299 *Suggested = Redecl;
9304 D = ED->getDefinition();
9305 }
else if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
9306 if (
auto *Pattern = FD->getTemplateInstantiationPattern())
9308 D = FD->getDefinition();
9309 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
9310 if (
auto *Pattern = VD->getTemplateInstantiationPattern())
9312 D = VD->getDefinition();
9315 assert(
D &&
"missing definition for pattern of instantiated definition");
9319 auto DefinitionIsAcceptable = [&] {
9339 if (DefinitionIsAcceptable())
9345 Source->CompleteRedeclChain(
D);
9346 return DefinitionIsAcceptable();
9362 bool OnlyNeedComplete) {
9379 bool OnlyNeedComplete) {
9387 if (!RD->
hasAttr<MSInheritanceAttr>()) {
9389 bool BestCase =
false;
9409 RD->
addAttr(MSInheritanceAttr::CreateImplicit(
9416 CompleteTypeKind Kind,
9417 TypeDiagnoser *Diagnoser) {
9426 if (
const auto *MPTy = dyn_cast<MemberPointerType>(
T.getCanonicalType())) {
9430 if (
getLangOpts().CompleteMemberPointers && !RD->isBeingDefined() &&
9450 if (Def && !isa<EnumDecl>(Def))
9461 if (Diagnoser && Suggested)
9464 return !TreatAsComplete;
9466 CodeSynthesisContext TempInst;
9468 TempInst.Template = Def;
9469 TempInst.Entity = Def;
9470 TempInst.PointOfInstantiation =
Loc;
9478 TagDecl *
Tag = dyn_cast_or_null<TagDecl>(Def);
9492 if (Tag &&
Tag->hasExternalLexicalStorage())
9493 Source->CompleteType(Tag);
9495 Source->CompleteType(IFace);
9499 return RequireCompleteTypeImpl(
Loc,
T, Kind, Diagnoser);
9506 if (
auto *RD = dyn_cast_or_null<CXXRecordDecl>(Tag)) {
9507 bool Instantiated =
false;
9508 bool Diagnosed =
false;
9509 if (RD->isDependentContext()) {
9513 }
else if (
auto *ClassTemplateSpec =
9514 dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
9515 if (ClassTemplateSpec->getSpecializationKind() ==
TSK_Undeclared) {
9519 Diagnoser, ClassTemplateSpec->hasStrictPackMatch());
9521 Instantiated =
true;
9525 if (!RD->isBeingDefined() && Pattern) {
9527 assert(MSI &&
"Missing member specialization information?");
9537 Instantiated =
true;
9545 if (Diagnoser && Diagnosed)
9551 return RequireCompleteTypeImpl(
Loc,
T, Kind, Diagnoser);
9561 Diagnoser->diagnose(*
this,
Loc,
T);
9565 if (Tag && !
Tag->isInvalidDecl() && !
Tag->getLocation().isInvalid())
9566 Diag(
Tag->getLocation(),
Tag->isBeingDefined()
9567 ? diag::note_type_being_defined
9568 : diag::note_forward_declaration)
9602 default: llvm_unreachable(
"Invalid tag kind for literal type diagnostic!");
9633 Diag(RD->getLocation(), diag::note_non_literal_lambda);
9641 if (RD->getNumVBases()) {
9642 Diag(RD->getLocation(), diag::note_non_literal_virtual_base)
9644 for (
const auto &I : RD->vbases())
9645 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
9646 << I.getSourceRange();
9647 }
else if (!RD->isAggregate() && !RD->hasConstexprNonCopyMoveConstructor() &&
9648 !RD->hasTrivialDefaultConstructor()) {
9649 Diag(RD->getLocation(), diag::note_non_literal_no_constexpr_ctors) << RD;
9650 }
else if (RD->hasNonLiteralTypeFieldsOrBases()) {
9651 for (
const auto &I : RD->bases()) {
9652 if (!I.getType()->isLiteralType(
Context)) {
9653 Diag(I.getBeginLoc(), diag::note_non_literal_base_class)
9654 << RD << I.getType() << I.getSourceRange();
9658 for (
const auto *I : RD->fields()) {
9659 if (!I->getType()->isLiteralType(
Context) ||
9660 I->getType().isVolatileQualified()) {
9661 Diag(I->getLocation(), diag::note_non_literal_field)
9662 << RD << I << I->getType()
9663 << I->getType().isVolatileQualified();
9668 : !RD->hasTrivialDestructor()) {
9673 assert(Dtor &&
"class has literal fields and bases but no dtor?");
9682 ? diag::note_non_literal_user_provided_dtor
9683 : diag::note_non_literal_nontrivial_dtor)
9719 auto *CountDecl = cast<DeclRefExpr>(
E)->getDecl();
9743 if (
auto *ImplCastExpr = dyn_cast<ImplicitCastExpr>(
E))
9744 IDExpr = ImplCastExpr->getSubExpr();
9746 if (
auto *PackExpr = dyn_cast<PackIndexingExpr>(
E)) {
9748 IDExpr = PackExpr->getPackIdExpression();
9750 IDExpr = PackExpr->getSelectedExpr();
9766 if (
const auto *SNTTPE = dyn_cast<SubstNonTypeTemplateParmExpr>(IDExpr))
9767 return SNTTPE->getParameterType(
Context);
9775 if (
const auto *DRE = dyn_cast<DeclRefExpr>(IDExpr)) {
9778 return isa<TemplateParamObjectDecl>(VD) ?
T.getUnqualifiedType() :
T;
9780 if (
const auto *ME = dyn_cast<MemberExpr>(IDExpr)) {
9781 if (
const auto *VD = ME->getMemberDecl())
9782 if (isa<FieldDecl>(VD) || isa<VarDecl>(VD))
9783 return VD->getType();
9784 }
else if (
const auto *IR = dyn_cast<ObjCIvarRefExpr>(IDExpr)) {
9785 return IR->getDecl()->getType();
9786 }
else if (
const auto *PR = dyn_cast<ObjCPropertyRefExpr>(IDExpr)) {
9787 if (PR->isExplicitProperty())
9788 return PR->getExplicitProperty()->getType();
9789 }
else if (
const auto *PE = dyn_cast<PredefinedExpr>(IDExpr)) {
9790 return PE->getType();
9801 if (
auto *DRE = dyn_cast<DeclRefExpr>(IDExpr->
IgnoreParens())) {
9802 if (
auto *Var = dyn_cast<VarDecl>(DRE->getDecl())) {
9835 Diag(
Loc, diag::err_expected_name_of_pack) << Pattern;
9841 : diag::ext_pack_indexing);
9848 bool FullySubstituted,
9859 IndexExpr = Res.
get();
9860 int64_t
V =
Value.getExtValue();
9861 if (FullySubstituted && (V < 0 || V >= int64_t(Expansions.size()))) {
9863 <<
V << Pattern << Expansions.size();
9866 Index =
static_cast<unsigned>(
V);
9881 if (Underlying.
isNull()) {
9887 assert(!Underlying.
isNull());
9896 Diag(
Loc, diag::err_only_enums_have_underlying_types);
9904 Diag(
Loc, diag::err_underlying_type_of_incomplete_enum) << BaseType;
9905 Diag(FwdDecl->
getLocation(), diag::note_forward_declaration) << FwdDecl;
9940 Split.Quals.removeCVRQualifiers();
9950 UKind == UnaryTransformType::AddLvalueReference,
9958 if (UKind == UnaryTransformType::RemoveAllExtents)
9962 return AT->getElementType();
9971 if (UKind == UTTKind::RemoveCVRef &&
9972 (
T.isConstQualified() ||
T.isVolatileQualified())) {
9984 if ((BaseType->
isReferenceType() && UKind != UTTKind::RemoveRestrict) ||
9991 if (UKind == UTTKind::RemoveConst || UKind == UTTKind::RemoveCV)
9993 if (UKind == UTTKind::RemoveVolatile || UKind == UTTKind::RemoveCV)
9995 if (UKind == UTTKind::RemoveRestrict)
10006 if (
auto *
BitInt = dyn_cast<BitIntType>(Underlying)) {
10007 unsigned int Bits =
BitInt->getNumBits();
10011 S.
Diag(
Loc, diag::err_make_signed_integral_only)
10012 << IsMakeSigned <<
true << BaseType << 1 << Underlying;
10016 S.
Diag(
Loc, diag::err_make_signed_integral_only)
10017 << IsMakeSigned <<
false << BaseType << 1
10024 std::array<CanQualType *, 6> AllSignedIntegers = {
10028 AllSignedIntegers.data(), AllSignedIntegers.size() - Int128Unsupported);
10029 std::array<CanQualType *, 6> AllUnsignedIntegers = {
10034 AllUnsignedIntegers.size() -
10035 Int128Unsupported);
10037 IsMakeSigned ? &AvailableSignedIntegers : &AvailableUnsignedIntegers;
10041 llvm::find_if(*Consider, [&S, BaseSize](
const CanQual<Type> *
T) {
10045 assert(
Result != Consider->end());
10046 return QualType((*Result)->getTypePtr(), 0);
10051 bool IsMakeSigned = UKind == UnaryTransformType::MakeSigned;
10056 Diag(
Loc, diag::err_make_signed_integral_only)
10057 << IsMakeSigned << BaseType->
isBitIntType() << BaseType << 0;
10061 bool IsNonIntIntegral =
10070 if (Underlying.
isNull())
10081 case UnaryTransformType::EnumUnderlyingType: {
10085 case UnaryTransformType::AddPointer: {
10089 case UnaryTransformType::RemovePointer: {
10093 case UnaryTransformType::Decay: {
10097 case UnaryTransformType::AddLvalueReference:
10098 case UnaryTransformType::AddRvalueReference: {
10102 case UnaryTransformType::RemoveAllExtents:
10103 case UnaryTransformType::RemoveExtent: {
10107 case UnaryTransformType::RemoveCVRef:
10108 case UnaryTransformType::RemoveReference: {
10112 case UnaryTransformType::RemoveConst:
10113 case UnaryTransformType::RemoveCV:
10114 case UnaryTransformType::RemoveRestrict:
10115 case UnaryTransformType::RemoveVolatile: {
10119 case UnaryTransformType::MakeSigned:
10120 case UnaryTransformType::MakeUnsigned: {
10138 int DisallowedKind = -1;
10140 DisallowedKind = 1;
10142 DisallowedKind = 2;
10144 DisallowedKind = 3;
10146 DisallowedKind = 4;
10147 else if (
T.hasQualifiers())
10148 DisallowedKind = 5;
10150 DisallowedKind = 6;
10153 DisallowedKind = 7;
10155 DisallowedKind = 8;
10158 DisallowedKind = 9;
10160 if (DisallowedKind != -1) {
10161 Diag(
Loc, diag::err_atomic_specifier_bad_type) << DisallowedKind <<
T;
Defines the clang::ASTContext interface.
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 bool isMultiSubjectAttrAllowedOnType(const ParsedAttr &Attr)
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 HandleTagDeclRequiredDefinition(const TagDecl *D)
This callback is invoked the first time each TagDecl is required to be complete.
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
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
QualType getParenType(QualType NamedType) const
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, SourceLocation AttrLoc) const
Return the unique reference to the matrix type of the specified element type and size.
QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr, QualType Wrapped) const
unsigned getIntWidth(QualType T) const
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
QualType getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes, bool OrNull, ArrayRef< TypeCoupledDeclRefInfo > DependentDecls) const
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getDependentVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc, VectorKind VecKind) const
Return the unique reference to the type for a dependently sized vector of the specified element type.
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 getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const
Return a dependent bit-precise integer type with the specified signedness and bit count.
QualType getReferenceQualifiedType(const Expr *e) const
getReferenceQualifiedType - Given an expr, will return the type for that expression,...
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given 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...
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
CanQualType UnsignedLongTy
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getCorrespondingSaturatedType(QualType Ty) const
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
QualType getAdjustedType(QualType Orig, QualType New) const
Return the uniqued reference to a type adjusted from the original type to a new type.
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.
const clang::PrintingPolicy & getPrintingPolicy() const
QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr, bool FullySubstituted=false, ArrayRef< QualType > Expansions={}, UnsignedOrNone Index=std::nullopt) const
QualType getVariableArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a variable array of the specified element type.
QualType getUnsignedWCharType() const
Return the type of "unsigned wchar_t".
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
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
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
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.
QualType getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
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.
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
QualType getDependentAddressSpaceType(QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttrLoc) const
QualType getTagType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TagDecl *TD, bool OwnsTag) const
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType, UnaryTransformType::UTTKind UKind) const
Unary type transforms.
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const
Recurses in pointer/array types until it finds an Objective-C retainable type and returns its ownersh...
DiagnosticsEngine & getDiagnostics() const
QualType getAdjustedParameterType(QualType T) const
Perform adjustment on the parameter type of a function.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
const TargetInfo & getTargetInfo() const
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
QualType getCorrespondingUnsignedType(QualType T) 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 ...
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
CanQualType getCanonicalTagType(const TagDecl *TD) const
QualType getTypeOfType(QualType QT, TypeOfKind Kind) const
getTypeOfType - Unlike many "get<Type>" functions, we don't unique TypeOfType nodes.
QualType getCorrespondingSignedType(QualType T) const
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a dependently-sized array of the specified element type...
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
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.
QualType getDecltypeType(Expr *e, QualType UnderlyingType) const
C++11 decltype.
QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a unique reference to the type for an incomplete array of the specified element type.
QualType getDependentSizedExtVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc) const
QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const
C23 feature and GCC extension.
QualType getSignedWCharType() const
Return the type of "signed wchar_t".
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns) const
Return the unique reference to the matrix type of the specified element type and size.
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.
Wrapper for source info for array parameter types.
Wrapper for source info for arrays.
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
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)
An attributed type is a type to which a type attribute has been applied.
QualType getModifiedType() const
bool isCallingConv() const
static std::optional< NullabilityKind > stripOuterNullability(QualType &T)
Strip off the top-level nullability annotation on the given type, if it's there.
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)
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
bool isDecltypeAuto() const
TemplateDecl * getTypeConstraintConcept() const
Type source information for an btf_tag attributed type.
TypeLoc getWrappedLoc() const
Comparison function object.
A fixed int type of a specified bitwidth.
unsigned getNumBits() const
Wrapper for source info for block pointers.
void setCaretLoc(SourceLocation Loc)
Wrapper for source info for builtin types.
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()
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
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 isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
SourceRange getRange() const
SourceLocation getBeginLoc() const
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.
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...
static constexpr bool isDimensionValid(size_t NumElements)
Returns true if NumElements is a valid matrix dimension.
Wrapper for source info for pointers decayed from arrays and functions.
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
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
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
static const TST TST_decimal64
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
static const TST TST_int128
SourceLocation getVolatileSpecLoc() const
static const TST TST_typeofType
static const TST TST_auto
static const TST TST_struct
Decl - This represents one declaration (or definition), e.g.
SourceLocation getEndLoc() const LLVM_READONLY
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
ASTContext & getASTContext() const LLVM_READONLY
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Kind
Lists the kind of concrete classes of Decl.
bool isInvalidDecl() const
SourceLocation getLocation() const
void setImplicit(bool I=true)
SourceLocation getBeginLoc() const LLVM_READONLY
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.
void AddInnermostTypeInfo(const DeclaratorChunk &TI)
Add a new innermost chunk to this declarator.
const ParsedAttributes & getAttributes() const
SourceLocation getIdentifierLoc() const
void setInvalidType(bool Val=true)
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
const ParsedAttributesView & getDeclarationAttributes() const
DeclaratorContext getContext() const
SourceLocation getBeginLoc() const LLVM_READONLY
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 setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...
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 copy(DependentTemplateSpecializationTypeLoc 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)
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getDefinition() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
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.
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.
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)
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.
Wrapper for source info for functions.
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 withNoCfCheck(bool noCfCheck) const
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
ExtInfo withProducesResult(bool producesResult) const
ExtInfo withNoReturn(bool noReturn) const
bool getProducesResult() const
ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const
ExtInfo withCmseNSCall(bool cmseNSCall) const
ExtInfo withRegParm(unsigned RegParm) 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.
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:
Wrapper for source info for member pointers.
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
Provides information a specialization of a member of a class template, which may be a member function...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
A C++ nested-name-specifier augmented with source location information.
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.
Wrapper for source info for ObjC interfaces.
void setNameLoc(SourceLocation Loc)
void setNameEndLoc(SourceLocation Loc)
Interfaces are the core concept in Objective-C for object oriented design.
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.
Represents a class type in Objective C.
static OpaquePtr make(QualType P)
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.
bool isExplicitObjectParameter() const
void setKNRPromoted(bool promoted)
void setExplicitObjectParameterLoc(SourceLocation Loc)
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.
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.
Wrapper for source info for pointers.
void setStarLoc(SourceLocation Loc)
PointerType - C99 6.7.5.1 - Pointer Declarators.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
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
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.
bool isReferenceable() const
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.
Wrapper of type source information for a type with non-trivial direct qualifiers.
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)
@ MaxAddressSpace
The maximum supported address space number.
void setUnaligned(bool flag)
std::string getAsString() const
void addObjCLifetime(ObjCLifetime type)
void setAmpAmpLoc(SourceLocation Loc)
Base for LValueReferenceType and RValueReferenceType.
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, bool DeferHint=false)
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 isInOpenMPTaskUntiedContext() const
Return true if currently in OpenMP task with untied clause context.
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
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....
QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace, SourceLocation AttrLoc)
BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an expression is uninstantiated.
QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement)
Completely replace the auto in TypeWithAuto by Replacement.
bool checkPointerAuthDiscriminatorArg(Expr *Arg, PointerAuthDiscArgKind Kind, unsigned &IntVal)
QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc)
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 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.
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
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={})
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 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 ...
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...
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)
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.
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.
bool isCompleteDefinitionRequired() const
Return true if this complete decl is required to be complete for some existing use.
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.
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
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.
bool isVLASupported() const
Whether target supports variable-length arrays.
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.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
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 isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
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
bool isSignableType(const ASTContext &Ctx) const
QualType getRVVEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an RVV builtin type.
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
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...
bool isConstantArrayType() const
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
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
bool isEnumeralType() const
NestedNameSpecifier getPrefix() const
If this type represents a qualified-id, this returns its nested name specifier.
bool isVariableArrayType() const
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.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
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.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this 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
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
QualType getCanonicalTypeInternal() const
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 isFunctionProtoType() const
bool isChar32Type() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
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 isObjectType() const
Determine whether this type is an object type.
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 isWideCharType() const
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.
Wrapper for source info for typedefs.
void setParensRange(SourceRange range)
void setTypeofLoc(SourceLocation Loc)
Wrapper of type source information for a type with no direct qualifiers.
TypeLocClass getTypeLocClass() const
Wrapper for source info for unresolved typename using decls.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Wrapper for source info for types used via transparent aliases.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
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< Attr > attr
Matches attributes.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Decl, RecordDecl > recordDecl
Matches class, struct, and union declarations.
The JSON file list parser is used to communicate input to InstallAPI.
TypeSpecifierType
Specifies the kind of type.
void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
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 (&&).
@ Success
Annotation was successful.
llvm::PointerUnion< Expr *, IdentifierLoc * > ArgsUnion
A union of the various pointer types that can be passed to an ParsedAttr as an argument.
@ 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.
@ AANT_ArgumentIntegerConstant
@ Result
The result type of a method or function.
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.
bool supportsVariadicCall(CallingConv CC)
Checks whether the given calling convention supports variadic calls.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
static bool isBlockPointer(Expr *Arg)
ActionResult< Expr * > ExprResult
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.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ FirstTargetAddressSpace
const FunctionProtoType * T
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.
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ 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
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ None
The alignment was not explicit in code.
@ ArrayBound
Array bound in array declarator or new-expression.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ 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::@211 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.
@ 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.
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.