44#include "llvm/ADT/ArrayRef.h"
45#include "llvm/ADT/STLForwardCompat.h"
46#include "llvm/ADT/StringExtras.h"
47#include "llvm/IR/DerivedTypes.h"
48#include "llvm/Support/ErrorHandling.h"
82 bool useExpansionLoc =
true;
83 switch (
attr.getKind()) {
84 case ParsedAttr::AT_ObjCGC:
87 case ParsedAttr::AT_ObjCOwnership:
93 useExpansionLoc =
false;
98 StringRef name =
attr.getAttrName()->getName();
102 attr.isArgIdent(0) ?
attr.getArgAsIdent(0)->getIdentifierInfo() :
nullptr;
103 if (useExpansionLoc && loc.
isMacroID() && II) {
104 if (II->
isStr(
"strong")) {
106 }
else if (II->
isStr(
"weak")) {
111 S.
Diag(loc,
attr.isRegularKeywordAttribute()
112 ? diag::err_type_attribute_wrong_type
113 : diag::warn_type_attribute_wrong_type)
114 << name << WhichType <<
type;
119#define OBJC_POINTER_TYPE_ATTRS_CASELIST \
120 case ParsedAttr::AT_ObjCGC: \
121 case ParsedAttr::AT_ObjCOwnership
124#define CALLING_CONV_ATTRS_CASELIST \
125 case ParsedAttr::AT_CDecl: \
126 case ParsedAttr::AT_FastCall: \
127 case ParsedAttr::AT_StdCall: \
128 case ParsedAttr::AT_ThisCall: \
129 case ParsedAttr::AT_RegCall: \
130 case ParsedAttr::AT_Pascal: \
131 case ParsedAttr::AT_SwiftCall: \
132 case ParsedAttr::AT_SwiftAsyncCall: \
133 case ParsedAttr::AT_VectorCall: \
134 case ParsedAttr::AT_AArch64VectorPcs: \
135 case ParsedAttr::AT_AArch64SVEPcs: \
136 case ParsedAttr::AT_MSABI: \
137 case ParsedAttr::AT_SysVABI: \
138 case ParsedAttr::AT_Pcs: \
139 case ParsedAttr::AT_IntelOclBicc: \
140 case ParsedAttr::AT_PreserveMost: \
141 case ParsedAttr::AT_PreserveAll: \
142 case ParsedAttr::AT_M68kRTD: \
143 case ParsedAttr::AT_PreserveNone: \
144 case ParsedAttr::AT_RISCVVectorCC: \
145 case ParsedAttr::AT_RISCVVLSCC
148#define FUNCTION_TYPE_ATTRS_CASELIST \
149 case ParsedAttr::AT_NSReturnsRetained: \
150 case ParsedAttr::AT_NoReturn: \
151 case ParsedAttr::AT_NonBlocking: \
152 case ParsedAttr::AT_NonAllocating: \
153 case ParsedAttr::AT_Blocking: \
154 case ParsedAttr::AT_Allocating: \
155 case ParsedAttr::AT_Regparm: \
156 case ParsedAttr::AT_CFIUncheckedCallee: \
157 case ParsedAttr::AT_CFISalt: \
158 case ParsedAttr::AT_CmseNSCall: \
159 case ParsedAttr::AT_ArmStreaming: \
160 case ParsedAttr::AT_ArmStreamingCompatible: \
161 case ParsedAttr::AT_ArmPreserves: \
162 case ParsedAttr::AT_ArmIn: \
163 case ParsedAttr::AT_ArmOut: \
164 case ParsedAttr::AT_ArmInOut: \
165 case ParsedAttr::AT_ArmAgnostic: \
166 case ParsedAttr::AT_AnyX86NoCallerSavedRegisters: \
167 case ParsedAttr::AT_AnyX86NoCfCheck: \
168 CALLING_CONV_ATTRS_CASELIST
171#define MS_TYPE_ATTRS_CASELIST \
172 case ParsedAttr::AT_Ptr32: \
173 case ParsedAttr::AT_Ptr64: \
174 case ParsedAttr::AT_SPtr: \
175 case ParsedAttr::AT_UPtr
178#define NULLABILITY_TYPE_ATTRS_CASELIST \
179 case ParsedAttr::AT_TypeNonNull: \
180 case ParsedAttr::AT_TypeNullable: \
181 case ParsedAttr::AT_TypeNullableResult: \
182 case ParsedAttr::AT_TypeNullUnspecified
187 class TypeProcessingState {
211 using TypeAttrPair = std::pair<const AttributedType*, const Attr*>;
213 bool AttrsForTypesSorted =
true;
217 llvm::DenseMap<const MacroQualifiedType *, SourceLocation> LocsForMacros;
225 bool ParsedHLSLParamMod;
229 :
sema(
sema), declarator(declarator),
231 ParsedHLSLParamMod(
false) {}
233 Sema &getSema()
const {
241 bool isProcessingDeclSpec()
const {
245 unsigned getCurrentChunkIndex()
const {
249 void setCurrentChunkIndex(
unsigned idx) {
255 if (isProcessingDeclSpec())
256 return getMutableDeclSpec().getAttributes();
261 void saveDeclSpecAttrs() {
263 if (!savedAttrs.empty())
266 DeclSpec &spec = getMutableDeclSpec();
267 llvm::append_range(savedAttrs,
274 ignoredTypeAttrs.push_back(&
attr);
280 for (
auto *
Attr : ignoredTypeAttrs)
289 sema.Context.getAttributedType(A, ModifiedType, EquivType);
291 AttrsForTypesSorted =
false;
296 QualType getBTFTagAttributedType(
const BTFTypeTagAttr *BTFAttr,
298 return sema.Context.getBTFTagAttributedType(BTFAttr, WrappedType);
304 getOverflowBehaviorType(OverflowBehaviorType::OverflowBehaviorKind Kind,
306 return sema.Context.getOverflowBehaviorType(Kind, UnderlyingType);
313 QualType T =
sema.ReplaceAutoType(TypeWithAuto, Replacement);
314 if (
auto *AttrTy = TypeWithAuto->
getAs<AttributedType>()) {
317 for (TypeAttrPair &A : AttrsForTypes) {
318 if (A.first == AttrTy)
321 AttrsForTypesSorted =
false;
327 const Attr *takeAttrForAttributedType(
const AttributedType *AT) {
328 if (!AttrsForTypesSorted) {
329 llvm::stable_sort(AttrsForTypes, llvm::less_first());
330 AttrsForTypesSorted =
true;
335 for (
auto It = llvm::partition_point(
337 [=](
const TypeAttrPair &A) {
return A.first < AT; });
338 It != AttrsForTypes.end() && It->first == AT; ++It) {
341 It->second =
nullptr;
346 llvm_unreachable(
"no Attr* for AttributedType*");
351 auto FoundLoc = LocsForMacros.find(MQT);
352 assert(FoundLoc != LocsForMacros.end() &&
353 "Unable to find macro expansion location for MacroQualifedType");
354 return FoundLoc->second;
359 LocsForMacros[MQT] = Loc;
362 void setParsedNoDeref(
bool parsed) { parsedNoDeref = parsed; }
364 bool didParseNoDeref()
const {
return parsedNoDeref; }
366 void setParsedHLSLParamMod(
bool Parsed) { ParsedHLSLParamMod = Parsed; }
368 bool didParseHLSLParamMod()
const {
return ParsedHLSLParamMod; }
370 ~TypeProcessingState() {
371 if (savedAttrs.empty())
374 getMutableDeclSpec().getAttributes().clearListOnly();
376 getMutableDeclSpec().getAttributes().addAtEnd(AL);
380 DeclSpec &getMutableDeclSpec()
const {
422 if (
attr.getKind() == ParsedAttr::AT_ObjCGC)
424 assert(
attr.getKind() == ParsedAttr::AT_ObjCOwnership);
439 bool onlyBlockPointers) {
445 for (; i != 0; --i) {
447 switch (fnChunk.
Kind) {
463 for (--i; i != 0; --i) {
465 switch (ptrChunk.
Kind) {
475 if (onlyBlockPointers)
484 llvm_unreachable(
"bad declarator chunk kind");
490 llvm_unreachable(
"bad declarator chunk kind");
507 Declarator &declarator = state.getDeclarator();
510 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
512 switch (chunk.
Kind) {
518 if (state.isProcessingDeclSpec() &&
519 attr.getKind() == ParsedAttr::AT_ObjCOwnership)
522 if (!destChunk) destChunk = &chunk;
535 if (state.isProcessingDeclSpec() &&
536 attr.getKind() == ParsedAttr::AT_ObjCOwnership) {
563 Declarator &declarator = state.getDeclarator();
567 unsigned innermost = -1U;
568 bool considerDeclSpec =
true;
571 switch (chunk.
Kind) {
585 considerDeclSpec =
false;
593 if (considerDeclSpec) {
598 state.saveDeclSpecAttrs();
607 if (innermost != -1U) {
615 state.addIgnoredTypeAttr(
attr);
624 Declarator &declarator = state.getDeclarator();
628 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
630 switch (chunk.
Kind) {
657 Declarator &declarator = state.getDeclarator();
677 state.saveDeclSpecAttrs();
681 state,
attr, state.getCurrentAttributes(), declSpecType, CFT))
686 state.addIgnoredTypeAttr(
attr);
697 Declarator &declarator = state.getDeclarator();
707 state.addIgnoredTypeAttr(
attr);
732 if (
attr.isStandardAttributeSyntax() ||
attr.isRegularKeywordAttribute())
735 switch (
attr.getKind()) {
752 case ParsedAttr::AT_ObjCKindOf:
765 Declarator &declarator = state.getDeclarator();
811 {}, loc, loc, declarator));
826 typedef std::pair<DeclSpec::TQ, SourceLocation> QualLoc;
831 if (!(RemoveTQs & Qual.first))
835 if (TypeQuals & Qual.first)
836 S.
Diag(Qual.second, DiagID)
841 TypeQuals &= ~Qual.first;
855 if (AL.isInvalid() || !AL.isTypeAttr())
858 diag::warn_block_literal_attributes_on_omitted_return_type)
860 ToBeRemoved.push_back(&AL);
870 diag::warn_block_literal_qualifiers_on_omitted_return_type);
876static OpenCLAccessAttr::Spelling
879 if (AL.getKind() == ParsedAttr::AT_OpenCLAccess)
880 return static_cast<OpenCLAccessAttr::Spelling
>(AL.getSemanticSpelling());
881 return OpenCLAccessAttr::Keyword_read_only;
884static UnaryTransformType::UTTKind
887#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
889 return UnaryTransformType::Enum;
890#include "clang/Basic/Traits.inc"
892 llvm_unreachable(
"attempted to parse a non-unary transform builtin");
906 Sema &S = state.getSema();
907 Declarator &declarator = state.getDeclarator();
924 Result = Context.SignedCharTy;
927 "Unknown TSS value");
928 Result = Context.UnsignedCharTy;
937 Context.getPrintingPolicy());
938 Result = Context.getSignedWCharType();
941 "Unknown TSS value");
944 Context.getPrintingPolicy());
945 Result = Context.getUnsignedWCharType();
950 "Unknown TSS value");
955 "Unknown TSS value");
956 Result = Context.Char16Ty;
960 "Unknown TSS value");
961 Result = Context.Char32Ty;
971 Result = Context.getAutoDeductType();
975 Context.DependentTy)) {
976 Result = Context.DependentTy;
992 S.
Diag(DeclLoc, diag::warn_missing_type_specifier)
1003 S.
Diag(DeclLoc, diag::err_missing_type_specifier)
1014 S.
Diag(DeclLoc, diag::err_missing_actual_pipe_type)
1020 "implicit int is disabled?");
1021 S.
Diag(DeclLoc, diag::ext_missing_type_specifier)
1035 Result = Context.ShortTy;
1041 Result = Context.LongLongTy;
1051 diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);
1060 Result = Context.UnsignedIntTy;
1063 Result = Context.UnsignedShortTy;
1066 Result = Context.UnsignedLongTy;
1069 Result = Context.UnsignedLongLongTy;
1079 diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);
1103 Result = Context.ShortAccumTy;
1106 Result = Context.AccumTy;
1109 Result = Context.LongAccumTy;
1112 llvm_unreachable(
"Unable to specify long long as _Accum width");
1119 Result = Context.getCorrespondingSaturatedType(
Result);
1126 Result = Context.ShortFractTy;
1129 Result = Context.FractTy;
1132 Result = Context.LongFractTy;
1135 llvm_unreachable(
"Unable to specify long long as _Fract width");
1142 Result = Context.getCorrespondingSaturatedType(
Result);
1152 Result = Context.UnsignedInt128Ty;
1154 Result = Context.Int128Ty;
1164 Result = Context.Float16Ty;
1172 Result = Context.BFloat16Ty;
1177 Result = Context.LongDoubleTy;
1179 Result = Context.DoubleTy;
1184 << (S.
getLangOpts().getOpenCLCompatibleVersion() >= 300
1185 ?
"cl_khr_fp64 and __opencl_c_fp64"
1196 Result = Context.Float128Ty;
1203 Result = Context.Ibm128Ty;
1234 "No qualifiers on tag names!");
1247 "Can't handle qualifiers on typedef names yet!");
1260 assert(!
Result.isNull() &&
"Didn't get a type for typeof?");
1261 if (!
Result->isDependentType())
1262 if (
const auto *TT =
Result->getAs<TagType>())
1265 Result = Context.getTypeOfType(
1273 assert(E &&
"Didn't get an expression for typeof?");
1287 assert(E &&
"Didn't get an expression for decltype?");
1298 assert(E &&
"Didn't get an expression for pack indexing");
1309#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
1310#include "clang/Basic/Traits.inc"
1312 assert(!
Result.isNull() &&
"Didn't get a type for the transformation?");
1332 TypeConstraintConcept =
1338 TemplateId->NumArgs);
1340 for (
const auto &ArgLoc : TemplateArgsInfo.
arguments())
1341 TemplateArgs.push_back(ArgLoc.getArgument());
1347 TypeConstraintConcept, TemplateArgs);
1357 Result = Context.UnknownAnyTy;
1362 assert(!
Result.isNull() &&
"Didn't get a type for _Atomic?");
1370#define GENERIC_IMAGE_TYPE(ImgType, Id) \
1371 case DeclSpec::TST_##ImgType##_t: \
1372 switch (getImageAccess(DS.getAttributes())) { \
1373 case OpenCLAccessAttr::Keyword_write_only: \
1374 Result = Context.Id##WOTy; \
1376 case OpenCLAccessAttr::Keyword_read_write: \
1377 Result = Context.Id##RWTy; \
1379 case OpenCLAccessAttr::Keyword_read_only: \
1380 Result = Context.Id##ROTy; \
1382 case OpenCLAccessAttr::SpellingNotCalculated: \
1383 llvm_unreachable("Spelling not yet calculated"); \
1386#include "clang/Basic/OpenCLImageTypes.def"
1388#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1389 case DeclSpec::TST_##Name: \
1390 Result = Context.SingletonId; \
1392#include "clang/Basic/HLSLIntangibleTypes.def"
1403 if (
Result->containsErrors())
1408 bool IsOpenCLC30Compatible =
1418 (IsOpenCLC30Compatible &&
1421 << 0 <<
Result <<
"__opencl_c_images";
1423 }
else if (
Result->isOCLImage3dWOType() &&
1428 << (IsOpenCLC30Compatible
1429 ?
"cl_khr_3d_image_writes and __opencl_c_3d_image_writes"
1430 :
"cl_khr_3d_image_writes");
1442 Context.getPrintingPolicy());
1450 unsigned typeSize =
static_cast<unsigned>(Context.getTypeSize(
Result));
1451 assert(typeSize > 0 &&
"type size for vector must be greater than 0 bits");
1457 Result = Context.getVectorType(
Result, 128/typeSize, VecKind);
1482 if (AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
1493 if (AL.isStandardAttributeSyntax() && AL.isClangScope() &&
1494 !(AL.getKind() == ParsedAttr::AT_MatrixType &&
1496 S.
Diag(AL.getLoc(), diag::warn_type_attribute_deprecated_on_decl)
1524 if (
Result->isFunctionType()) {
1525 unsigned DiagId = diag::warn_typecheck_function_qualifiers_ignored;
1527 DiagId = diag::ext_typecheck_function_qualifiers_unspecified;
1543 if (TypeQuals &&
Result->isReferenceType()) {
1545 S, DS, TypeQuals,
Result,
1547 diag::warn_typecheck_reference_qualifiers);
1554 && TypeQuals &
Result.getCVRQualifiers()) {
1581 if (!
Result->isIntegerType()) {
1583 StringRef SpecifierName =
1585 S.
Diag(Loc, diag::err_overflow_behavior_non_integer_type)
1586 << SpecifierName <<
Result.getAsString() << 1;
1588 OverflowBehaviorType::OverflowBehaviorKind Kind =
1590 ? OverflowBehaviorType::OverflowBehaviorKind::Wrap
1591 : OverflowBehaviorType::OverflowBehaviorKind::Trap;
1599 assert(!
Result.isNull() &&
"This function should not return a null type");
1616 if (
T->isReferenceType()) {
1624 unsigned DiagID = 0;
1638 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
1643 DiagID = diag::err_typecheck_invalid_restrict_not_pointer;
1649 Diag(Loc, DiagID) << EltTy;
1652 if (
T->isArrayType())
1653 DiagCompat(Loc, diag_compat::restrict_on_array_of_pointers);
1657 return Context.getQualifiedType(
T, Qs);
1661 unsigned CVRAU,
const DeclSpec *DS) {
1666 if (
T->isReferenceType())
1695 Split.Quals.addCVRQualifiers(CVR);
1713 if (!
type->isObjCLifetimeType() ||
1723 if (
type.isConstQualified()) {
1729 }
else if (
type->isObjCARCImplicitlyUnretainedType()) {
1747 diag::err_arc_indirect_no_ownership,
type, isReference));
1749 S.
Diag(loc, diag::err_arc_indirect_no_ownership) <<
type << isReference;
1753 assert(implicitLifetime &&
"didn't infer any lifetime!");
1794enum QualifiedFunctionKind { QFK_BlockPointer, QFK_Pointer, QFK_Reference };
1800 QualifiedFunctionKind QFK) {
1807 S.
Diag(Loc, diag::err_compound_qualified_function_type)
1808 << QFK << isa<FunctionType>(
T.IgnoreParens()) <<
T
1819 Diag(Loc, diag::err_qualified_function_typeid)
1836 if (
T->isReferenceType()) {
1838 Diag(Loc, diag::err_illegal_decl_pointer_to_reference)
1846 Diag(Loc, diag::err_opencl_function_pointer) << 0;
1851 Diag(Loc, diag::err_hlsl_pointers_unsupported) << 0;
1858 if (
T->isObjCObjectType())
1859 return Context.getObjCObjectPointerType(
T);
1871 if (
T.isWebAssemblyReferenceType()) {
1872 Diag(Loc, diag::err_wasm_reference_pr) << 0;
1877 if (
T->getUnqualifiedDesugaredType()->isWebAssemblyTableType()) {
1878 Diag(Loc, diag::err_wasm_table_pr) << 0;
1891 "Unresolved overloaded function type");
1918 if (
T->isVoidType()) {
1919 Diag(Loc, diag::err_reference_to_void);
1924 Diag(Loc, diag::err_hlsl_pointers_unsupported) << 1;
1934 Diag(Loc, diag::err_opencl_function_pointer) << 1;
1947 T.isWebAssemblyReferenceType()) {
1948 Diag(Loc, diag::err_wasm_reference_pr) << 1;
1951 if (
T->isWebAssemblyTableType()) {
1952 Diag(Loc, diag::err_wasm_table_pr) << 1;
1958 return Context.getLValueReferenceType(
T, SpelledAsLValue);
1959 return Context.getRValueReferenceType(
T);
1967 return Context.getWritePipeType(
T);
1973 return Context.getDependentBitIntType(IsUnsigned, BitWidth);
1975 llvm::APSInt Bits(32);
1982 size_t NumBits = Bits.getZExtValue();
1983 if (!IsUnsigned && NumBits < 2) {
1984 Diag(Loc, diag::err_bit_int_bad_size) << 0;
1988 if (IsUnsigned && NumBits < 1) {
1989 Diag(Loc, diag::err_bit_int_bad_size) << 1;
1995 Diag(Loc, diag::err_bit_int_max_size)
2000 return Context.getBitIntType(IsUnsigned, NumBits);
2009 llvm::APSInt &SizeVal,
unsigned VLADiag,
2034 VLADiagnoser(
unsigned VLADiag,
bool VLAIsError)
2035 : VLADiag(VLADiag), VLAIsError(VLAIsError) {}
2039 return S.
Diag(Loc, diag::err_array_size_non_int) <<
T;
2044 IsVLA = !VLAIsError;
2045 return S.
Diag(Loc, VLADiag);
2050 return S.
Diag(Loc, diag::ext_vla_folded_to_constant);
2052 } Diagnoser(VLADiag, VLAIsError);
2056 if (Diagnoser.IsVLA)
2062 EltTy =
Context.getBaseElementType(EltTy);
2070 if (Size.isMultipleOf(Alignment))
2073 Diag(Loc, diag::err_array_element_alignment)
2074 << EltTy << Size.getQuantity() << Alignment.
getQuantity();
2079 Expr *ArraySize,
unsigned Quals,
2095 if (
T->isReferenceType()) {
2096 Diag(Loc, diag::err_illegal_decl_array_of_references)
2101 if (
T->isVoidType() ||
T->isIncompleteArrayType()) {
2102 Diag(Loc, diag::err_array_incomplete_or_sizeless_type) << 0 <<
T;
2107 diag::err_array_of_abstract_type))
2112 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
2114 if (!MPTy->getQualifier().isDependent())
2120 if (!
T.isWebAssemblyReferenceType() &&
2122 diag::err_array_incomplete_or_sizeless_type))
2127 if (
Context.getTargetInfo().getTriple().isWasm() &&
T->isArrayType()) {
2128 const auto *ATy = dyn_cast<ArrayType>(
T);
2129 if (ATy && ATy->getElementType().isWebAssemblyReferenceType()) {
2130 Diag(Loc, diag::err_wasm_reftype_multidimensional_array);
2135 if (
T->isSizelessType() && !
T.isWebAssemblyReferenceType()) {
2136 Diag(Loc, diag::err_array_incomplete_or_sizeless_type) << 1 <<
T;
2140 if (
T->isFunctionType()) {
2141 Diag(Loc, diag::err_illegal_decl_array_of_functions)
2146 if (
const auto *RD =
T->getAsRecordDecl()) {
2149 if (RD->hasFlexibleArrayMember())
2150 Diag(Loc, diag::ext_flexible_array_in_array) <<
T;
2151 }
else if (
T->isObjCObjectType()) {
2152 Diag(Loc, diag::err_objc_array_of_interfaces) <<
T;
2163 ArraySize =
Result.get();
2167 if (ArraySize && !ArraySize->
isPRValue()) {
2172 ArraySize =
Result.get();
2195 if (
const auto *CondExpr = dyn_cast_if_present<ConditionalOperator>(
2197 std::optional<llvm::APSInt> LHS =
2198 CondExpr->getLHS()->getIntegerConstantExpr(
Context);
2199 std::optional<llvm::APSInt> RHS =
2200 CondExpr->getRHS()->getIntegerConstantExpr(
Context);
2201 return LHS && RHS && LHS->isNegative() != RHS->isNegative();
2211 VLADiag = diag::err_opencl_vla;
2214 VLADiag = diag::warn_vla_used;
2217 VLADiag = diag::err_vla_in_sfinae;
2220 VLADiag = diag::err_openmp_vla_in_task_untied;
2225 ? diag::ext_vla_cxx_in_gnu_mode_static_assert
2226 : diag::ext_vla_cxx_static_assert;
2228 VLADiag =
getLangOpts().GNUMode ? diag::ext_vla_cxx_in_gnu_mode
2229 : diag::ext_vla_cxx;
2232 VLADiag = diag::ext_vla;
2236 llvm::APSInt ConstVal(
Context.getTypeSize(
Context.getSizeType()));
2243 T =
Context.getVariableArrayType(
T,
nullptr, ASM, Quals);
2245 T =
Context.getIncompleteArrayType(
T, ASM, Quals);
2248 T =
Context.getDependentSizedArrayType(
T, ArraySize, ASM, Quals);
2255 if (!R.isUsable()) {
2259 T =
Context.getVariableArrayType(
T, ArraySize, ASM, Quals);
2260 }
else if (!
T->isDependentType() && !
T->isIncompleteType() &&
2261 !
T->isConstantSizeType()) {
2268 T =
Context.getVariableArrayType(
T, ArraySize, ASM, Quals);
2273 if (ConstVal.isSigned() && ConstVal.isNegative()) {
2280 diag::err_typecheck_negative_array_size)
2284 if (ConstVal == 0 && !
T.isWebAssemblyReferenceType()) {
2295 : diag::ext_typecheck_zero_array_size)
2302 unsigned ActiveSizeBits =
2303 (!
T->isDependentType() && !
T->isVariablyModifiedType() &&
2304 !
T->isIncompleteType() && !
T->isUndeducedType())
2306 : ConstVal.getActiveBits();
2309 <<
toString(ConstVal, 10, ConstVal.isSigned(),
2316 T =
Context.getConstantArrayType(
T, ConstVal, ArraySize, ASM, Quals);
2320 if (
T->isVariableArrayType()) {
2321 if (!
Context.getTargetInfo().isVLASupported()) {
2325 IsCUDADevice ? diag::err_cuda_vla : diag::err_vla_unsupported)
2326 << (IsCUDADevice ? llvm::to_underlying(
CUDA().CurrentTarget()) : 0);
2330 FSI->setHasVLA(Loc);
2338 : diag::ext_c99_array_usage)
2349 Diag(Loc, diag::err_opencl_invalid_type_array) << ArrType;
2359 bool ForMatrixType =
false) {
2362 if (!llvm::isPowerOf2_32(NumBits))
2363 return S.
Diag(AttrLoc, diag::err_attribute_invalid_bitint_vector_type)
2377 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << CurType;
2386 return Context.getDependentVectorType(CurType, SizeExpr, AttrLoc,
2389 std::optional<llvm::APSInt> VecSize =
2392 Diag(AttrLoc, diag::err_attribute_argument_type)
2398 if (VecSize->isNegative()) {
2399 Diag(SizeExpr->
getExprLoc(), diag::err_attribute_vec_negative_size);
2404 return Context.getDependentVectorType(CurType, SizeExpr, AttrLoc,
2408 if (!VecSize->isIntN(61)) {
2410 Diag(AttrLoc, diag::err_attribute_size_too_large)
2414 uint64_t VectorSizeBits = VecSize->getZExtValue() * 8;
2415 unsigned TypeSize =
static_cast<unsigned>(
Context.getTypeSize(CurType));
2417 if (VectorSizeBits == 0) {
2418 Diag(AttrLoc, diag::err_attribute_zero_size)
2423 if (!TypeSize || VectorSizeBits % TypeSize) {
2424 Diag(AttrLoc, diag::err_attribute_invalid_size)
2429 if (VectorSizeBits / TypeSize > std::numeric_limits<uint32_t>::max()) {
2430 Diag(AttrLoc, diag::err_attribute_size_too_large)
2435 return Context.getVectorType(CurType, VectorSizeBits / TypeSize,
2451 if ((!
T->isDependentType() && !
T->isIntegerType() &&
2452 !
T->isRealFloatingType()) ||
2453 (IsNoBoolVecLang &&
T->isBooleanType())) {
2454 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) <<
T;
2463 std::optional<llvm::APSInt> VecSize =
2466 Diag(AttrLoc, diag::err_attribute_argument_type)
2472 if (VecSize->isNegative()) {
2473 Diag(SizeExpr->
getExprLoc(), diag::err_attribute_vec_negative_size);
2477 if (!VecSize->isIntN(32)) {
2478 Diag(AttrLoc, diag::err_attribute_size_too_large)
2484 unsigned VectorSize =
static_cast<unsigned>(VecSize->getZExtValue());
2486 if (VectorSize == 0) {
2487 Diag(AttrLoc, diag::err_attribute_zero_size)
2492 return Context.getExtVectorType(
T, VectorSize);
2495 return Context.getDependentSizedExtVectorType(
T, SizeExpr, AttrLoc);
2500 assert(
Context.getLangOpts().MatrixTypes &&
2501 "Should never build a matrix type when it is disabled");
2506 Diag(AttrLoc, diag::err_attribute_invalid_matrix_type) << ElementTy;
2517 return Context.getDependentSizedMatrixType(ElementTy, NumRows, NumCols,
2520 std::optional<llvm::APSInt> ValueRows =
2522 std::optional<llvm::APSInt> ValueColumns =
2529 if (!ValueRows && !ValueColumns) {
2530 Diag(AttrLoc, diag::err_attribute_argument_type)
2538 Diag(AttrLoc, diag::err_attribute_argument_type)
2544 if (!ValueColumns) {
2545 Diag(AttrLoc, diag::err_attribute_argument_type)
2551 unsigned MatrixRows =
static_cast<unsigned>(ValueRows->getZExtValue());
2552 unsigned MatrixColumns =
static_cast<unsigned>(ValueColumns->getZExtValue());
2553 if (MatrixRows == 0 && MatrixColumns == 0) {
2554 Diag(AttrLoc, diag::err_attribute_zero_size)
2555 <<
"matrix" << RowRange << ColRange;
2558 if (MatrixRows == 0) {
2559 Diag(AttrLoc, diag::err_attribute_zero_size) <<
"matrix" << RowRange;
2562 if (MatrixColumns == 0) {
2563 Diag(AttrLoc, diag::err_attribute_zero_size) <<
"matrix" << ColRange;
2566 if (MatrixRows >
Context.getLangOpts().MaxMatrixDimension &&
2567 MatrixColumns >
Context.getLangOpts().MaxMatrixDimension) {
2568 Diag(AttrLoc, diag::err_attribute_size_too_large)
2569 << RowRange << ColRange <<
"matrix row and column";
2572 if (MatrixRows >
Context.getLangOpts().MaxMatrixDimension) {
2573 Diag(AttrLoc, diag::err_attribute_size_too_large)
2574 << RowRange <<
"matrix row";
2577 if (MatrixColumns >
Context.getLangOpts().MaxMatrixDimension) {
2578 Diag(AttrLoc, diag::err_attribute_size_too_large)
2579 << ColRange <<
"matrix column";
2582 return Context.getConstantMatrixType(ElementTy, MatrixRows, MatrixColumns);
2586 if ((
T->isArrayType() && !
getLangOpts().allowArrayReturnTypes()) ||
2587 T->isFunctionType()) {
2588 Diag(Loc, diag::err_func_returning_array_function)
2589 <<
T->isFunctionType() <<
T;
2594 if (
T->isHalfType() && !
getLangOpts().NativeHalfArgsAndReturns &&
2595 !
Context.getTargetInfo().allowHalfArgsAndReturns()) {
2596 Diag(Loc, diag::err_parameters_retval_cannot_have_fp16_type) << 1 <<
2603 if (
T->isObjCObjectType()) {
2604 Diag(Loc, diag::err_object_cannot_be_passed_returned_by_value)
2610 if (
T.getPointerAuth()) {
2611 Diag(Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 0;
2615 if (
T.hasNonTrivialToPrimitiveDestructCUnion() ||
2616 T.hasNonTrivialToPrimitiveCopyCUnion())
2623 Diag(Loc, diag::warn_deprecated_volatile_return) <<
T;
2638 bool emittedError =
false;
2640 enum class RequiredCC { OnlySwift, SwiftOrSwiftAsync };
2641 auto checkCompatible = [&](
unsigned paramIndex, RequiredCC required) {
2643 (required == RequiredCC::OnlySwift)
2646 if (isCompatible || emittedError)
2648 S.
Diag(getParamLoc(paramIndex), diag::err_swift_param_attr_not_swiftcall)
2650 << (required == RequiredCC::OnlySwift);
2651 emittedError =
true;
2653 for (
size_t paramIndex = 0, numParams = paramTypes.size();
2654 paramIndex != numParams; ++paramIndex) {
2665 checkCompatible(paramIndex, RequiredCC::SwiftOrSwiftAsync);
2666 if (paramIndex != 0 &&
2669 S.
Diag(getParamLoc(paramIndex),
2670 diag::err_swift_indirect_result_not_first);
2675 checkCompatible(paramIndex, RequiredCC::SwiftOrSwiftAsync);
2684 checkCompatible(paramIndex, RequiredCC::OnlySwift);
2685 if (paramIndex == 0 ||
2688 S.
Diag(getParamLoc(paramIndex),
2689 diag::err_swift_error_result_not_after_swift_context);
2693 llvm_unreachable(
"bad ABI kind");
2705 for (
unsigned Idx = 0, Cnt = ParamTypes.size(); Idx < Cnt; ++Idx) {
2707 QualType ParamType =
Context.getAdjustedParameterType(ParamTypes[Idx]);
2709 Diag(Loc, diag::err_param_with_void_type);
2712 !
Context.getTargetInfo().allowHalfArgsAndReturns()) {
2714 Diag(Loc, diag::err_parameters_retval_cannot_have_fp16_type) << 0 <<
2718 Diag(Loc, diag::err_wasm_table_as_function_parameter);
2722 Diag(Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
2729 Diag(Loc, diag::warn_deprecated_volatile_param) << ParamType;
2731 ParamTypes[Idx] = ParamType;
2736 [=](
unsigned i) {
return Loc; });
2747 return Context.getFunctionType(
T, ParamTypes, EPI);
2762 D <<
"member pointer";
2770 Diag(Loc, diag::err_distant_exception_spec);
2776 if (
T->isReferenceType()) {
2777 Diag(Loc, diag::err_illegal_decl_mempointer_to_reference)
2782 if (
T->isVoidType()) {
2783 Diag(Loc, diag::err_illegal_decl_mempointer_to_void)
2791 Diag(Loc, diag::err_opencl_function_pointer) << 0;
2796 Diag(Loc, diag::err_hlsl_pointers_unsupported) << 0;
2805 if (
T->isFunctionType())
2814 if (!
T->isFunctionType()) {
2815 Diag(Loc, diag::err_nonfunction_block_type);
2825 return Context.getBlockPointerType(
T);
2831 if (TInfo) *TInfo =
nullptr;
2836 if (
const LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) {
2837 QT = LIT->getType();
2838 TSI = LIT->getTypeSourceInfo();
2848 unsigned chunkIndex);
2855 Sema &S = state.getSema();
2856 Declarator &declarator = state.getDeclarator();
2862 unsigned outermostPointerIndex = 0;
2864 unsigned numPointers = 0;
2866 unsigned chunkIndex = i;
2868 switch (chunk.
Kind) {
2878 outermostPointerIndex = chunkIndex;
2886 if (numPointers != 1)
return;
2888 outermostPointerIndex = chunkIndex;
2906 if (numPointers == 1) {
2924 }
else if (numPointers == 2) {
2937 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership)
2941 outermostPointerIndex);
2963 }
const QualKinds[5] = {
2977 for (
auto &E : QualKinds) {
2978 if (Quals & E.Mask) {
2979 if (!QualStr.empty()) QualStr +=
' ';
2996 << QualStr <<
NumQuals << FixIts[0] << FixIts[1] << FixIts[2] << FixIts[3];
3002 unsigned FunctionChunkIndex) {
3012 for (
unsigned OuterChunkIndex = FunctionChunkIndex + 1,
3014 OuterChunkIndex != End; ++OuterChunkIndex) {
3016 switch (OuterChunk.
Kind) {
3023 diag::warn_qual_return_type,
3049 llvm_unreachable(
"unknown declarator chunk kind");
3070static std::pair<QualType, TypeSourceInfo *>
3074 Sema &S = state.getSema();
3078 const unsigned AutoParameterPosition = Info.
TemplateParams.size();
3092 TemplateParameterDepth, AutoParameterPosition,
3095 IsParameterPack,
Auto->isConstrained());
3100 if (
Auto->isConstrained()) {
3107 for (
unsigned Idx = 0; Idx < AutoLoc.
getNumArgs(); ++Idx) {
3165 QualType NewT = state.ReplaceAutoType(
T, Replacement);
3169 return {NewT, NewTSI};
3178 Sema &SemaRef = state.getSema();
3181 ReturnTypeInfo =
nullptr;
3184 TagDecl *OwnedTagDecl =
nullptr;
3234 DeducedType *
Deduced =
T->getContainedDeducedType();
3235 bool DeducedIsTrailingReturnType =
false;
3239 DeducedIsTrailingReturnType =
true;
3249 bool IsCXXAutoType =
3251 bool IsDeducedReturnType =
false;
3301 assert(Info &&
"No LambdaScopeInfo on the stack!");
3307 if (!DeducedIsTrailingReturnType)
3320 llvm_unreachable(
"unhandled tag kind");
3322 Error = Cxx ? 1 : 2;
3325 Error = Cxx ? 3 : 4;
3370 if (!SemaRef.
getLangOpts().CPlusPlus14 || !IsCXXAutoType)
3372 IsDeducedReturnType =
true;
3375 if (!SemaRef.
getLangOpts().CPlusPlus14 || !IsCXXAutoType)
3377 IsDeducedReturnType =
true;
3382 if (SemaRef.
getLangOpts().CPlusPlus23 && IsCXXAutoType &&
3383 !
Auto->isDecltypeAuto())
3416 (!SemaRef.
getLangOpts().CPlusPlus11 || !IsCXXAutoType))
3422 switch (
Auto->getKeyword()) {
3429 "unknown auto type");
3433 auto *DTST = dyn_cast<DeducedTemplateSpecializationType>(
Deduced);
3436 SemaRef.
Diag(AutoRange.
getBegin(), diag::err_auto_not_allowed)
3449 unsigned DiagId = 0;
3451 DiagId = diag::warn_cxx11_compat_generic_lambda;
3452 else if (IsDeducedReturnType)
3453 DiagId = diag::warn_cxx11_compat_deduced_return_type;
3455 DiagId = diag::warn_cxx98_compat_auto_type_specifier;
3458 SemaRef.
Diag(AutoRange.
getBegin(), DiagId) << AutoRange;
3466 unsigned DiagID = 0;
3472 llvm_unreachable(
"parser should not have allowed this");
3488 DiagID = diag::err_type_defined_in_alias_template;
3500 DiagID = diag::err_type_defined_in_type_specifier;
3510 DiagID = diag::err_type_defined_in_param_type;
3516 DiagID = diag::err_type_defined_in_condition;
3527 assert(!
T.isNull() &&
"This function should not return a null type");
3536 assert(FTI.
isAmbiguous &&
"no direct-initializer / function ambiguity");
3566 FTI.
NumParams ? diag::warn_parens_disambiguated_as_function_declaration
3567 : diag::warn_empty_parens_are_function_decl)
3578 if (Comma.getFileID() != Name.
getFileID() ||
3586 Result.suppressDiagnostics();
3599 S.
Diag(B, diag::note_additional_parens_for_variable_declaration)
3614 S.
Diag(DeclType.
Loc, diag::note_empty_parens_default_ctor)
3622 S.
Diag(DeclType.
Loc, diag::note_empty_parens_zero_initialize)
3633 "do not have redundant top-level parentheses");
3642 bool CouldBeTemporaryObject =
3646 (
T->isRecordType() ||
T->isDependentType()) &&
3649 bool StartsWithDeclaratorId =
true;
3657 StartsWithDeclaratorId =
false;
3662 CouldBeTemporaryObject =
false;
3670 CouldBeTemporaryObject =
false;
3671 StartsWithDeclaratorId =
false;
3681 CouldBeTemporaryObject =
false;
3688 CouldBeTemporaryObject =
false;
3689 StartsWithDeclaratorId =
false;
3699 if (CouldBeTemporaryObject) {
3703 CouldBeTemporaryObject =
false;
3704 Result.suppressDiagnostics();
3709 if (!CouldBeTemporaryObject) {
3733 S.
Diag(
Paren.Loc, diag::warn_redundant_parens_around_declarator)
3739 S.
Diag(
Paren.Loc, diag::warn_parens_disambiguated_as_variable_declaration)
3741 auto *RD =
T->getAsCXXRecordDecl();
3742 if (!RD || !RD->hasDefinition() || RD->hasNonTrivialDestructor())
3743 S.
Diag(
Paren.Loc, diag::note_raii_guard_add_name)
3748 S.
Diag(D.
getBeginLoc(), diag::note_function_style_cast_add_parentheses)
3751 S.
Diag(
Paren.Loc, diag::note_remove_parens_for_variable_declaration)
3767 switch (AL.getKind()) {
3786 bool IsCXXInstanceMethod =
false;
3792 unsigned I = ChunkIndex;
3793 bool FoundNonParen =
false;
3794 while (I && !FoundNonParen) {
3797 FoundNonParen =
true;
3800 if (FoundNonParen) {
3803 IsCXXInstanceMethod =
3808 IsCXXInstanceMethod =
3816 IsCXXInstanceMethod =
3824 IsCXXInstanceMethod);
3832 if (Triple.isSPIRV() && Triple.getVendor() != llvm::Triple::AMD) {
3834 if (AL.getKind() == ParsedAttr::AT_CUDAGlobal) {
3842 for (
const ParsedAttr &AL : llvm::concat<ParsedAttr>(
3845 if (AL.getKind() == ParsedAttr::AT_DeviceKernel) {
3856 enum class SimplePointerKind {
3865 switch (nullability) {
3867 if (!Ident__Nonnull)
3868 Ident__Nonnull =
PP.getIdentifierInfo(
"_Nonnull");
3869 return Ident__Nonnull;
3872 if (!Ident__Nullable)
3873 Ident__Nullable =
PP.getIdentifierInfo(
"_Nullable");
3874 return Ident__Nullable;
3877 if (!Ident__Nullable_result)
3878 Ident__Nullable_result =
PP.getIdentifierInfo(
"_Nullable_result");
3879 return Ident__Nullable_result;
3882 if (!Ident__Null_unspecified)
3883 Ident__Null_unspecified =
PP.getIdentifierInfo(
"_Null_unspecified");
3884 return Ident__Null_unspecified;
3886 llvm_unreachable(
"Unknown nullability kind.");
3893 if (AL.getKind() == ParsedAttr::AT_TypeNonNull ||
3894 AL.getKind() == ParsedAttr::AT_TypeNullable ||
3895 AL.getKind() == ParsedAttr::AT_TypeNullableResult ||
3896 AL.getKind() == ParsedAttr::AT_TypeNullUnspecified)
3905 enum class PointerDeclaratorKind {
3913 MaybePointerToCFRef,
3917 NSErrorPointerPointer,
3923 enum class PointerWrappingDeclaratorKind {
3937static PointerDeclaratorKind
3939 PointerWrappingDeclaratorKind &wrappingKind) {
3940 unsigned numNormalPointers = 0;
3943 if (
type->isDependentType())
3944 return PointerDeclaratorKind::NonPointer;
3949 switch (chunk.
Kind) {
3951 if (numNormalPointers == 0)
3952 wrappingKind = PointerWrappingDeclaratorKind::Array;
3961 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
3962 : PointerDeclaratorKind::SingleLevelPointer;
3968 if (numNormalPointers == 0)
3969 wrappingKind = PointerWrappingDeclaratorKind::Reference;
3973 ++numNormalPointers;
3974 if (numNormalPointers > 2)
3975 return PointerDeclaratorKind::MultiLevelPointer;
3981 unsigned numTypeSpecifierPointers = 0;
3985 ++numNormalPointers;
3987 if (numNormalPointers > 2)
3988 return PointerDeclaratorKind::MultiLevelPointer;
3990 type = ptrType->getPointeeType();
3991 ++numTypeSpecifierPointers;
3997 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
3998 : PointerDeclaratorKind::SingleLevelPointer;
4003 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
4004 : PointerDeclaratorKind::SingleLevelPointer;
4009 ++numNormalPointers;
4010 ++numTypeSpecifierPointers;
4013 if (
auto objcClassDecl = objcObjectPtr->getInterfaceDecl()) {
4015 numNormalPointers == 2 && numTypeSpecifierPointers < 2) {
4016 return PointerDeclaratorKind::NSErrorPointerPointer;
4025 if (objcClass->getInterface()->getIdentifier() ==
4027 if (numNormalPointers == 2 && numTypeSpecifierPointers < 2)
4028 return PointerDeclaratorKind::NSErrorPointerPointer;
4035 if (numNormalPointers == 0)
4036 return PointerDeclaratorKind::NonPointer;
4040 if (numNormalPointers == 2 && numTypeSpecifierPointers < 2 &&
4042 return PointerDeclaratorKind::CFErrorRefPointer;
4050 switch (numNormalPointers) {
4052 return PointerDeclaratorKind::NonPointer;
4055 return PointerDeclaratorKind::SingleLevelPointer;
4058 return PointerDeclaratorKind::MaybePointerToCFRef;
4061 return PointerDeclaratorKind::MultiLevelPointer;
4070 if (ctx->isFunctionOrMethod())
4073 if (ctx->isFileContext())
4084 bool invalid =
false;
4086 if (invalid || !sloc.
isFile())
4104template <
typename DiagBuilderT>
4113 if (!FixItLoc.
isValid() || FixItLoc == PointerLoc)
4122 InsertionTextBuf +=
" ";
4123 StringRef InsertionText = InsertionTextBuf.str();
4126 InsertionText = InsertionText.drop_back();
4127 }
else if (NextChar[-1] ==
'[') {
4128 if (NextChar[0] ==
']')
4129 InsertionText = InsertionText.drop_back().drop_front();
4131 InsertionText = InsertionText.drop_front();
4134 InsertionText = InsertionText.drop_back().drop_front();
4141 SimplePointerKind PointerKind,
4146 if (PointerKind == SimplePointerKind::Array) {
4147 S.
Diag(PointerLoc, diag::warn_nullability_missing_array);
4149 S.
Diag(PointerLoc, diag::warn_nullability_missing)
4150 <<
static_cast<unsigned>(PointerKind);
4153 auto FixItLoc = PointerEndLoc.
isValid() ? PointerEndLoc : PointerLoc;
4154 if (FixItLoc.isMacroID())
4158 auto Diag = S.
Diag(FixItLoc, diag::note_nullability_fix_it);
4189 if (pointerKind == SimplePointerKind::Array)
4190 diagKind = diag::warn_nullability_missing_array;
4192 diagKind = diag::warn_nullability_missing;
4198 fileNullability.
PointerKind =
static_cast<unsigned>(pointerKind);
4230 auto kind =
static_cast<SimplePointerKind
>(fileNullability.
PointerKind);
4245 unsigned i = endIndex;
4273template<
typename AttrT>
4276 return ::new (Ctx) AttrT(Ctx, AL);
4294 llvm_unreachable(
"unknown NullabilityKind");
4305 if (ASOld != ASNew) {
4306 S.
Diag(AttrLoc, diag::err_attribute_address_multiple_qualifiers);
4311 diag::warn_attribute_address_multiple_identical_qualifiers);
4320 return T->canHaveNullability(
false) &&
4326 T->getCanonicalTypeInternal());
4336 Sema &S = state.getSema();
4346 bool IsTypedefName =
4352 bool IsQualifiedFunction =
T->isFunctionProtoType() &&
4360 if (
auto *DT =
T->getAs<DeducedType>()) {
4361 const AutoType *AT =
T->getAs<AutoType>();
4363 if ((AT && AT->isDecltypeAuto()) || IsClassTemplateDeduction) {
4365 unsigned Index = E - I - 1;
4367 unsigned DiagId = IsClassTemplateDeduction
4368 ? diag::err_deduced_class_template_compound_type
4369 : diag::err_decltype_auto_compound_type;
4370 unsigned DiagKind = 0;
4371 switch (DeclChunk.
Kind) {
4375 if (IsClassTemplateDeduction) {
4383 DiagId = diag::err_decltype_auto_function_declarator_not_declaration;
4401 S.
Diag(DeclChunk.
Loc, DiagId) << DiagKind;
4410 bool inferNullabilityCS =
false;
4411 bool inferNullabilityInnerOnly =
false;
4412 bool inferNullabilityInnerOnlyComplete =
false;
4415 bool inAssumeNonNullRegion =
false;
4417 if (assumeNonNullLoc.
isValid()) {
4418 inAssumeNonNullRegion =
true;
4432 } complainAboutMissingNullability = CAMN_No;
4433 unsigned NumPointersRemaining = 0;
4434 auto complainAboutInferringWithinChunk = PointerWrappingDeclaratorKind::None;
4436 if (IsTypedefName) {
4440 complainAboutMissingNullability = CAMN_InnerPointers;
4444 ++NumPointersRemaining;
4449 switch (chunk.
Kind) {
4457 ++NumPointersRemaining;
4465 ++NumPointersRemaining;
4470 bool isFunctionOrMethod =
false;
4471 switch (
auto context = state.getDeclarator().getContext()) {
4477 isFunctionOrMethod =
true;
4481 if (state.getDeclarator().isObjCIvar() && !isFunctionOrMethod) {
4482 complainAboutMissingNullability = CAMN_No;
4487 if (state.getDeclarator().isObjCWeakProperty()) {
4490 complainAboutMissingNullability = CAMN_No;
4491 if (inAssumeNonNullRegion) {
4501 complainAboutMissingNullability = CAMN_Yes;
4504 auto wrappingKind = PointerWrappingDeclaratorKind::None;
4506 case PointerDeclaratorKind::NonPointer:
4507 case PointerDeclaratorKind::MultiLevelPointer:
4511 case PointerDeclaratorKind::SingleLevelPointer:
4513 if (inAssumeNonNullRegion) {
4514 complainAboutInferringWithinChunk = wrappingKind;
4521 case PointerDeclaratorKind::CFErrorRefPointer:
4522 case PointerDeclaratorKind::NSErrorPointerPointer:
4525 if (isFunctionOrMethod && inAssumeNonNullRegion)
4529 case PointerDeclaratorKind::MaybePointerToCFRef:
4530 if (isFunctionOrMethod) {
4534 auto hasCFReturnsAttr =
4536 return AttrList.hasAttribute(ParsedAttr::AT_CFReturnsRetained) ||
4537 AttrList.hasAttribute(ParsedAttr::AT_CFReturnsNotRetained);
4542 hasCFReturnsAttr(InnermostChunk->getAttrs()) ||
4545 inferNullabilityInnerOnly =
true;
4555 complainAboutMissingNullability = CAMN_Yes;
4583 auto isVaList = [&S](
QualType T) ->
bool {
4589 if (typedefTy->getDecl() == vaListTypedef)
4591 if (
auto *name = typedefTy->getDecl()->getIdentifier())
4592 if (name->isStr(
"va_list"))
4594 typedefTy = typedefTy->desugar()->getAs<
TypedefType>();
4595 }
while (typedefTy);
4601 auto inferPointerNullability =
4606 if (NumPointersRemaining > 0)
4607 --NumPointersRemaining;
4614 if (inferNullability && !inferNullabilityInnerOnlyComplete) {
4617 ? ParsedAttr::Form::ContextSensitiveKeyword()
4618 : ParsedAttr::Form::Keyword(
false ,
4624 attrs.addAtEnd(nullabilityAttr);
4626 if (inferNullabilityCS) {
4627 state.getDeclarator().getMutableDeclSpec().getObjCQualifiers()
4631 if (pointerLoc.isValid() &&
4632 complainAboutInferringWithinChunk !=
4633 PointerWrappingDeclaratorKind::None) {
4635 S.
Diag(pointerLoc, diag::warn_nullability_inferred_on_nested_type);
4640 if (inferNullabilityInnerOnly)
4641 inferNullabilityInnerOnlyComplete =
true;
4642 return nullabilityAttr;
4647 switch (complainAboutMissingNullability) {
4651 case CAMN_InnerPointers:
4652 if (NumPointersRemaining == 0)
4668 if (NumPointersRemaining > 0)
4669 --NumPointersRemaining;
4671 SimplePointerKind pointerKind = SimplePointerKind::Pointer;
4672 if (
T->isBlockPointerType())
4673 pointerKind = SimplePointerKind::BlockPointer;
4674 else if (
T->isMemberPointerType())
4675 pointerKind = SimplePointerKind::MemberPointer;
4677 if (
auto *
attr = inferPointerNullability(
4682 T = state.getAttributedType(
4688 if (complainAboutMissingNullability == CAMN_Yes &&
T->isArrayType() &&
4696 bool ExpectNoDerefChunk =
4697 state.getCurrentAttributes().hasAttribute(ParsedAttr::AT_NoDeref);
4707 bool AreDeclaratorChunksValid =
true;
4709 unsigned chunkIndex = e - i - 1;
4710 state.setCurrentChunkIndex(chunkIndex);
4713 switch (DeclType.
Kind) {
4721 if (!LangOpts.Blocks)
4722 S.
Diag(DeclType.
Loc, diag::err_blocks_disable) << LangOpts.OpenCL;
4725 inferPointerNullability(SimplePointerKind::BlockPointer, DeclType.
Loc,
4727 state.getDeclarator().getAttributePool());
4733 if (LangOpts.OpenCL)
4748 inferPointerNullability(SimplePointerKind::Pointer, DeclType.
Loc,
4750 state.getDeclarator().getAttributePool());
4753 T = Context.getObjCObjectPointerType(
T);
4762 if (LangOpts.OpenCL) {
4763 if (
T->isImageType() ||
T->isSamplerT() ||
T->isPipeType() ||
4764 T->isBlockPointerType()) {
4778 diag::err_overflow_behavior_non_integer_type)
4812 if (chunkIndex != 0 && !ArraySize &&
4831 S.
Diag(DeclType.
Loc, diag::err_array_star_outside_prototype);
4842 S.
Diag(DeclType.
Loc, diag::err_array_static_outside_prototype)
4844 :
"type qualifier");
4855 S.
Diag(DeclType.
Loc, diag::err_array_static_not_outermost)
4857 :
"type qualifier");
4867 if (complainAboutMissingNullability == CAMN_Yes &&
4883 IsQualifiedFunction =
4889 return SS.isInvalid() ||
4890 isa_and_present<CXXRecordDecl>(
4915 if (
First &&
First->isExplicitObjectParameter() &&
4929 diag::err_explicit_object_parameter_nonmember)
4930 << 2 << 0 <<
First->getSourceRange();
4933 diag::err_explicit_object_parameter_invalid)
4934 <<
First->getSourceRange();
4940 AreDeclaratorChunksValid =
false;
4953 ? diag::err_auto_missing_trailing_return
4954 : diag::err_deduced_return_type);
4957 AreDeclaratorChunksValid =
false;
4960 diag::warn_cxx11_compat_deduced_return_type);
4969 AreDeclaratorChunksValid =
false;
4972 if (
T != Context.DependentTy) {
4974 diag::err_deduction_guide_with_complex_decl)
4978 AreDeclaratorChunksValid =
false;
4995 S.
Diag(Loc, diag::err_trailing_return_without_auto) <<
T << SR;
4998 AreDeclaratorChunksValid =
false;
5005 }
else if (AutoType *
Auto =
T->getContainedAutoType()) {
5014 if (InventedParamInfo) {
5016 state,
T, TInfo,
Auto, *InventedParamInfo);
5029 T->isFunctionType()) &&
5032 unsigned diagID = diag::err_func_returning_array_function;
5035 if (chunkIndex == 0 &&
5037 diagID = diag::err_block_returning_array_function;
5038 S.
Diag(DeclType.
Loc, diagID) <<
T->isFunctionType() <<
T;
5041 AreDeclaratorChunksValid =
false;
5046 if (
T->isHalfType()) {
5054 }
else if (!S.
getLangOpts().NativeHalfArgsAndReturns &&
5057 diag::err_parameters_retval_cannot_have_fp16_type) << 1;
5063 if (
T.getPointerAuth()) {
5064 S.
Diag(DeclType.
Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 0;
5067 if (LangOpts.OpenCL) {
5070 if (
T->isBlockPointerType() ||
T->isImageType() ||
T->isSamplerT() ||
5081 "__cl_clang_variadic_functions", S.
getLangOpts()) &&
5093 if (
T->isObjCObjectType()) {
5102 S.
Diag(DiagLoc, diag::err_object_cannot_be_passed_returned_by_value)
5106 T = Context.getObjCObjectPointerType(
T);
5114 AreDeclaratorChunksValid =
false;
5122 if ((
T.getCVRQualifiers() ||
T->isAtomicType()) &&
5126 (
T->isRecordType() ||
T->isDependentType() ||
5127 T->isUndeducedAutoType()))) {
5134 S.
Diag(DeclType.
Loc, diag::err_func_returning_qualified_void) <<
T;
5141 if (
T.isVolatileQualified() && S.
getLangOpts().CPlusPlus20)
5142 S.
Diag(DeclType.
Loc, diag::warn_deprecated_volatile_return) <<
T;
5147 if (
T.getQualifiers().hasObjCLifetime()) {
5152 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership) {
5153 AttrLoc = AL.getLoc();
5160 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership) {
5161 AttrLoc = AL.getLoc();
5175 S.
Diag(AttrLoc, diag::warn_arc_lifetime_result_type)
5176 <<
T.getQualifiers().getObjCLifetime();
5184 S.
Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
5185 << Context.getCanonicalTagType(Tag);
5192 diag::err_exception_spec_in_typedef)
5210 T = Context.getFunctionNoProtoType(
T, EI);
5218 diag::warn_c17_compat_ellipsis_only_parameter);
5220 ParsedAttr::AT_Overloadable) &&
5222 ParsedAttr::AT_Overloadable) &&
5224 ParsedAttr::AT_Overloadable))
5232 diag::err_ident_list_in_fn_declaration);
5236 ? Context.getFunctionNoProtoType(
T, EI)
5238 AreDeclaratorChunksValid =
false;
5261 bool HasAnyInterestingExtParameterInfos =
false;
5263 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
5265 QualType ParamTy = Param->getType();
5266 assert(!ParamTy.
isNull() &&
"Couldn't parse type?");
5277 ParamTy = Context.IntTy;
5278 Param->setType(ParamTy);
5282 ParamTy = Context.IntTy;
5283 Param->setType(ParamTy);
5287 S.
Diag(DeclType.
Loc, diag::err_void_param_qualified);
5289 for (
const auto *A : Param->attrs()) {
5290 S.
Diag(A->getLoc(), diag::warn_attribute_on_void_param)
5291 << A << A->getRange();
5296 if (Param->isExplicitObjectParameter()) {
5297 S.
Diag(Param->getLocation(),
5298 diag::err_void_explicit_object_param);
5311 S.
Diag(Param->getLocation(), diag::err_opencl_invalid_param)
5314 Param->setInvalidDecl();
5316 }
else if (!S.
getLangOpts().NativeHalfArgsAndReturns &&
5318 S.
Diag(Param->getLocation(),
5319 diag::err_parameters_retval_cannot_have_fp16_type) << 0;
5323 if (Context.isPromotableIntegerType(ParamTy)) {
5324 ParamTy = Context.getPromotedIntegerType(ParamTy);
5325 Param->setKNRPromoted(
true);
5327 if (BTy->getKind() == BuiltinType::Float) {
5328 ParamTy = Context.DoubleTy;
5329 Param->setKNRPromoted(
true);
5334 S.
Diag(Param->getLocation(), diag::err_opencl_invalid_param)
5339 if (LangOpts.ObjCAutoRefCount && Param->hasAttr<NSConsumedAttr>()) {
5340 ExtParameterInfos[i] = ExtParameterInfos[i].withIsConsumed(
true);
5341 HasAnyInterestingExtParameterInfos =
true;
5345 ExtParameterInfos[i] =
5346 ExtParameterInfos[i].withABI(
attr->getABI());
5347 HasAnyInterestingExtParameterInfos =
true;
5350 if (Param->hasAttr<PassObjectSizeAttr>()) {
5351 ExtParameterInfos[i] = ExtParameterInfos[i].withHasPassObjectSize();
5352 HasAnyInterestingExtParameterInfos =
true;
5355 if (Param->hasAttr<NoEscapeAttr>()) {
5356 ExtParameterInfos[i] = ExtParameterInfos[i].withIsNoEscape(
true);
5357 HasAnyInterestingExtParameterInfos =
true;
5360 ParamTys.push_back(ParamTy);
5363 if (HasAnyInterestingExtParameterInfos) {
5372 Expr *NoexceptExpr =
nullptr;
5378 DynamicExceptions.reserve(N);
5379 DynamicExceptionRanges.reserve(N);
5380 for (
unsigned I = 0; I != N; ++I) {
5391 DynamicExceptionRanges,
5398 auto IsClassMember = [&]() {
5399 return (!state.getDeclarator().getCXXScopeSpec().isEmpty() &&
5400 state.getDeclarator()
5404 state.getDeclarator().getContext() ==
5406 state.getDeclarator().getContext() ==
5410 if (state.getSema().getLangOpts().OpenCLCPlusPlus && IsClassMember()) {
5430 T = Context.getFunctionType(
T, ParamTys, EPI);
5439 inferPointerNullability(SimplePointerKind::MemberPointer, DeclType.
Loc,
5441 state.getDeclarator().getAttributePool());
5446 AreDeclaratorChunksValid =
false;
5455 AreDeclaratorChunksValid =
false;
5473 AreDeclaratorChunksValid =
false;
5482 S.
Diag(DeclType.
Loc, diag::warn_noderef_on_non_pointer_or_array);
5484 ExpectNoDerefChunk = state.didParseNoDeref();
5488 if (ExpectNoDerefChunk)
5489 S.
Diag(state.getDeclarator().getBeginLoc(),
5490 diag::warn_noderef_on_non_pointer_or_array);
5503 bool IsBlock =
false;
5505 switch (DeclType.Kind) {
5517 S.
Diag(DeclType.Loc, diag::warn_strict_prototypes)
5529 assert(!
T.isNull() &&
"T must not be null after this point");
5531 if (LangOpts.CPlusPlus &&
T->isFunctionType()) {
5533 assert(FnTy &&
"Why oh why is there not a FunctionProtoType here?");
5546 ExplicitObjectMember,
5550 Kind = DeductionGuide;
5567 auto *P = dyn_cast_or_null<ParmVarDecl>(Chunk.
Fun.
Params->
Param);
5568 if (P && P->isExplicitObjectParameter())
5569 Kind = ExplicitObjectMember;
5595 if (IsQualifiedFunction &&
5621 if (!RemovalLocs.empty()) {
5622 llvm::sort(RemovalLocs,
5624 RemovalRange =
SourceRange(RemovalLocs.front(), RemovalLocs.back());
5625 Loc = RemovalLocs.front();
5629 S.
Diag(Loc, diag::err_invalid_qualified_function_type)
5653 if (!AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
5661 state.diagnoseIgnoredTypeAttrs(
T);
5672 if (
T.isVolatileQualified() && S.
getLangOpts().CPlusPlus20 &&
5697 if (!
T->containsUnexpandedParameterPack() &&
5698 (!LangOpts.CPlusPlus20 || !
T->getContainedAutoType())) {
5700 diag::err_function_parameter_pack_without_parameter_packs)
5704 T = Context.getPackExpansionType(
T, std::nullopt,
5717 if (
T->containsUnexpandedParameterPack())
5718 T = Context.getPackExpansionType(
T, std::nullopt);
5721 LangOpts.CPlusPlus11
5722 ? diag::warn_cxx98_compat_variadic_templates
5723 : diag::ext_variadic_templates);
5753 diag::err_ellipsis_in_declarator_not_parameter);
5759 assert(!
T.isNull() &&
"T must not be null at the end of this function");
5760 if (!AreDeclaratorChunksValid)
5761 return Context.getTrivialTypeSourceInfo(
T);
5763 if (state.didParseHLSLParamMod() && !
T->isConstantArrayType())
5772 TypeProcessingState state(*
this, D);
5795 unsigned chunkIndex) {
5796 Sema &S = state.getSema();
5804 const char *attrStr =
nullptr;
5805 switch (ownership) {
5823 &Args, 1, ParsedAttr::Form::GNU());
5832 Sema &S = state.getSema();
5836 bool hasIndirection =
false;
5839 switch (chunk.
Kind) {
5848 hasIndirection =
true;
5881 TypeProcessingState state(*
this, D);
5896 TypeProcessingState &State) {
5901 TypeProcessingState &State) {
5903 State.getSema().HLSL().TakeLocForHLSLAttribute(TL.
getTypePtr());
5911 if (AL.getKind() == ParsedAttr::AT_MatrixType) {
5920 llvm_unreachable(
"no matrix_type attribute found at the expected location!");
5925 switch (Chunk.
Kind) {
5930 llvm_unreachable(
"cannot be _Atomic qualified");
5948 class TypeSpecLocFiller :
public TypeLocVisitor<TypeSpecLocFiller> {
5950 ASTContext &Context;
5951 TypeProcessingState &State;
5955 TypeSpecLocFiller(Sema &S, ASTContext &Context, TypeProcessingState &State,
5957 : SemaRef(S), Context(Context), State(State), DS(DS) {}
5959 void VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5963 void VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
5966 void VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
5969 void VisitHLSLAttributedResourceTypeLoc(HLSLAttributedResourceTypeLoc TL) {
5973 void VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {}
5974 void VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
5977 State.getExpansionLocForMacroQualifiedType(TL.
getTypePtr()));
5979 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5984 void VisitPointerTypeLoc(PointerTypeLoc TL) { Visit(TL.
getNextTypeLoc()); }
5985 void VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5987 TypeSourceInfo *TInfo =
nullptr;
6000 void VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
6002 TypeSourceInfo *TInfo =
nullptr;
6015 void VisitUsingTypeLoc(UsingTypeLoc TL) {
6017 TypeSourceInfo *TInfo =
nullptr;
6030 void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
6037 void VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
6038 TypeSourceInfo *RepTInfo =
nullptr;
6042 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6043 TypeSourceInfo *RepTInfo =
nullptr;
6047 void VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
6048 TypeSourceInfo *TInfo =
nullptr;
6059 TL.
copy(OldTL.
castAs<TemplateSpecializationTypeLoc>());
6061 OldTL.
castAs<TemplateSpecializationTypeLoc>().getRAngleLoc());
6063 void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6069 void VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6075 TypeSourceInfo *TInfo =
nullptr;
6079 void VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
6084 void VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
6088 void VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6093 TypeSourceInfo *TInfo =
nullptr;
6097 void VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6110 void VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6112 TypeSourceInfo *TInfo =
nullptr;
6117 void VisitAutoTypeLoc(AutoTypeLoc TL) {
6131 NestedNameSpecifierLoc NNS =
6134 : NestedNameSpecifierLoc());
6135 TemplateArgumentListInfo TemplateArgsInfo(TemplateId->
LAngleLoc,
6137 if (TemplateId->
NumArgs > 0) {
6142 DeclarationNameInfo DNI = DeclarationNameInfo(
6143 TL.
getTypePtr()->getTypeConstraintConcept()->getDeclName(),
6146 NamedDecl *FoundDecl;
6151 FoundDecl = cast_if_present<NamedDecl>(TN.getAsTemplateDecl());
6159 void VisitDeducedTemplateSpecializationTypeLoc(
6160 DeducedTemplateSpecializationTypeLoc TL) {
6162 TypeSourceInfo *TInfo =
nullptr;
6168 void VisitTagTypeLoc(TagTypeLoc TL) {
6170 TypeSourceInfo *TInfo =
nullptr;
6178 ElaboratedTypeKeyword::None
6180 : SourceLocation());
6184 void VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6191 TypeSourceInfo *TInfo =
nullptr;
6203 void VisitPipeTypeLoc(PipeTypeLoc TL) {
6206 TypeSourceInfo *TInfo =
nullptr;
6211 void VisitExtIntTypeLoc(BitIntTypeLoc TL) {
6215 void VisitDependentExtIntTypeLoc(DependentBitIntTypeLoc TL) {
6219 void VisitTypeLoc(TypeLoc TL) {
6225 class DeclaratorLocFiller :
public TypeLocVisitor<DeclaratorLocFiller> {
6226 ASTContext &Context;
6227 TypeProcessingState &State;
6228 const DeclaratorChunk &Chunk;
6231 DeclaratorLocFiller(ASTContext &Context, TypeProcessingState &State,
6232 const DeclaratorChunk &Chunk)
6233 : Context(Context), State(State), Chunk(Chunk) {}
6235 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6236 llvm_unreachable(
"qualified type locs not expected here!");
6238 void VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6239 llvm_unreachable(
"decayed type locs not expected here!");
6241 void VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
6242 llvm_unreachable(
"array parameter type locs not expected here!");
6245 void VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6248 void VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
6251 void VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
6254 void VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
6257 void VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6260 void VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6264 void VisitPointerTypeLoc(PointerTypeLoc TL) {
6268 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6272 void VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6277 void VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6283 void VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6288 void VisitArrayTypeLoc(ArrayTypeLoc TL) {
6294 void VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6299 const DeclaratorChunk::FunctionTypeInfo &FTI = Chunk.
Fun;
6302 for (
unsigned i = 0, e = TL.
getNumParams(), tpi = 0; i != e; ++i) {
6308 void VisitParenTypeLoc(ParenTypeLoc TL) {
6313 void VisitPipeTypeLoc(PipeTypeLoc TL) {
6317 void VisitBitIntTypeLoc(BitIntTypeLoc TL) {
6320 void VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
6323 void VisitVectorTypeLoc(VectorTypeLoc TL) { TL.
setNameLoc(Chunk.
Loc); }
6324 void VisitDependentVectorTypeLoc(DependentVectorTypeLoc TL) {
6327 void VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6330 void VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6334 VisitDependentSizedExtVectorTypeLoc(DependentSizedExtVectorTypeLoc TL) {
6337 void VisitMatrixTypeLoc(MatrixTypeLoc TL) {
6341 void VisitTypeLoc(TypeLoc TL) {
6342 llvm_unreachable(
"unsupported TypeLoc kind in declarator!");
6351 if (AL.getKind() == ParsedAttr::AT_AddressSpace) {
6360 "no address_space attribute found at the expected location!");
6374 Sema &S = State.getSema();
6400 bool HasDesugaredTypeLoc =
true;
6401 while (HasDesugaredTypeLoc) {
6403 case TypeLoc::MacroQualified: {
6406 State.getExpansionLocForMacroQualifiedType(TL.
getTypePtr()));
6411 case TypeLoc::Attributed: {
6418 case TypeLoc::Adjusted:
6419 case TypeLoc::BTFTagAttributed: {
6424 case TypeLoc::DependentAddressSpace: {
6432 HasDesugaredTypeLoc =
false;
6443 if (ReturnTypeInfo) {
6463 "LocInfoType's TypeClass conflicts with an existing Type class");
6469 llvm_unreachable(
"LocInfoType leaked into the type system; an opaque TypeTy*"
6470 " was used directly instead of getting the QualType through"
6471 " GetTypeFromParser");
6478 "Type name should have no identifier!");
6515 const Expr *AddrSpace,
6518 std::optional<llvm::APSInt> OptAddrSpace =
6520 if (!OptAddrSpace) {
6521 S.
Diag(AttrLoc, diag::err_attribute_argument_type)
6526 llvm::APSInt &addrSpace = *OptAddrSpace;
6529 if (addrSpace.isSigned()) {
6530 if (addrSpace.isNegative()) {
6531 S.
Diag(AttrLoc, diag::err_attribute_address_space_negative)
6535 addrSpace.setIsSigned(
false);
6538 llvm::APSInt
max(addrSpace.getBitWidth());
6542 if (addrSpace >
max) {
6543 S.
Diag(AttrLoc, diag::err_attribute_address_space_too_high)
6565 return Context.getAddrSpaceQualType(
T, ASIdx);
6574 Diag(AttrLoc, diag::err_attribute_address_multiple_qualifiers);
6578 return Context.getDependentAddressSpaceType(
T, AddrSpace, AttrLoc);
6590 TypeProcessingState &State) {
6591 Sema &S = State.getSema();
6597 if (!
Attr.diagnoseLangOpts(S)) {
6603 if (
Attr.getNumArgs() != 1) {
6604 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
6611 auto *StrLiteral = dyn_cast<StringLiteral>(
Attr.getArgAsExpr(0));
6620 StringRef BTFTypeTag = StrLiteral->getString();
6621 Type = State.getBTFTagAttributedType(
6622 ::new (Ctx) BTFTypeTagAttr(Ctx,
Attr, BTFTypeTag),
Type);
6630 TypeProcessingState &State) {
6631 Sema &S = State.getSema();
6636 S.
Diag(
Attr.
getLoc(), diag::err_attribute_address_function_type);
6642 if (
Attr.
getKind() == ParsedAttr::AT_AddressSpace) {
6645 if (
Attr.getNumArgs() != 1) {
6652 Expr *ASArgExpr =
Attr.getArgAsExpr(0);
6661 ::new (Ctx) AddressSpaceAttr(Ctx,
Attr,
static_cast<unsigned>(ASIdx));
6673 if (EquivType.
isNull()) {
6677 T = State.getAttributedType(ASAttr,
Type, EquivType);
6679 T = State.getAttributedType(ASAttr,
Type,
Type);
6690 :
Attr.asOpenCLLangAS();
6692 ASIdx =
Attr.asHLSLLangAS();
6695 llvm_unreachable(
"Invalid address space");
6708 TypeProcessingState &State) {
6709 Sema &S = State.getSema();
6713 S.
Diag(
Attr.
getLoc(), diag::warn_overflow_behavior_attribute_disabled)
6720 if (
Attr.getNumArgs() != 1) {
6721 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
6729 S.
Diag(
Attr.
getLoc(), diag::err_overflow_behavior_non_integer_type)
6730 <<
Attr <<
Type.getAsString() << 0;
6735 StringRef KindName =
"";
6738 if (
Attr.isArgIdent(0)) {
6739 Ident =
Attr.getArgAsIdent(0)->getIdentifierInfo();
6748 auto *Str = dyn_cast<StringLiteral>(
Attr.getArgAsExpr(0));
6750 KindName = Str->getString();
6759 OverflowBehaviorType::OverflowBehaviorKind Kind;
6760 if (KindName ==
"wrap") {
6761 Kind = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
6762 }
else if (KindName ==
"trap") {
6763 Kind = OverflowBehaviorType::OverflowBehaviorKind::Trap;
6766 << KindName <<
Attr;
6772 const DeclSpec &DS = State.getDeclarator().getDeclSpec();
6776 OverflowBehaviorType::OverflowBehaviorKind SpecifierKind =
6777 DS.
isWrapSpecified() ? OverflowBehaviorType::OverflowBehaviorKind::Wrap
6778 : OverflowBehaviorType::OverflowBehaviorKind::Trap;
6780 if (SpecifierKind != Kind) {
6783 << 1 << SpecifierName << KindName;
6787 S.
Diag(
Attr.
getLoc(), diag::warn_redundant_overflow_behaviors_mixed)
6794 if (
const auto *ExistingOBT =
Type->
getAs<OverflowBehaviorType>()) {
6795 OverflowBehaviorType::OverflowBehaviorKind ExistingKind =
6796 ExistingOBT->getBehaviorKind();
6797 if (ExistingKind != Kind) {
6798 S.
Diag(
Attr.
getLoc(), diag::err_conflicting_overflow_behaviors) << 0;
6799 if (Kind == OverflowBehaviorType::OverflowBehaviorKind::Trap) {
6800 Type = State.getOverflowBehaviorType(Kind,
6801 ExistingOBT->getUnderlyingType());
6806 Type = State.getOverflowBehaviorType(Kind,
Type);
6816 bool NonObjCPointer =
false;
6818 if (!
type->isDependentType() && !
type->isUndeducedType()) {
6826 NonObjCPointer =
true;
6827 }
else if (!
type->isObjCRetainableType()) {
6833 if (state.isProcessingDeclSpec()) {
6841 Sema &S = state.getSema();
6847 if (!
attr.isArgIdent(0)) {
6848 S.
Diag(AttrLoc, diag::err_attribute_argument_type) <<
attr
6856 if (II->
isStr(
"none"))
6858 else if (II->
isStr(
"strong"))
6860 else if (II->
isStr(
"weak"))
6862 else if (II->
isStr(
"autoreleasing"))
6865 S.
Diag(AttrLoc, diag::warn_attribute_type_not_supported) <<
attr << II;
6882 =
type.getQualifiers().getObjCLifetime()) {
6885 S.
Diag(AttrLoc, diag::err_attr_objc_ownership_redundant)
6892 if (previousLifetime != lifetime) {
6895 const Type *prevTy =
nullptr;
6896 while (!prevTy || prevTy != underlyingType.
Ty) {
6897 prevTy = underlyingType.
Ty;
6906 if (NonObjCPointer) {
6907 StringRef name =
attr.getAttrName()->getName();
6916 S.
Diag(AttrLoc, diag::warn_type_attribute_wrong_type) << name
6933 type = state.getAttributedType(
6940 if (!NonObjCPointer)
6957 diagnostic,
type, 0));
6959 S.
Diag(loc, diagnostic);
6968 unsigned diagnostic =
6969 (S.
getLangOpts().ObjCWeakRuntime ? diag::err_arc_weak_disabled
6970 : diag::err_arc_weak_no_runtime);
6973 diagnoseOrDelay(S, AttrLoc, diagnostic,
type);
6985 if (Class->isArcWeakrefUnavailable()) {
6986 S.
Diag(AttrLoc, diag::err_arc_unsupported_weak_class);
6987 S.
Diag(ObjT->getInterfaceDecl()->getLocation(),
6988 diag::note_class_declared);
7003 Sema &S = state.getSema();
7006 if (!
type->isPointerType() &&
7007 !
type->isObjCObjectPointerType() &&
7008 !
type->isBlockPointerType())
7012 S.
Diag(
attr.getLoc(), diag::err_attribute_multiple_objc_gc);
7018 if (!
attr.isArgIdent(0)) {
7019 S.
Diag(
attr.getLoc(), diag::err_attribute_argument_type)
7025 if (
attr.getNumArgs() > 1) {
7026 S.
Diag(
attr.getLoc(), diag::err_attribute_wrong_number_arguments) <<
attr
7033 if (II->
isStr(
"weak"))
7035 else if (II->
isStr(
"strong"))
7038 S.
Diag(
attr.getLoc(), diag::warn_attribute_type_not_supported)
7048 if (
attr.getLoc().isValid())
7049 type = state.getAttributedType(
7066 struct FunctionTypeUnwrapper {
7080 const FunctionType *
Fn;
7081 SmallVector<
unsigned char , 8> Stack;
7083 FunctionTypeUnwrapper(Sema &S, QualType
T) : Original(
T) {
7085 const Type *Ty =
T.getTypePtr();
7095 Stack.push_back(
Array);
7101 Stack.push_back(BlockPointer);
7104 Stack.push_back(MemberPointer);
7110 Stack.push_back(Attributed);
7113 Stack.push_back(MacroQualified);
7121 T = QualType(DTy, 0);
7122 Stack.push_back(Desugar);
7127 bool isFunctionType()
const {
return (Fn !=
nullptr); }
7128 const FunctionType *get()
const {
return Fn; }
7130 QualType wrap(Sema &S,
const FunctionType *
New) {
7132 if (
New == get())
return Original;
7135 return wrap(S.
Context, Original, 0);
7139 QualType wrap(ASTContext &
C, QualType Old,
unsigned I) {
7140 if (I == Stack.size())
7145 SplitQualType SplitOld = Old.
split();
7149 return wrap(
C, SplitOld.
Ty, I);
7150 return C.getQualifiedType(wrap(
C, SplitOld.
Ty, I), SplitOld.
Quals);
7153 QualType wrap(ASTContext &
C,
const Type *Old,
unsigned I) {
7154 if (I == Stack.size())
return QualType(Fn, 0);
7156 switch (
static_cast<WrapKind
>(Stack[I++])) {
7167 return C.getParenType(
New);
7170 case MacroQualified:
7174 if (
const auto *CAT = dyn_cast<ConstantArrayType>(Old)) {
7175 QualType
New = wrap(
C, CAT->getElementType(), I);
7176 return C.getConstantArrayType(
New, CAT->getSize(), CAT->getSizeExpr(),
7177 CAT->getSizeModifier(),
7178 CAT->getIndexTypeCVRQualifiers());
7181 if (
const auto *VAT = dyn_cast<VariableArrayType>(Old)) {
7182 QualType
New = wrap(
C, VAT->getElementType(), I);
7183 return C.getVariableArrayType(
New, VAT->getSizeExpr(),
7184 VAT->getSizeModifier(),
7185 VAT->getIndexTypeCVRQualifiers());
7189 QualType
New = wrap(
C, IAT->getElementType(), I);
7190 return C.getIncompleteArrayType(
New, IAT->getSizeModifier(),
7191 IAT->getIndexTypeCVRQualifiers());
7196 return C.getPointerType(
New);
7199 case BlockPointer: {
7201 return C.getBlockPointerType(
New);
7204 case MemberPointer: {
7217 return C.getRValueReferenceType(
New);
7221 llvm_unreachable(
"unknown wrapping kind");
7228 Sema &S = State.getSema();
7232 default: llvm_unreachable(
"Unknown attribute kind");
7233 case ParsedAttr::AT_Ptr32:
7236 case ParsedAttr::AT_Ptr64:
7239 case ParsedAttr::AT_SPtr:
7242 case ParsedAttr::AT_UPtr:
7247 std::bitset<attr::LastAttr> Attrs;
7250 if (
const TypedefType *TT = dyn_cast<TypedefType>(Desugared)) {
7251 Desugared = TT->desugar();
7254 const AttributedType *AT = dyn_cast<AttributedType>(Desugared);
7257 Attrs[AT->getAttrKind()] =
true;
7258 Desugared = AT->getModifiedType();
7264 if (Attrs[NewAttrKind]) {
7265 S.
Diag(PAttr.
getLoc(), diag::warn_duplicate_attribute_exact) << PAttr;
7268 Attrs[NewAttrKind] =
true;
7272 if (Attrs[attr::Ptr32] && Attrs[attr::Ptr64]) {
7273 S.
Diag(PAttr.
getLoc(), diag::err_attributes_are_not_compatible)
7275 <<
"'__ptr64'" << 0;
7277 }
else if (Attrs[attr::SPtr] && Attrs[attr::UPtr]) {
7278 S.
Diag(PAttr.
getLoc(), diag::err_attributes_are_not_compatible)
7290 S.
Diag(PAttr.
getLoc(), diag::err_attribute_no_member_pointers) << PAttr;
7292 S.
Diag(PAttr.
getLoc(), diag::err_attribute_pointers_only) << PAttr << 0;
7300 if (PtrWidth == 32) {
7301 if (Attrs[attr::Ptr64])
7303 else if (Attrs[attr::UPtr])
7305 }
else if (PtrWidth == 64 && Attrs[attr::Ptr32]) {
7325 assert(PAttr.
getKind() == ParsedAttr::AT_WebAssemblyFuncref);
7327 Sema &S = State.getSema();
7330 std::bitset<attr::LastAttr> Attrs;
7332 const auto *AT = dyn_cast<AttributedType>(QT);
7334 Attrs[AT->getAttrKind()] =
true;
7335 AT = dyn_cast<AttributedType>(AT->getModifiedType());
7340 if (Attrs[NewAttrKind]) {
7341 S.
Diag(PAttr.
getLoc(), diag::warn_duplicate_attribute_exact) << PAttr;
7347 const auto *Ptr = dyn_cast<PointerType>(Desugared);
7348 if (!Ptr || !Ptr->getPointeeType()->isFunctionType()) {
7349 S.
Diag(PAttr.
getLoc(), diag::err_attribute_webassembly_funcref);
7361 QT = State.getAttributedType(A, QT,
Equivalent);
7370 Sema &S = State.getSema();
7371 auto &D = State.getDeclarator();
7377 if (State.isProcessingDeclSpec()) {
7378 if (!(D.isPrototypeContext() ||
7382 if (
auto *chunk = D.getInnermostNonParenChunk()) {
7405 auto chunkIdx = State.getCurrentChunkIndex();
7406 if (chunkIdx >= 1 &&
7409 D.getTypeObject(chunkIdx - 1).getAttrs());
7414 auto *A = ::new (S.
Context) SwiftAttrAttr(S.
Context, PAttr, Str);
7415 QT = State.getAttributedType(A, QT, QT);
7422 auto Attributed = dyn_cast<AttributedType>(
Type.getTypePtr());
7427 if (Attributed->getImmediateNullability())
7428 return Attributed->getModifiedType();
7432 Ctx, Attributed->getModifiedType());
7433 assert(Modified.
getTypePtr() != Attributed->getModifiedType().getTypePtr());
7435 Attributed->getEquivalentType(),
7436 Attributed->getAttr());
7442 case ParsedAttr::AT_TypeNonNull:
7445 case ParsedAttr::AT_TypeNullable:
7448 case ParsedAttr::AT_TypeNullableResult:
7451 case ParsedAttr::AT_TypeNullUnspecified:
7455 llvm_unreachable(
"not a nullability attribute kind");
7462 bool IsContextSensitive,
bool AllowOnArrayType,
bool OverrideExisting) {
7463 bool Implicit = (State ==
nullptr);
7469 while (
auto *Attributed = dyn_cast<AttributedType>(Desugared.
getTypePtr())) {
7471 if (
auto ExistingNullability = Attributed->getImmediateNullability()) {
7473 if (Nullability == *ExistingNullability) {
7477 S.
Diag(NullabilityLoc, diag::warn_nullability_duplicate)
7484 if (!OverrideExisting) {
7486 S.
Diag(NullabilityLoc, diag::err_nullability_conflicting)
7496 Desugared = Attributed->getModifiedType();
7504 if (Nullability != *ExistingNullability && !
Implicit) {
7505 S.
Diag(NullabilityLoc, diag::err_nullability_conflicting)
7513 if (
auto typedefNullability =
7514 AttributedType::stripOuterNullability(underlyingType)) {
7515 if (*typedefNullability == *ExistingNullability) {
7528 !(AllowOnArrayType && Desugared->
isArrayType())) {
7530 S.
Diag(NullabilityLoc, diag::err_nullability_nonpointer)
7538 if (IsContextSensitive) {
7540 const Type *pointeeType =
nullptr;
7549 S.
Diag(NullabilityLoc, diag::err_nullability_cs_multilevel)
7551 S.
Diag(NullabilityLoc, diag::note_nullability_type_specifier)
7563 QT = State->getAttributedType(A, QT, QT);
7572 bool AllowOnArrayType) {
7578 Nullability, NullabilityLoc,
7579 IsContextSensitive, AllowOnArrayType,
7586 bool AllowArrayTypes,
7587 bool OverrideExisting) {
7589 *
this,
nullptr,
nullptr,
Type, Nullability, DiagLoc,
7590 false, AllowArrayTypes, OverrideExisting);
7598 llvm::APInt MaxSizeForAddrSpace =
7599 llvm::APInt::getMaxValue(
Context.getTargetInfo().getPointerWidth(AS));
7600 std::optional<CharUnits> TSizeInChars =
Context.getTypeSizeInCharsIfKnown(
T);
7601 if (TSizeInChars &&
static_cast<uint64_t
>(TSizeInChars->getQuantity()) >
7602 MaxSizeForAddrSpace.getZExtValue()) {
7604 <<
T << MaxSizeForAddrSpace;
7615 Sema &S = state.getSema();
7619 type = state.getAttributedType(
7632 S.
Diag(
attr.getLoc(), diag::err_objc_kindof_nonobject)
7641 objType->getBaseType(), objType->getTypeArgsAsWritten(),
7642 objType->getProtocols(),
7643 objType->isObjCUnqualifiedId() ?
false :
true);
7648 if (
auto nullability =
type->getNullability()) {
7651 assert(
attr.getAttributeSpellingListIndex() == 0 &&
7652 "multiple spellings for __kindof?");
7655 equivType = state.getAttributedType(A, equivType, equivType);
7660 type = state.getAttributedType(
7673 Declarator &declarator = state.getDeclarator();
7676 auto moveToChunk = [&](
DeclaratorChunk &chunk,
bool inFunction) ->
bool {
7689 PK_MemberFunctionPointer,
7694 : inFunction? PK_MemberFunctionPointer : PK_MemberPointer;
7696 auto diag = state.getSema().Diag(
attr.getLoc(),
7697 diag::warn_nullability_declspec)
7699 attr.isContextSensitiveKeywordAttribute())
7701 <<
static_cast<unsigned>(pointerKind);
7707 state.getSema().getPreprocessor().getLocForEndOfToken(
7709 " " +
attr.getAttrName()->getName().str() +
" ");
7719 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
7721 switch (chunk.
Kind) {
7725 return moveToChunk(chunk,
false);
7737 return moveToChunk(*dest,
true);
7753 assert(!
Attr.isInvalid());
7756 llvm_unreachable(
"not a calling convention attribute");
7757 case ParsedAttr::AT_CDecl:
7759 case ParsedAttr::AT_FastCall:
7761 case ParsedAttr::AT_StdCall:
7763 case ParsedAttr::AT_ThisCall:
7765 case ParsedAttr::AT_RegCall:
7767 case ParsedAttr::AT_Pascal:
7769 case ParsedAttr::AT_SwiftCall:
7771 case ParsedAttr::AT_SwiftAsyncCall:
7773 case ParsedAttr::AT_VectorCall:
7775 case ParsedAttr::AT_AArch64VectorPcs:
7777 case ParsedAttr::AT_AArch64SVEPcs:
7779 case ParsedAttr::AT_ArmStreaming:
7781 case ParsedAttr::AT_Pcs: {
7786 if (
Attr.isArgExpr(0))
7789 Str =
Attr.getArgAsIdent(0)->getIdentifierInfo()->getName();
7790 PcsAttr::PCSType
Type;
7791 if (!PcsAttr::ConvertStrToPCSType(Str,
Type))
7792 llvm_unreachable(
"already validated the attribute");
7793 return ::new (Ctx) PcsAttr(Ctx,
Attr,
Type);
7795 case ParsedAttr::AT_IntelOclBicc:
7797 case ParsedAttr::AT_MSABI:
7799 case ParsedAttr::AT_SysVABI:
7801 case ParsedAttr::AT_PreserveMost:
7803 case ParsedAttr::AT_PreserveAll:
7805 case ParsedAttr::AT_M68kRTD:
7807 case ParsedAttr::AT_PreserveNone:
7809 case ParsedAttr::AT_RISCVVectorCC:
7811 case ParsedAttr::AT_RISCVVLSCC: {
7814 unsigned ABIVLen = 128;
7815 if (
Attr.getNumArgs()) {
7816 std::optional<llvm::APSInt> MaybeABIVLen =
7817 Attr.getArgAsExpr(0)->getIntegerConstantExpr(Ctx);
7819 llvm_unreachable(
"Invalid RISC-V ABI VLEN");
7820 ABIVLen = MaybeABIVLen->getZExtValue();
7823 return ::new (Ctx) RISCVVLSCCAttr(Ctx,
Attr, ABIVLen);
7826 llvm_unreachable(
"unexpected attribute kind!");
7829std::optional<FunctionEffectMode>
7834 std::optional<llvm::APSInt> ConditionValue =
7836 if (!ConditionValue) {
7842 return std::nullopt;
7851 FunctionTypeUnwrapper &Unwrapped) {
7853 if (!Unwrapped.isFunctionType())
7856 Sema &S = TPState.getSema();
7860 if (FPT ==
nullptr) {
7861 S.
Diag(PAttr.
getLoc(), diag::err_func_with_effects_no_prototype)
7868 bool IsNonBlocking = PAttr.
getKind() == ParsedAttr::AT_NonBlocking ||
7869 PAttr.
getKind() == ParsedAttr::AT_Blocking;
7872 Expr *CondExpr =
nullptr;
7874 if (PAttr.
getKind() == ParsedAttr::AT_NonBlocking ||
7875 PAttr.
getKind() == ParsedAttr::AT_NonAllocating) {
7884 std::optional<FunctionEffectMode> MaybeMode =
7890 NewMode = *MaybeMode;
7925 assert(
Success &&
"effect conflicts should have been diagnosed above");
7929 FPT->getParamTypes(), EPI);
7938 auto OtherAttr = llvm::find_if(
7939 state.getCurrentAttributes(),
7940 [OtherKind](
const ParsedAttr &A) { return A.getKind() == OtherKind; });
7941 if (OtherAttr == state.getCurrentAttributes().end() || OtherAttr->isInvalid())
7944 Sema &S = state.getSema();
7946 << *OtherAttr <<
Attr
7947 << (OtherAttr->isRegularKeywordAttribute() ||
7949 S.
Diag(OtherAttr->getLoc(), diag::note_conflicting_attribute);
7957 if (!
Attr.getNumArgs()) {
7963 for (
unsigned I = 0; I <
Attr.getNumArgs(); ++I) {
7964 StringRef StateName;
7969 if (StateName !=
"sme_za_state") {
7970 S.
Diag(LiteralLoc, diag::err_unknown_arm_state) << StateName;
7977 S.
Diag(
Attr.
getLoc(), diag::err_conflicting_attributes_arm_agnostic);
7992 if (!
Attr.getNumArgs()) {
7998 for (
unsigned I = 0; I <
Attr.getNumArgs(); ++I) {
7999 StringRef StateName;
8006 if (StateName ==
"za") {
8009 }
else if (StateName ==
"zt0") {
8013 S.
Diag(LiteralLoc, diag::err_unknown_arm_state) << StateName;
8019 S.
Diag(LiteralLoc, diag::err_conflicting_attributes_arm_agnostic);
8028 S.
Diag(LiteralLoc, diag::err_conflicting_attributes_arm_state)
8044 Sema &S = state.getSema();
8046 FunctionTypeUnwrapper unwrapped(S,
type);
8048 if (
attr.getKind() == ParsedAttr::AT_NoReturn) {
8053 if (!unwrapped.isFunctionType())
8062 if (
attr.getKind() == ParsedAttr::AT_CFIUncheckedCallee) {
8064 if (!unwrapped.isFunctionType())
8067 if (!unwrapped.get()->isFunctionProtoType()) {
8068 S.
Diag(
attr.getLoc(), diag::warn_attribute_wrong_decl_type)
8069 <<
attr <<
attr.isRegularKeywordAttribute()
8077 FPT->getReturnType(), FPT->getParamTypes(),
8078 FPT->getExtProtoInfo().withCFIUncheckedCallee(
true));
8083 if (
attr.getKind() == ParsedAttr::AT_CmseNSCall) {
8085 if (!unwrapped.isFunctionType())
8090 S.
Diag(
attr.getLoc(), diag::warn_attribute_ignored) <<
attr;
8097 unwrapped.get()->getExtInfo().withCmseNSCall(
true);
8104 if (
attr.getKind() == ParsedAttr::AT_NSReturnsRetained) {
8105 if (
attr.getNumArgs())
return true;
8108 if (!unwrapped.isFunctionType())
8113 attr.getLoc(), unwrapped.get()->getReturnType()))
8118 if (state.getSema().getLangOpts().ObjCAutoRefCount) {
8120 = unwrapped.get()->getExtInfo().withProducesResult(
true);
8123 type = state.getAttributedType(
8129 if (
attr.getKind() == ParsedAttr::AT_AnyX86NoCallerSavedRegisters) {
8134 if (!unwrapped.isFunctionType())
8138 unwrapped.get()->getExtInfo().withNoCallerSavedRegs(
true);
8143 if (
attr.getKind() == ParsedAttr::AT_AnyX86NoCfCheck) {
8145 S.
Diag(
attr.getLoc(), diag::warn_nocf_check_attribute_ignored);
8155 if (!unwrapped.isFunctionType())
8159 unwrapped.get()->getExtInfo().withNoCfCheck(
true);
8164 if (
attr.getKind() == ParsedAttr::AT_Regparm) {
8170 if (!unwrapped.isFunctionType())
8177 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8179 <<
attr.isRegularKeywordAttribute();
8185 unwrapped.get()->getExtInfo().withRegParm(value);
8190 if (
attr.getKind() == ParsedAttr::AT_CFISalt) {
8191 if (
attr.getNumArgs() != 1)
8199 if (!unwrapped.isFunctionType())
8204 S.
Diag(
attr.getLoc(), diag::err_attribute_wrong_decl_type)
8205 <<
attr <<
attr.isRegularKeywordAttribute()
8215 FnTy->getParamTypes(), EPI);
8220 if (
attr.getKind() == ParsedAttr::AT_ArmStreaming ||
8221 attr.getKind() == ParsedAttr::AT_ArmStreamingCompatible ||
8222 attr.getKind() == ParsedAttr::AT_ArmPreserves ||
8223 attr.getKind() == ParsedAttr::AT_ArmIn ||
8224 attr.getKind() == ParsedAttr::AT_ArmOut ||
8225 attr.getKind() == ParsedAttr::AT_ArmInOut ||
8226 attr.getKind() == ParsedAttr::AT_ArmAgnostic) {
8230 if (
attr.getKind() == ParsedAttr::AT_ArmStreaming ||
8231 attr.getKind() == ParsedAttr::AT_ArmStreamingCompatible)
8235 if (!unwrapped.isFunctionType())
8242 S.
Diag(
attr.getLoc(), diag::warn_attribute_wrong_decl_type)
8243 <<
attr <<
attr.isRegularKeywordAttribute()
8250 switch (
attr.getKind()) {
8251 case ParsedAttr::AT_ArmStreaming:
8253 ParsedAttr::AT_ArmStreamingCompatible))
8257 case ParsedAttr::AT_ArmStreamingCompatible:
8262 case ParsedAttr::AT_ArmPreserves:
8266 case ParsedAttr::AT_ArmIn:
8270 case ParsedAttr::AT_ArmOut:
8274 case ParsedAttr::AT_ArmInOut:
8278 case ParsedAttr::AT_ArmAgnostic:
8283 llvm_unreachable(
"Unsupported attribute");
8287 FnTy->getParamTypes(), EPI);
8292 if (
attr.getKind() == ParsedAttr::AT_NoThrow) {
8294 if (!unwrapped.isFunctionType())
8307 if (Proto->hasExceptionSpec()) {
8308 switch (Proto->getExceptionSpecType()) {
8310 llvm_unreachable(
"This doesn't have an exception spec!");
8328 S.
Diag(
attr.getLoc(), diag::warn_nothrow_attribute_ignored);
8334 type = unwrapped.wrap(
8343 if (
attr.getKind() == ParsedAttr::AT_NonBlocking ||
8344 attr.getKind() == ParsedAttr::AT_NonAllocating ||
8345 attr.getKind() == ParsedAttr::AT_Blocking ||
8346 attr.getKind() == ParsedAttr::AT_Allocating) {
8351 if (!unwrapped.isFunctionType())
return false;
8366 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8369 <<
attr.isRegularKeywordAttribute();
8388 return S.
Diag(
attr.getLoc(), diag::warn_cconv_unsupported)
8393 return S.
Diag(
attr.getLoc(), diag::err_cconv_varargs)
8400 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8402 <<
attr.isRegularKeywordAttribute();
8414 auto EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
8423 const AttributedType *AT;
8427 while ((AT =
T->getAs<AttributedType>()) &&
8429 if (AT->isCallingConv())
8431 T = AT->getModifiedType();
8438 FunctionTypeUnwrapper Unwrapped(*
this,
T);
8444 Context.getDefaultCallingConvention(IsVariadic, HasThisPointer);
8451 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() && IsCtorOrDtor) {
8455 Diag(Loc, diag::warn_cconv_unsupported)
8464 Context.getDefaultCallingConvention(IsVariadic, !HasThisPointer);
8466 if (CurCC != DefaultCC)
8474 QualType Wrapped = Unwrapped.wrap(*
this, FT);
8475 T =
Context.getAdjustedType(
T, Wrapped);
8488 if (
Attr.getNumArgs() != 1) {
8495 Expr *SizeExpr =
Attr.getArgAsExpr(0);
8508 if (
Attr.getNumArgs() != 1) {
8514 Expr *SizeExpr =
Attr.getArgAsExpr(0);
8529 bool IsPolyUnsigned = Triple.getArch() == llvm::Triple::aarch64 ||
8530 Triple.getArch() == llvm::Triple::aarch64_32 ||
8531 Triple.getArch() == llvm::Triple::aarch64_be;
8533 if (IsPolyUnsigned) {
8535 return BTy->
getKind() == BuiltinType::UChar ||
8536 BTy->
getKind() == BuiltinType::UShort ||
8537 BTy->
getKind() == BuiltinType::ULong ||
8538 BTy->
getKind() == BuiltinType::ULongLong;
8541 return BTy->
getKind() == BuiltinType::SChar ||
8542 BTy->
getKind() == BuiltinType::Short ||
8543 BTy->
getKind() == BuiltinType::LongLong;
8549 if ((Triple.isArch64Bit() || Triple.getArch() == llvm::Triple::aarch64_32) &&
8550 BTy->
getKind() == BuiltinType::Double)
8553 return BTy->
getKind() == BuiltinType::SChar ||
8554 BTy->
getKind() == BuiltinType::UChar ||
8555 BTy->
getKind() == BuiltinType::Short ||
8556 BTy->
getKind() == BuiltinType::UShort ||
8557 BTy->
getKind() == BuiltinType::Int ||
8558 BTy->
getKind() == BuiltinType::UInt ||
8559 BTy->
getKind() == BuiltinType::Long ||
8560 BTy->
getKind() == BuiltinType::ULong ||
8561 BTy->
getKind() == BuiltinType::LongLong ||
8562 BTy->
getKind() == BuiltinType::ULongLong ||
8563 BTy->
getKind() == BuiltinType::Float ||
8564 BTy->
getKind() == BuiltinType::Half ||
8565 BTy->
getKind() == BuiltinType::BFloat16 ||
8566 BTy->
getKind() == BuiltinType::MFloat8;
8571 const auto *AttrExpr =
Attr.getArgAsExpr(0);
8572 if (!AttrExpr->isTypeDependent()) {
8573 if (std::optional<llvm::APSInt> Res =
8574 AttrExpr->getIntegerConstantExpr(S.
Context)) {
8616 if (
Attr.getNumArgs() != 1) {
8617 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8623 llvm::APSInt numEltsInt(32);
8629 S.
Diag(
Attr.
getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
8636 unsigned numElts =
static_cast<unsigned>(numEltsInt.getZExtValue());
8637 unsigned vecSize = typeSize * numElts;
8638 if (vecSize != 64 && vecSize != 128) {
8639 S.
Diag(
Attr.
getLoc(), diag::err_attribute_bad_neon_vector_size) << CurType;
8651 assert((
Attr.getNumArgs() > 0 &&
Attr.getNumArgs() <= 3) &&
8652 "__ptrauth qualifier takes between 1 and 3 arguments");
8653 Expr *KeyArg =
Attr.getArgAsExpr(0);
8654 Expr *IsAddressDiscriminatedArg =
8655 Attr.getNumArgs() >= 2 ?
Attr.getArgAsExpr(1) :
nullptr;
8656 Expr *ExtraDiscriminatorArg =
8657 Attr.getNumArgs() >= 3 ?
Attr.getArgAsExpr(2) :
nullptr;
8666 bool IsInvalid =
false;
8667 unsigned IsAddressDiscriminated, ExtraDiscriminator;
8670 IsAddressDiscriminated);
8679 if (!
T->isSignableType(Ctx) && !
T->isDependentType()) {
8680 S.
Diag(
Attr.
getLoc(), diag::err_ptrauth_qualifier_invalid_target) <<
T;
8685 if (
T.getPointerAuth()) {
8697 assert((!IsAddressDiscriminatedArg || IsAddressDiscriminated <= 1) &&
8698 "address discriminator arg should be either 0 or 1");
8700 Key, IsAddressDiscriminated, ExtraDiscriminator,
8722 S.
Diag(
Attr.
getLoc(), diag::err_attribute_arm_feature_sve_bits_unsupported)
8729 if (
Attr.getNumArgs() != 1) {
8730 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8737 llvm::APSInt SveVectorSizeInBits(32);
8741 unsigned VecSize =
static_cast<unsigned>(SveVectorSizeInBits.getZExtValue());
8764 if (BT->getKind() == BuiltinType::SveBool) {
8769 VecSize /= TypeSize;
8776 const VectorType *VT = dyn_cast<VectorType>(CurType);
8779 diag::err_attribute_arm_mve_polymorphism);
8786 State.getSema().Context,
Attr),
8798 <<
Attr <<
"'zve32x'";
8805 if (!VScale || !VScale->first || VScale->first != VScale->second) {
8806 S.
Diag(
Attr.
getLoc(), diag::err_attribute_riscv_rvv_bits_unsupported)
8813 if (
Attr.getNumArgs() != 1) {
8814 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8821 llvm::APSInt RVVVectorSizeInBits(32);
8833 unsigned VecSize =
static_cast<unsigned>(RVVVectorSizeInBits.getZExtValue());
8837 unsigned MinElts = Info.
EC.getKnownMinValue();
8840 unsigned ExpectedSize = VScale->first * MinElts;
8862 ExpectedSize *= EltSize;
8863 NumElts = VecSize / EltSize;
8867 if (VecSize != ExpectedSize) {
8869 << VecSize << ExpectedSize;
8882 S.
Diag(
Attr.
getLoc(), diag::err_opencl_invalid_access_qualifier);
8888 QualType BaseTy = TypedefTy->desugar();
8890 std::string PrevAccessQual;
8892 if (TypedefTy->getDecl()->hasAttr<OpenCLAccessAttr>()) {
8893 OpenCLAccessAttr *
Attr =
8894 TypedefTy->getDecl()->getAttr<OpenCLAccessAttr>();
8897 PrevAccessQual =
"read_only";
8901 switch (ImgType->getKind()) {
8902 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8903 case BuiltinType::Id: \
8904 PrevAccessQual = #Access; \
8906 #include "clang/Basic/OpenCLImageTypes.def"
8908 llvm_unreachable(
"Unable to find corresponding image type.");
8911 llvm_unreachable(
"unexpected type");
8914 if (PrevAccessQual == AttrName.ltrim(
"_")) {
8920 S.
Diag(
Attr.
getLoc(), diag::err_opencl_multiple_access_qualifiers);
8923 S.
Diag(TypedefTy->getDecl()->getBeginLoc(),
8924 diag::note_opencl_typedef_access_qualifier) << PrevAccessQual;
8926 if (
Attr.getSemanticSpelling() == OpenCLAccessAttr::Keyword_write_only) {
8941 if (
Attr.getNumArgs() != 2) {
8942 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
8947 Expr *RowsExpr =
Attr.getArgAsExpr(0);
8948 Expr *ColsExpr =
Attr.getArgAsExpr(1);
8956 Sema &S = State.getSema();
8959 S.
Diag(PA.
getLoc(), diag::err_attribute_too_few_arguments) << PA << 1;
8971 for (
unsigned Idx = 1; Idx < PA.
getNumArgs(); Idx++) {
8977 auto *AnnotateTypeAttr =
8978 AnnotateTypeAttr::Create(S.
Context, Str, Args.data(), Args.size(), PA);
8979 CurType = State.getAttributedType(AnnotateTypeAttr, CurType, CurType);
8985 if (State.getDeclarator().isDeclarationOfFunction()) {
8986 CurType = State.getAttributedType(
8991 State.getSema().Diag(
Attr.
getLoc(), diag::err_attribute_wrong_decl_type)
8998 if (State.getDeclarator().isDeclarationOfFunction()) {
8999 auto *
Attr = State.getSema().ParseLifetimeCaptureByAttr(PA,
"this");
9001 CurType = State.getAttributedType(
Attr, CurType, CurType);
9013 if (
Attr.getSemanticSpelling() == HLSLParamModifierAttr::Keyword_inout ||
9014 Attr.getSemanticSpelling() == HLSLParamModifierAttr::Keyword_out) {
9015 State.setParsedHLSLParamMod(
true);
9024 state.setParsedNoDeref(
false);
9040 if (
attr.isInvalid())
9043 if (
attr.isStandardAttributeSyntax() ||
attr.isRegularKeywordAttribute()) {
9048 if (
attr.isGNUScope()) {
9049 assert(
attr.isStandardAttributeSyntax());
9050 bool IsTypeAttr =
attr.isTypeAttr();
9052 state.getSema().Diag(
attr.getLoc(),
9054 ? diag::warn_gcc_ignores_type_attr
9055 : diag::warn_cxx11_gnu_attribute_on_type)
9061 !
attr.isTypeAttr()) {
9074 switch (
attr.getKind()) {
9077 if ((
attr.isStandardAttributeSyntax() ||
9078 attr.isRegularKeywordAttribute()) &&
9080 state.getSema().Diag(
attr.getLoc(), diag::err_attribute_not_type_attr)
9081 <<
attr <<
attr.isRegularKeywordAttribute();
9082 attr.setUsedAsTypeAttr();
9087 if (
attr.isStandardAttributeSyntax()) {
9088 state.getSema().DiagnoseUnknownAttribute(
attr);
9098 case ParsedAttr::AT_BTFTypeTag:
9100 attr.setUsedAsTypeAttr();
9103 case ParsedAttr::AT_MayAlias:
9106 attr.setUsedAsTypeAttr();
9108 case ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace:
9109 case ParsedAttr::AT_OpenCLGlobalHostAddressSpace:
9110 state.getSema().Diag(
attr.getLoc(), diag::warn_deprecated_attribute)
9113 case ParsedAttr::AT_OpenCLPrivateAddressSpace:
9114 case ParsedAttr::AT_OpenCLGlobalAddressSpace:
9115 case ParsedAttr::AT_OpenCLLocalAddressSpace:
9116 case ParsedAttr::AT_OpenCLConstantAddressSpace:
9117 case ParsedAttr::AT_OpenCLGenericAddressSpace:
9118 case ParsedAttr::AT_AddressSpace:
9120 attr.setUsedAsTypeAttr();
9122 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
9125 if (state.getSema().getLangOpts().getHLSLVersion() <
9127 state.getSema().Diag(
attr.getLoc(), diag::warn_hlsl_groupshared_202x);
9134 attr.setUsedAsTypeAttr();
9136 case ParsedAttr::AT_HLSLRowMajor:
9137 case ParsedAttr::AT_HLSLColumnMajor:
9139 state.getSema().HLSL().buildMatrixLayoutTypeAttr(
type,
attr))
9141 attr.setUsedAsTypeAttr();
9146 attr.setUsedAsTypeAttr();
9148 case ParsedAttr::AT_VectorSize:
9150 attr.setUsedAsTypeAttr();
9152 case ParsedAttr::AT_ExtVectorType:
9154 attr.setUsedAsTypeAttr();
9156 case ParsedAttr::AT_NeonVectorType:
9158 attr.setUsedAsTypeAttr();
9160 case ParsedAttr::AT_NeonPolyVectorType:
9163 attr.setUsedAsTypeAttr();
9165 case ParsedAttr::AT_ArmSveVectorBits:
9167 attr.setUsedAsTypeAttr();
9169 case ParsedAttr::AT_ArmMveStrictPolymorphism: {
9171 attr.setUsedAsTypeAttr();
9174 case ParsedAttr::AT_RISCVRVVVectorBits:
9176 attr.setUsedAsTypeAttr();
9178 case ParsedAttr::AT_OpenCLAccess:
9180 attr.setUsedAsTypeAttr();
9182 case ParsedAttr::AT_PointerAuth:
9185 attr.setUsedAsTypeAttr();
9187 case ParsedAttr::AT_LifetimeBound:
9191 case ParsedAttr::AT_LifetimeCaptureBy:
9195 case ParsedAttr::AT_OverflowBehavior:
9197 attr.setUsedAsTypeAttr();
9200 case ParsedAttr::AT_NoDeref: {
9205 if (
attr.isStandardAttributeSyntax()) {
9206 state.getSema().Diag(
attr.getLoc(), diag::warn_attribute_ignored)
9213 attr.setUsedAsTypeAttr();
9214 state.setParsedNoDeref(
true);
9218 case ParsedAttr::AT_MatrixType:
9220 attr.setUsedAsTypeAttr();
9223 case ParsedAttr::AT_WebAssemblyFuncref: {
9225 attr.setUsedAsTypeAttr();
9229 case ParsedAttr::AT_HLSLParamModifier: {
9231 if (attrs.
hasAttribute(ParsedAttr::AT_HLSLGroupSharedAddressSpace)) {
9232 state.getSema().Diag(
attr.getLoc(), diag::err_hlsl_attr_incompatible)
9233 <<
attr <<
"'groupshared'";
9237 attr.setUsedAsTypeAttr();
9241 case ParsedAttr::AT_SwiftAttr: {
9248 attr.setUsedAsTypeAttr();
9256 if (
type->canHaveNullability() ||
type->isDependentType() ||
9257 type->isArrayType() ||
9261 endIndex = state.getCurrentChunkIndex();
9263 endIndex = state.getDeclarator().getNumTypeObjects();
9264 bool allowOnArrayType =
9265 state.getDeclarator().isPrototypeContext() &&
9268 allowOnArrayType)) {
9272 attr.setUsedAsTypeAttr();
9276 case ParsedAttr::AT_ObjCKindOf:
9284 state.getSema().Diag(
attr.getLoc(),
9285 diag::err_objc_kindof_wrong_position)
9288 state.getDeclarator().getDeclSpec().getBeginLoc(),
9298 case ParsedAttr::AT_NoThrow:
9301 if (!state.getSema().getLangOpts().CPlusPlus)
9306 attr.setUsedAsTypeAttr();
9310 if (
attr.isStandardAttributeSyntax() ||
9311 attr.isRegularKeywordAttribute()) {
9328 case ParsedAttr::AT_AcquireHandle: {
9329 if (!
type->isFunctionType())
9332 if (
attr.getNumArgs() != 1) {
9333 state.getSema().Diag(
attr.getLoc(),
9334 diag::err_attribute_wrong_number_arguments)
9340 StringRef HandleType;
9341 if (!state.getSema().checkStringLiteralArgumentAttr(
attr, 0, HandleType))
9343 type = state.getAttributedType(
9344 AcquireHandleAttr::Create(state.getSema().Context, HandleType,
attr),
9346 attr.setUsedAsTypeAttr();
9349 case ParsedAttr::AT_AnnotateType: {
9351 attr.setUsedAsTypeAttr();
9354 case ParsedAttr::AT_HLSLResourceClass:
9355 case ParsedAttr::AT_HLSLResourceDimension:
9356 case ParsedAttr::AT_HLSLROV:
9357 case ParsedAttr::AT_HLSLRawBuffer:
9358 case ParsedAttr::AT_HLSLIsArray:
9359 case ParsedAttr::AT_HLSLIsMultiSampled:
9360 case ParsedAttr::AT_HLSLContainedType: {
9365 state.getSema().HLSL().handleResourceTypeAttr(
type,
attr))
9366 attr.setUsedAsTypeAttr();
9374 !
type.getQualifiers().hasObjCLifetime() &&
9375 !
type.getQualifiers().hasObjCGCAttr() &&
9376 attr.getKind() != ParsedAttr::AT_ObjCGC &&
9377 attr.getKind() != ParsedAttr::AT_ObjCOwnership) {
9379 type = state.getSema().Context.getMacroQualifiedType(
type, MacroII);
9380 state.setExpansionLocForMacroQualifiedType(
9382 attr.getMacroExpansionLoc());
9389 if (
VarDecl *Var = dyn_cast<VarDecl>(DRE->getDecl())) {
9391 auto *Def = Var->getDefinition();
9397 Def = Var->getDefinition();
9404 if (Var->getPointOfInstantiation().isInvalid() && Def) {
9405 assert(Var->getTemplateSpecializationKind() ==
9407 "explicit instantiation with no point of instantiation");
9408 Var->setTemplateSpecializationKind(
9409 Var->getTemplateSpecializationKind(), PointOfInstantiation);
9429 if (
const auto CastE = dyn_cast<ExplicitCastExpr>(E)) {
9430 QualType DestType = CastE->getTypeAsWritten();
9431 if (
const auto *IAT =
Context.getAsIncompleteArrayType(DestType)) {
9436 IAT->getElementType(),
9473 if (RequireCompleteTypeImpl(Loc,
T, Kind, &Diagnoser))
9475 if (
auto *TD =
T->getAsTagDecl(); TD && !TD->isCompleteDefinitionRequired()) {
9476 TD->setCompleteDefinitionRequired();
9477 Consumer.HandleTagDeclRequiredDefinition(TD);
9510 auto DefinitionIsAcceptable = [&](
NamedDecl *D) {
9530 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
9531 return RD->isThisDeclarationADefinition();
9532 if (
auto *ED = dyn_cast<EnumDecl>(D))
9533 return ED->isThisDeclarationADefinition();
9534 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9535 return FD->isThisDeclarationADefinition();
9536 if (
auto *VD = dyn_cast<VarDecl>(D))
9538 llvm_unreachable(
"unexpected decl type");
9540 auto FoundAcceptableDefinition = [&](
NamedDecl *D) {
9542 return DefinitionIsAcceptable(D);
9550 return DefinitionIsAcceptable(D);
9552 for (
auto *RD : D->
redecls()) {
9554 if (!IsDefinition(ND))
9556 if (DefinitionIsAcceptable(ND)) {
9565 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
9566 if (
auto *Pattern = RD->getTemplateInstantiationPattern())
9568 D = RD->getDefinition();
9569 }
else if (
auto *ED = dyn_cast<EnumDecl>(D)) {
9570 if (
auto *Pattern = ED->getTemplateInstantiationPattern())
9572 if (OnlyNeedComplete && (ED->isFixed() ||
getLangOpts().MSVCCompat)) {
9578 *Suggested =
nullptr;
9579 for (
auto *Redecl : ED->redecls()) {
9582 if (Redecl->isThisDeclarationADefinition() ||
9583 (Redecl->isCanonicalDecl() && !*Suggested))
9584 *Suggested = Redecl;
9589 D = ED->getDefinition();
9590 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
9591 if (
auto *Pattern = FD->getTemplateInstantiationPattern())
9593 D = FD->getDefinition();
9594 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
9595 if (
auto *Pattern = VD->getTemplateInstantiationPattern())
9597 D = VD->getDefinition();
9600 assert(D &&
"missing definition for pattern of instantiated definition");
9604 if (FoundAcceptableDefinition(D))
9609 if (
auto *Source =
Context.getExternalSource()) {
9610 Source->CompleteRedeclChain(D);
9611 return FoundAcceptableDefinition(D);
9627 bool OnlyNeedComplete) {
9644 bool OnlyNeedComplete) {
9652 if (!RD->
hasAttr<MSInheritanceAttr>()) {
9654 bool BestCase =
false;
9674 RD->
addAttr(MSInheritanceAttr::CreateImplicit(
9675 S.
getASTContext(), BestCase, Loc, MSInheritanceAttr::Spelling(IM)));
9681 CompleteTypeKind Kind,
9682 TypeDiagnoser *Diagnoser) {
9691 if (
const auto *MPTy = dyn_cast<MemberPointerType>(
T.getCanonicalType())) {
9692 if (CXXRecordDecl *RD = MPTy->getMostRecentCXXRecordDecl();
9693 RD && !RD->isDependentType()) {
9695 if (
getLangOpts().CompleteMemberPointers && !RD->isBeingDefined() &&
9701 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
9708 NamedDecl *Def =
nullptr;
9720 NamedDecl *Suggested =
nullptr;
9726 if (Diagnoser && Suggested)
9729 return !TreatAsComplete;
9734 TagDecl *
Tag = dyn_cast_or_null<TagDecl>(Def);
9735 ObjCInterfaceDecl *IFace = dyn_cast_or_null<ObjCInterfaceDecl>(Def);
9747 if (
auto *Source =
Context.getExternalSource()) {
9748 if (Tag &&
Tag->hasExternalLexicalStorage())
9749 Source->CompleteType(Tag);
9751 Source->CompleteType(IFace);
9755 return RequireCompleteTypeImpl(Loc,
T, Kind, Diagnoser);
9762 if (
auto *RD = dyn_cast_or_null<CXXRecordDecl>(Tag)) {
9763 bool Instantiated =
false;
9764 bool Diagnosed =
false;
9765 if (RD->isDependentContext()) {
9769 }
else if (
auto *ClassTemplateSpec =
9770 dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
9771 if (ClassTemplateSpec->getSpecializationKind() ==
TSK_Undeclared) {
9775 Diagnoser, ClassTemplateSpec->hasStrictPackMatch());
9777 Instantiated =
true;
9780 CXXRecordDecl *Pattern = RD->getInstantiatedFromMemberClass();
9781 if (!RD->isBeingDefined() && Pattern) {
9782 MemberSpecializationInfo *MSI = RD->getMemberSpecializationInfo();
9783 assert(MSI &&
"Missing member specialization information?");
9793 Instantiated =
true;
9801 if (Diagnoser && Diagnosed)
9807 return RequireCompleteTypeImpl(Loc,
T, Kind, Diagnoser);
9817 Diagnoser->diagnose(*
this, Loc,
T);
9821 if (Tag && !
Tag->isInvalidDecl() && !
Tag->getLocation().isInvalid())
9822 Diag(
Tag->getLocation(),
Tag->isBeingDefined()
9823 ? diag::note_type_being_defined
9824 : diag::note_forward_declaration)
9825 <<
Context.getCanonicalTagType(Tag);
9858 default: llvm_unreachable(
"Invalid tag kind for literal type diagnostic!");
9864 assert(!
T->isDependentType() &&
"type should not be dependent");
9873 if (
T->isVariableArrayType())
9889 Diag(RD->getLocation(), diag::note_non_literal_lambda);
9898 Diag(RD->getLocation(), diag::note_non_literal_virtual_base)
9900 for (
const auto &I : RD->vbases())
9901 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
9902 << I.getSourceRange();
9903 }
else if (!RD->isAggregate() && !RD->hasConstexprNonCopyMoveConstructor() &&
9904 !RD->hasTrivialDefaultConstructor()) {
9905 Diag(RD->getLocation(), diag::note_non_literal_no_constexpr_ctors) << RD;
9906 }
else if (RD->hasNonLiteralTypeFieldsOrBases()) {
9907 for (
const auto &I : RD->bases()) {
9908 if (!I.getType()->isLiteralType(
Context)) {
9909 Diag(I.getBeginLoc(), diag::note_non_literal_base_class)
9910 << RD << I.getType() << I.getSourceRange();
9914 for (
const auto *I : RD->fields()) {
9915 if (!I->getType()->isLiteralType(
Context) ||
9916 I->getType().isVolatileQualified()) {
9917 Diag(I->getLocation(), diag::note_non_literal_field)
9918 << RD << I << I->getType()
9919 << I->getType().isVolatileQualified();
9924 : !RD->hasTrivialDestructor()) {
9929 assert(Dtor &&
"class has literal fields and bases but no dtor?");
9934 Diag(Dtor->getLocation(), diag::note_non_literal_non_constexpr_dtor)
9937 Diag(Dtor->getLocation(), Dtor->isUserProvided()
9938 ? diag::note_non_literal_user_provided_dtor
9939 : diag::note_non_literal_nontrivial_dtor)
9941 if (!Dtor->isUserProvided())
9965 if (
const TagType *TT =
T->getAs<TagType>())
9968 return Context.getTypeOfExprType(E, Kind);
9989 return Context.getCountAttributedType(WrappedTy, CountExpr, CountInBytes,
9999 if (
auto *ImplCastExpr = dyn_cast<ImplicitCastExpr>(E))
10000 IDExpr = ImplCastExpr->getSubExpr();
10002 if (
auto *PackExpr = dyn_cast<PackIndexingExpr>(E)) {
10004 IDExpr = PackExpr->getPackIdExpression();
10006 IDExpr = PackExpr->getSelectedExpr();
10022 if (
const auto *SNTTPE = dyn_cast<SubstNonTypeTemplateParmExpr>(IDExpr))
10023 IDExpr = SNTTPE->getReplacement();
10031 if (
const auto *DRE = dyn_cast<DeclRefExpr>(IDExpr)) {
10036 if (
const auto *ME = dyn_cast<MemberExpr>(IDExpr)) {
10037 if (
const auto *VD = ME->getMemberDecl())
10039 return VD->getType();
10040 }
else if (
const auto *IR = dyn_cast<ObjCIvarRefExpr>(IDExpr)) {
10041 return IR->getDecl()->getType();
10042 }
else if (
const auto *PR = dyn_cast<ObjCPropertyRefExpr>(IDExpr)) {
10043 if (PR->isExplicitProperty())
10044 return PR->getExplicitProperty()->getType();
10045 }
else if (
const auto *PE = dyn_cast<PredefinedExpr>(IDExpr)) {
10046 return PE->getType();
10057 if (
auto *DRE = dyn_cast<DeclRefExpr>(IDExpr->
IgnoreParens())) {
10058 if (
auto *Var = dyn_cast<VarDecl>(DRE->getDecl())) {
10061 return Context.getLValueReferenceType(
T);
10066 return Context.getReferenceQualifiedType(E);
10078 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
10091 Diag(Loc, diag::err_expected_name_of_pack) << Pattern;
10095 if (!
Type.isNull())
10097 : diag::ext_pack_indexing);
10104 bool FullySubstituted,
10109 llvm::APSInt
Value;
10116 IndexExpr = Res.
get();
10117 uint64_t
V =
Value.getZExtValue();
10118 if (FullySubstituted &&
V >= Expansions.size()) {
10120 <<
V << Pattern << Expansions.size();
10123 Index =
static_cast<unsigned>(
V);
10126 return Context.getPackIndexingType(Pattern, IndexExpr, FullySubstituted,
10127 Expansions, Index);
10132 assert(BaseType->isEnumeralType());
10133 EnumDecl *ED = BaseType->castAs<EnumType>()->getDecl();
10138 if (Underlying.
isNull()) {
10140 assert(!Underlying.
isNull());
10148 if (!BaseType->isEnumeralType()) {
10149 Diag(Loc, diag::err_only_enums_have_underlying_types);
10156 if (BaseType->isIncompleteType(&FwdDecl)) {
10157 Diag(Loc, diag::err_underlying_type_of_incomplete_enum) << BaseType;
10158 Diag(FwdDecl->
getLocation(), diag::note_forward_declaration) << FwdDecl;
10166 QualType Pointer = BaseType.isReferenceable() || BaseType->isVoidType()
10175 if (!BaseType->isAnyPointerType())
10184 return Context.getDecayedType(Underlying);
10193 Split.Quals.removeCVRQualifiers();
10194 return Context.getQualifiedType(Split);
10201 BaseType.isReferenceable()
10203 UKind == UnaryTransformType::AddLvalueReference,
10211 if (UKind == UnaryTransformType::RemoveAllExtents)
10212 return Context.getBaseElementType(BaseType);
10214 if (
const auto *AT =
Context.getAsArrayType(BaseType))
10215 return AT->getElementType();
10223 QualType T = BaseType.getNonReferenceType();
10224 if (UKind == UTTKind::RemoveCVRef &&
10225 (
T.isConstQualified() ||
T.isVolatileQualified())) {
10230 T =
Context.getQualifiedType(Unqual, Quals);
10237 if ((BaseType->isReferenceType() && UKind != UTTKind::RemoveRestrict) ||
10238 BaseType->isFunctionType())
10244 if (UKind == UTTKind::RemoveConst || UKind == UTTKind::RemoveCV)
10246 if (UKind == UTTKind::RemoveVolatile || UKind == UTTKind::RemoveCV)
10248 if (UKind == UTTKind::RemoveRestrict)
10251 return Context.getQualifiedType(Unqual, Quals);
10257 if (BaseType->isEnumeralType()) {
10259 if (
auto *
BitInt = dyn_cast<BitIntType>(Underlying)) {
10260 unsigned int Bits =
BitInt->getNumBits();
10264 S.
Diag(Loc, diag::err_make_signed_integral_only)
10265 << IsMakeSigned <<
true << BaseType << 1 << Underlying;
10269 S.
Diag(Loc, diag::err_make_signed_integral_only)
10270 << IsMakeSigned <<
false << BaseType << 1
10277 std::array<CanQualType *, 6> AllSignedIntegers = {
10281 AllSignedIntegers.data(), AllSignedIntegers.size() - Int128Unsupported);
10282 std::array<CanQualType *, 6> AllUnsignedIntegers = {
10287 AllUnsignedIntegers.size() -
10288 Int128Unsupported);
10290 IsMakeSigned ? &AvailableSignedIntegers : &AvailableUnsignedIntegers;
10294 llvm::find_if(*Consider, [&S, BaseSize](
const CanQual<Type> *
T) {
10298 assert(
Result != Consider->end());
10299 return QualType((*Result)->getTypePtr(), 0);
10304 bool IsMakeSigned = UKind == UnaryTransformType::MakeSigned;
10305 if ((!BaseType->isIntegerType() && !BaseType->isEnumeralType()) ||
10306 BaseType->isBooleanType() ||
10307 (BaseType->isBitIntType() &&
10309 Diag(Loc, diag::err_make_signed_integral_only)
10310 << IsMakeSigned << BaseType->isBitIntType() << BaseType << 0;
10314 bool IsNonIntIntegral =
10315 BaseType->
isChar16Type() || BaseType->isChar32Type() ||
10316 BaseType->isWideCharType() || BaseType->isEnumeralType();
10321 : IsMakeSigned ?
Context.getCorrespondingSignedType(BaseType)
10322 :
Context.getCorrespondingUnsignedType(BaseType);
10323 if (Underlying.
isNull())
10330 if (BaseType->isDependentType())
10331 return Context.getUnaryTransformType(BaseType, BaseType, UKind);
10334 case UnaryTransformType::EnumUnderlyingType: {
10338 case UnaryTransformType::AddPointer: {
10342 case UnaryTransformType::RemovePointer: {
10346 case UnaryTransformType::Decay: {
10350 case UnaryTransformType::AddLvalueReference:
10351 case UnaryTransformType::AddRvalueReference: {
10355 case UnaryTransformType::RemoveAllExtents:
10356 case UnaryTransformType::RemoveExtent: {
10360 case UnaryTransformType::RemoveCVRef:
10361 case UnaryTransformType::RemoveReference: {
10365 case UnaryTransformType::RemoveConst:
10366 case UnaryTransformType::RemoveCV:
10367 case UnaryTransformType::RemoveRestrict:
10368 case UnaryTransformType::RemoveVolatile: {
10372 case UnaryTransformType::MakeSigned:
10373 case UnaryTransformType::MakeUnsigned: {
10391 int DisallowedKind = -1;
10392 if (
T->isArrayType())
10393 DisallowedKind = 1;
10394 else if (
T->isFunctionType())
10395 DisallowedKind = 2;
10396 else if (
T->isReferenceType())
10397 DisallowedKind = 3;
10398 else if (
T->isAtomicType())
10399 DisallowedKind = 4;
10400 else if (
T.hasQualifiers())
10401 DisallowedKind = 5;
10402 else if (
T->isSizelessType())
10403 DisallowedKind = 6;
10406 DisallowedKind = 7;
10407 else if (
T->isBitIntType())
10408 DisallowedKind = 8;
10411 DisallowedKind = 9;
10413 if (DisallowedKind != -1) {
10414 Diag(Loc, diag::err_atomic_specifier_bad_type) << DisallowedKind <<
T;
Defines the clang::ASTContext interface.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
Result
Implement __builtin_bit_cast and related operations.
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.
static StringRef getTriple(const Command &Job)
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
Defines the clang::Preprocessor interface.
static QualType getUnderlyingType(const SubRegion *R)
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
static void HandleNeonVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S, VectorKind VecKind)
HandleNeonVectorTypeAttr - The "neon_vector_type" and "neon_polyvector_type" attributes are used to c...
static QualType deduceOpenCLPointeeAddrSpace(Sema &S, QualType PointeeType)
static bool isPermittedNeonBaseType(QualType &Ty, VectorKind VecKind, Sema &S)
static void distributeObjCPointerTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType type)
Given that an objc_gc attribute was written somewhere on a declaration other than on the declarator i...
static void maybeSynthesizeBlockSignature(TypeProcessingState &state, QualType declSpecType)
Add a synthetic '()' to a block-literal declarator if it is required, given the return type.
#define MS_TYPE_ATTRS_CASELIST
#define CALLING_CONV_ATTRS_CASELIST
static void emitNullabilityConsistencyWarning(Sema &S, SimplePointerKind PointerKind, SourceLocation PointerLoc, SourceLocation PointerEndLoc)
static void fixItNullability(Sema &S, DiagBuilderT &Diag, SourceLocation PointerLoc, NullabilityKind Nullability)
Creates a fix-it to insert a C-style nullability keyword at pointerLoc, taking into account whitespac...
static ExprResult checkArraySize(Sema &S, Expr *&ArraySize, llvm::APSInt &SizeVal, unsigned VLADiag, bool VLAIsError)
Check whether the specified array bound can be evaluated using the relevant language rules.
static Attr * createNullabilityAttr(ASTContext &Ctx, ParsedAttr &Attr, NullabilityKind NK)
static void HandleVectorSizeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S)
HandleVectorSizeAttribute - this attribute is only applicable to integral and float scalars,...
static void inferARCWriteback(TypeProcessingState &state, QualType &declSpecType)
Given that this is the declaration of a parameter under ARC, attempt to infer attributes and such for...
static TypeSourceInfo * GetTypeSourceInfoForDeclarator(TypeProcessingState &State, QualType T, TypeSourceInfo *ReturnTypeInfo)
Create and instantiate a TypeSourceInfo with type source information.
static bool BuildAddressSpaceIndex(Sema &S, LangAS &ASIdx, const Expr *AddrSpace, SourceLocation AttrLoc)
Build an AddressSpace index from a constant expression and diagnose any errors related to invalid add...
static void HandleBTFTypeTagAttribute(QualType &Type, const ParsedAttr &Attr, TypeProcessingState &State)
static void transferARCOwnershipToDeclaratorChunk(TypeProcessingState &state, Qualifiers::ObjCLifetime ownership, unsigned chunkIndex)
static bool handleObjCGCTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type)
handleObjCGCTypeAttr - Process the attribute((objc_gc)) type attribute on the specified type.
static void fillAtomicQualLoc(AtomicTypeLoc ATL, const DeclaratorChunk &Chunk)
static void HandleExtVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S)
Process the OpenCL-like ext_vector_type attribute when it occurs on a type.
static void HandleHLSLParamModifierAttr(TypeProcessingState &State, QualType &CurType, const ParsedAttr &Attr, Sema &S)
static void HandleLifetimeBoundAttr(TypeProcessingState &State, QualType &CurType, ParsedAttr &Attr)
static bool handleArmStateAttribute(Sema &S, FunctionProtoType::ExtProtoInfo &EPI, ParsedAttr &Attr, FunctionType::ArmStateValue State)
static bool handleArmAgnosticAttribute(Sema &S, FunctionProtoType::ExtProtoInfo &EPI, ParsedAttr &Attr)
static void distributeFunctionTypeAttrFromDeclSpec(TypeProcessingState &state, ParsedAttr &attr, QualType &declSpecType, CUDAFunctionTarget CFT)
A function type attribute was written in the decl spec.
static bool handleObjCPointerTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type)
static QualType inferARCLifetimeForPointee(Sema &S, QualType type, SourceLocation loc, bool isReference)
Given that we're building a pointer or reference to the given.
static bool handleNonBlockingNonAllocatingTypeAttr(TypeProcessingState &TPState, ParsedAttr &PAttr, QualType &QT, FunctionTypeUnwrapper &Unwrapped)
static QualType ChangeIntegralSignedness(Sema &S, QualType BaseType, bool IsMakeSigned, SourceLocation Loc)
static bool CheckNullabilityTypeSpecifier(Sema &S, TypeProcessingState *State, ParsedAttr *PAttr, QualType &QT, NullabilityKind Nullability, SourceLocation NullabilityLoc, bool IsContextSensitive, bool AllowOnArrayType, bool OverrideExisting)
#define OBJC_POINTER_TYPE_ATTRS_CASELIST
static void diagnoseBadTypeAttribute(Sema &S, const ParsedAttr &attr, QualType type)
diagnoseBadTypeAttribute - Diagnoses a type attribute which doesn't apply to the given type.
static PointerDeclaratorKind classifyPointerDeclarator(Sema &S, QualType type, Declarator &declarator, PointerWrappingDeclaratorKind &wrappingKind)
Classify the given declarator, whose type-specified is type, based on what kind of pointer it refers ...
static bool verifyValidIntegerConstantExpr(Sema &S, const ParsedAttr &Attr, llvm::APSInt &Result)
static void HandleSwiftAttr(TypeProcessingState &State, TypeAttrLocation TAL, QualType &QT, ParsedAttr &PAttr)
static bool handleMSPointerTypeQualifierAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type)
static bool shouldHaveNullability(QualType T)
static void HandleArmMveStrictPolymorphismAttr(TypeProcessingState &State, QualType &CurType, ParsedAttr &Attr)
static void warnAboutAmbiguousFunction(Sema &S, Declarator &D, DeclaratorChunk &DeclType, QualType RT)
Produce an appropriate diagnostic for an ambiguity between a function declarator and a C++ direct-ini...
static void distributeObjCPointerTypeAttrFromDeclarator(TypeProcessingState &state, ParsedAttr &attr, QualType &declSpecType)
Distribute an objc_gc type attribute that was written on the declarator.
static FileID getNullabilityCompletenessCheckFileID(Sema &S, SourceLocation loc)
static void HandleOverflowBehaviorAttr(QualType &Type, const ParsedAttr &Attr, TypeProcessingState &State)
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 void distributeFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType type)
A function type attribute was written somewhere in a declaration other than on the declarator itself ...
static void HandleMatrixTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S)
HandleMatrixTypeAttr - "matrix_type" attribute, like ext_vector_type.
static bool HandleWebAssemblyFuncrefAttr(TypeProcessingState &State, QualType &QT, ParsedAttr &PAttr)
static bool hasOuterPointerLikeChunk(const Declarator &D, unsigned endIndex)
Returns true if any of the declarator chunks before endIndex include a level of indirection: array,...
static void HandleOpenCLAccessAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S)
Handle OpenCL Access Qualifier Attribute.
static NullabilityKind mapNullabilityAttrKind(ParsedAttr::Kind kind)
Map a nullability attribute kind to a nullability kind.
static bool distributeFunctionTypeAttrToInnermost(TypeProcessingState &state, ParsedAttr &attr, ParsedAttributesView &attrList, QualType &declSpecType, CUDAFunctionTarget CFT)
Try to distribute a function type attribute to the innermost function chunk or type.
#define NULLABILITY_TYPE_ATTRS_CASELIST
static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, TypeSourceInfo *&ReturnTypeInfo)
static void checkNullabilityConsistency(Sema &S, SimplePointerKind pointerKind, SourceLocation pointerLoc, SourceLocation pointerEndLoc=SourceLocation())
Complains about missing nullability if the file containing pointerLoc has other uses of nullability (...
static void transferARCOwnership(TypeProcessingState &state, QualType &declSpecTy, Qualifiers::ObjCLifetime ownership)
Used for transferring ownership in casts resulting in l-values.
static std::string getPrintableNameForEntity(DeclarationName Entity)
static std::string getFunctionQualifiersAsString(const FunctionProtoType *FnTy)
static QualType rebuildAttributedTypeWithoutNullability(ASTContext &Ctx, QualType Type)
Rebuild an attributed type without the nullability attribute on it.
static DeclaratorChunk * maybeMovePastReturnType(Declarator &declarator, unsigned i, bool onlyBlockPointers)
Given the index of a declarator chunk, check whether that chunk directly specifies the return type of...
static OpenCLAccessAttr::Spelling getImageAccess(const ParsedAttributesView &Attrs)
static void fillMatrixTypeLoc(MatrixTypeLoc MTL, const ParsedAttributesView &Attrs)
static UnaryTransformType::UTTKind TSTToUnaryTransformType(DeclSpec::TST SwitchTST)
static void HandleRISCVRVVVectorBitsTypeAttr(QualType &CurType, ParsedAttr &Attr, Sema &S)
HandleRISCVRVVVectorBitsTypeAttr - The "riscv_rvv_vector_bits" attribute is used to create fixed-leng...
static void HandleAddressSpaceTypeAttribute(QualType &Type, const ParsedAttr &Attr, TypeProcessingState &State)
HandleAddressSpaceTypeAttribute - Process an address_space attribute on the specified type.
static bool checkQualifiedFunction(Sema &S, QualType T, SourceLocation Loc, QualifiedFunctionKind QFK)
Check whether the type T is a qualified function type, and if it is, diagnose that it cannot be conta...
static bool checkOmittedBlockReturnType(Sema &S, Declarator &declarator, QualType Result)
Return true if this is omitted block return type.
static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T, const ParsedAttr &Attr, Sema &S)
Handle the __ptrauth qualifier.
static bool DiagnoseMultipleAddrSpaceAttributes(Sema &S, LangAS ASOld, LangAS ASNew, SourceLocation AttrLoc)
static void warnAboutRedundantParens(Sema &S, Declarator &D, QualType T)
Produce an appropriate diagnostic for a declarator with top-level parentheses.
static QualType ConvertDeclSpecToType(TypeProcessingState &state)
Convert the specified declspec to the appropriate type object.
static std::pair< QualType, TypeSourceInfo * > InventTemplateParameter(TypeProcessingState &state, QualType T, TypeSourceInfo *TrailingTSI, AutoType *Auto, InventedTemplateParameterInfo &Info)
static void distributeFunctionTypeAttrFromDeclarator(TypeProcessingState &state, ParsedAttr &attr, QualType &declSpecType, CUDAFunctionTarget CFT)
A function type attribute was written on the declarator or declaration.
static void diagnoseAndRemoveTypeQualifiers(Sema &S, const DeclSpec &DS, unsigned &TypeQuals, QualType TypeSoFar, unsigned RemoveTQs, unsigned DiagID)
static CallingConv getCCForDeclaratorChunk(Sema &S, Declarator &D, const ParsedAttributesView &AttrList, const DeclaratorChunk::FunctionTypeInfo &FTI, unsigned ChunkIndex)
Helper for figuring out the default CC for a function declarator type.
static unsigned getLiteralDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for literal type diagnostic message.
static void recordNullabilitySeen(Sema &S, SourceLocation loc)
Marks that a nullability feature has been used in the file containing loc.
static bool CheckBitIntElementType(Sema &S, SourceLocation AttrLoc, const BitIntType *BIT, bool ForMatrixType=false)
static void checkExtParameterInfos(Sema &S, ArrayRef< QualType > paramTypes, const FunctionProtoType::ExtProtoInfo &EPI, llvm::function_ref< SourceLocation(unsigned)> getParamLoc)
Check the extended parameter information.
static bool handleFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type, CUDAFunctionTarget CFT)
Process an individual function attribute.
static void transferARCOwnershipToDeclSpec(Sema &S, QualType &declSpecTy, Qualifiers::ObjCLifetime ownership)
static void BuildTypeCoupledDecls(Expr *E, llvm::SmallVectorImpl< TypeCoupledDeclRefInfo > &Decls)
static void assignInheritanceModel(Sema &S, CXXRecordDecl *RD)
Locks in the inheritance model for the given class and all of its bases.
static bool checkObjCKindOfType(TypeProcessingState &state, QualType &type, ParsedAttr &attr)
Check the application of the Objective-C '__kindof' qualifier to the given type.
static bool hasNullabilityAttr(const ParsedAttributesView &attrs)
Check whether there is a nullability attribute of any kind in the given attribute list.
static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type)
handleObjCOwnershipTypeAttr - Process an objc_ownership attribute on the specified type.
static void moveAttrFromListToList(ParsedAttr &attr, ParsedAttributesView &fromList, ParsedAttributesView &toList)
static void HandleAnnotateTypeAttr(TypeProcessingState &State, QualType &CurType, const ParsedAttr &PA)
static void fillAttributedTypeLoc(AttributedTypeLoc TL, TypeProcessingState &State)
static void fillDependentAddressSpaceTypeLoc(DependentAddressSpaceTypeLoc DASTL, const ParsedAttributesView &Attrs)
TypeAttrLocation
The location of a type attribute.
@ TAL_DeclChunk
The attribute is part of a DeclaratorChunk.
@ TAL_DeclSpec
The attribute is in the decl-specifier-seq.
@ TAL_DeclName
The attribute is immediately after the declaration's name.
static bool isOmittedBlockReturnType(const Declarator &D)
isOmittedBlockReturnType - Return true if this declarator is missing a return type because this is a ...
static TypeSourceInfo * GetFullTypeForDeclarator(TypeProcessingState &state, QualType declSpecType, TypeSourceInfo *TInfo)
static QualType GetEnumUnderlyingType(Sema &S, QualType BaseType, SourceLocation Loc)
static bool IsNoDerefableChunk(const DeclaratorChunk &Chunk)
static AttrT * createSimpleAttr(ASTContext &Ctx, ParsedAttr &AL)
static void diagnoseRedundantReturnTypeQualifiers(Sema &S, QualType RetTy, Declarator &D, unsigned FunctionChunkIndex)
static void processTypeAttrs(TypeProcessingState &state, QualType &type, TypeAttrLocation TAL, const ParsedAttributesView &attrs, CUDAFunctionTarget CFT=CUDAFunctionTarget::HostDevice)
static bool checkMutualExclusion(TypeProcessingState &state, const FunctionProtoType::ExtProtoInfo &EPI, ParsedAttr &Attr, AttributeCommonInfo::Kind OtherKind)
static Attr * getCCTypeAttr(ASTContext &Ctx, ParsedAttr &Attr)
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
__DEVICE__ int max(int __a, int __b)
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
TranslationUnitDecl * getTranslationUnitDecl() const
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
QualType getAutoType(DeducedKind DK, QualType DeducedAsType, AutoTypeKeyword Keyword, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
CanQualType UnsignedLongTy
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
TypedefDecl * getBuiltinVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_va_list type.
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
CanQualType UnsignedLongLongTy
CanQualType UnsignedShortTy
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
DiagnosticsEngine & getDiagnostics() const
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
CanQualType getCanonicalTagType(const TagDecl *TD) const
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const
Return the uniqued reference to the type for an Objective-C gc-qualified type.
QualType getPointerAuthType(QualType Ty, PointerAuthQualifier PointerAuth)
Return a type with the given __ptrauth qualifier.
uint64_t getCharWidth() const
Return the size of the character type, in bits.
QualType getBitIntType(bool Unsigned, unsigned NumBits) const
Return a bit-precise integer type with the specified signedness and bit count.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
TypeLoc getValueLoc() const
void setKWLoc(SourceLocation Loc)
void setParensRange(SourceRange Range)
Attr - This represents one attribute.
attr::Kind getKind() const
const char * getSpelling() const
SourceRange getRange() const
bool isContextSensitiveKeywordAttribute() const
bool isRegularKeywordAttribute() const
SourceLocation getLoc() const
const IdentifierInfo * getAttrName() const
ParsedAttr * create(IdentifierInfo *attrName, SourceRange attrRange, AttributeScopeInfo scope, ArgsUnion *args, unsigned numArgs, ParsedAttr::Form form, SourceLocation ellipsisLoc=SourceLocation())
Type source information for an attributed type.
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
void setAttr(const Attr *A)
bool hasExplicitTemplateArgs() const
const NestedNameSpecifierLoc getNestedNameSpecifierLoc() const
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
void setConceptReference(ConceptReference *CR)
NamedDecl * getFoundDecl() const
TemplateArgumentLoc getArgLoc(unsigned i) const
unsigned getNumArgs() const
TemplateDecl * getNamedConcept() const
DeclarationNameInfo getConceptNameInfo() const
void setRParenLoc(SourceLocation Loc)
TypeLoc getWrappedLoc() const
Comparison function object.
A fixed int type of a specified bitwidth.
unsigned getNumBits() const
void setCaretLoc(SourceLocation Loc)
TypeSpecifierWidth getWrittenWidthSpec() const
bool needsExtraLocalData() const
void setBuiltinLoc(SourceLocation Loc)
WrittenBuiltinSpecs & getWrittenBuiltinSpecs()
TypeSpecifierSign getWrittenSignSpec() const
void expandBuiltinRange(SourceRange Range)
This class is used for builtin types like 'int'.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
CXXRecordDecl * getMostRecentDecl()
bool hasUserProvidedDefaultConstructor() const
Whether this class has a user-provided default constructor per C++11.
bool hasDefinition() const
MSInheritanceModel calculateInheritanceModel() const
Calculate what the inheritance model would be for this class.
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
Represents a C++ nested-name-specifier or a global scope specifier.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
Represents a canonical, potentially-qualified type.
SourceLocation getBegin() const
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
TypeLoc getNextTypeLoc() const
static unsigned getNumAddressingBits(const ASTContext &Context, QualType ElementType, const llvm::APInt &NumElements)
Determine the number of bits required to address a member of.
static unsigned getMaxSizeBits(const ASTContext &Context)
Determine the maximum number of active bits that an array's size can require, which limits the maximu...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
bool isFunctionOrMethod() const
A reference to a declared variable, function, enum, etc.
Captures information about "declaration specifiers".
const WrittenBuiltinSpecs & getWrittenBuiltinSpecs() const
bool isTypeSpecPipe() const
static const TST TST_typeof_unqualType
SourceLocation getTypeSpecSignLoc() const
bool hasAutoTypeSpec() const
static const TST TST_typename
SourceLocation getEndLoc() const LLVM_READONLY
bool hasTypeSpecifier() const
Return true if any type-specifier has been found.
static const TST TST_char8
static const TST TST_BFloat16
Expr * getPackIndexingExpr() const
TST getTypeSpecType() const
SCS getStorageClassSpec() const
SourceLocation getOverflowBehaviorLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isTypeSpecSat() const
SourceRange getSourceRange() const LLVM_READONLY
static const TST TST_auto_type
static const TST TST_interface
static const TST TST_double
static const TST TST_typeofExpr
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
TemplateIdAnnotation * getRepAsTemplateId() const
static const TST TST_union
static const TST TST_typename_pack_indexing
static const TST TST_char
static const TST TST_bool
static const TST TST_char16
static const TST TST_unknown_anytype
TSC getTypeSpecComplex() const
ParsedType getRepAsType() const
static const TST TST_accum
static const TST TST_half
ParsedAttributes & getAttributes()
SourceLocation getEllipsisLoc() const
bool isTypeAltiVecPixel() const
void ClearTypeQualifiers()
Clear out all of the type qualifiers.
SourceLocation getConstSpecLoc() const
static const TST TST_ibm128
Expr * getRepAsExpr() const
static const TST TST_enum
AttributePool & getAttributePool() const
bool isWrapSpecified() const
static const TST TST_float128
static const TST TST_decltype
SourceRange getTypeSpecWidthRange() const
SourceLocation getTypeSpecTypeNameLoc() const
SourceLocation getTypeSpecWidthLoc() const
SourceLocation getRestrictSpecLoc() const
static const TST TST_typeof_unqualExpr
static const TST TST_class
bool isOverflowBehaviorSpecified() const
bool hasTagDefinition() const
static const TST TST_decimal64
unsigned getParsedSpecifiers() const
Return a bitmask of which flavors of specifiers this DeclSpec includes.
bool isTypeAltiVecBool() const
bool isConstrainedAuto() const
static const TST TST_wchar
SourceLocation getTypeSpecComplexLoc() const
static const TST TST_void
bool isTypeAltiVecVector() const
static const TST TST_bitint
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
static const TST TST_float
static const TST TST_atomic
bool isTrapSpecified() const
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
OverflowBehaviorState getOverflowBehaviorState() const
static const TST TST_decltype_auto
static const TST TST_error
void forEachQualifier(llvm::function_ref< void(TQ, StringRef, SourceLocation)> Handle)
This method calls the passed in handler on each qual being set.
static const TST TST_decimal32
TypeSpecifierWidth getTypeSpecWidth() const
static const TST TST_char32
static const TST TST_decimal128
bool isTypeSpecOwned() const
SourceLocation getTypeSpecSatLoc() const
SourceRange getTypeofParensRange() const
SourceLocation getUnalignedSpecLoc() const
static const TST TST_int128
SourceLocation getVolatileSpecLoc() const
FriendSpecified isFriendSpecified() const
static const TST TST_typeofType
static const TST TST_auto
ConstexprSpecKind getConstexprSpecifier() const
static const TST TST_struct
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
bool isInvalidDecl() const
SourceLocation getLocation() const
void setImplicit(bool I=true)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
std::string getAsString() const
Retrieve the human-readable string for this name.
NameKind getNameKind() const
Determine what kind of name this is.
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
const DeclaratorChunk * getInnermostNonParenChunk() const
Return the innermost (closest to the declarator) chunk of this declarator that is not a parens chunk,...
void AddInnermostTypeInfo(const DeclaratorChunk &TI)
Add a new innermost chunk to this declarator.
bool isFunctionDeclarationContext() const
Return true if this declaration appears in a context where a function declarator would be a function ...
FunctionDefinitionKind getFunctionDefinitionKind() const
const ParsedAttributes & getAttributes() const
SourceLocation getIdentifierLoc() const
bool hasTrailingReturnType() const
Determine whether a trailing return type was written (at any level) within this declarator.
SourceLocation getEndLoc() const LLVM_READONLY
bool isExpressionContext() const
Determine whether this declaration appears in a context where an expression could appear.
type_object_range type_objects() const
Returns the range of type objects, from the identifier outwards.
void setInvalidType(bool Val=true)
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
const ParsedAttributesView & getDeclarationAttributes() const
SourceLocation getEllipsisLoc() const
DeclaratorContext getContext() const
SourceLocation getBeginLoc() const LLVM_READONLY
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
bool isFirstDeclarator() const
SourceLocation getCommaLoc() const
AttributePool & getAttributePool() const
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
ParsedType getTrailingReturnType() const
Get the trailing return type appearing (at any level) within this declarator.
bool isInvalidType() const
bool isExplicitObjectMemberFunction()
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isFirstDeclarationOfMember()
Returns true if this declares a real member and not a friend.
bool isPrototypeContext() const
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
void setEllipsisLoc(SourceLocation EL)
const IdentifierInfo * getIdentifier() const
void setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
void setAttrNameLoc(SourceLocation loc)
void setAttrOperandParensRange(SourceRange range)
void setAttrExprOperand(Expr *e)
Represents an extended address space qualifier where the input address space value is dependent.
void copy(DependentNameTypeLoc Loc)
void setNameLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
bool getSuppressSystemWarnings() const
Wrap a function effect's condition expression in another struct so that FunctionProtoType's TrailingO...
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getDefinition() const
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
A SourceLocation and its associated SourceManager.
unsigned getSpellingLineNumber(bool *Invalid=nullptr) const
A mutable set of FunctionEffects and possibly conditions attached to them.
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
SmallVector< Conflict > Conflicts
Represents an abstract function effect, using just an enumeration describing its kind.
Kind
Identifies the particular effect.
An immutable set of FunctionEffects and possibly conditions attached to them.
Represents a prototype with parameter type info, e.g.
Qualifiers getMethodQuals() const
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
unsigned getNumParams() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
void setParam(unsigned i, ParmVarDecl *VD)
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
A class which abstracts out some details necessary for making a call.
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
bool getProducesResult() const
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
static StringRef getNameForCallConv(CallingConv CC)
AArch64SMETypeAttributes
The AArch64 SME ACLE (Arm C/C++ Language Extensions) define a number of function type attributes that...
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateMask
static ArmStateValue getArmZT0State(unsigned AttrBits)
static ArmStateValue getArmZAState(unsigned AttrBits)
CallingConv getCallConv() const
QualType getReturnType() const
bool getHasRegParm() const
Type source information for HLSL attributed resource type.
TypeLoc getWrappedLoc() const
void setContainedTypeSourceInfo(TypeSourceInfo *TSI) const
void setSourceRange(const SourceRange &R)
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef getName() const
Return the actual identifier string.
A simple pair of identifier info and location.
void setIdentifierInfo(IdentifierInfo *Ident)
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
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, const LangOptions &LangOpts)
Valid elements types are the following:
void setStarLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
A pointer to member type per C++ 8.3.3 - Pointers to members.
NestedNameSpecifier getQualifier() const
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
QualType getPointeeType() const
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
This represents a decl that may have a name.
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NamespaceAndPrefix getAsNamespaceAndPrefix() const
const Type * getAsType() const
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
Represents an ObjC class declaration.
void setNameLoc(SourceLocation Loc)
void setNameEndLoc(SourceLocation Loc)
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
Wraps an ObjCPointerType with source location information.
void setStarLoc(SourceLocation Loc)
Represents a pointer to an Objective C object.
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
static OpaquePtr make(QualType P)
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
TypeLoc getWrappedLoc() const
void setEllipsisLoc(SourceLocation Loc)
A parameter attribute which changes the argument-passing ABI rule for the parameter.
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
Represents a parameter to a function.
ParsedAttr - Represents a syntactic attribute.
void setInvalid(bool b=true) const
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
bool isArgIdent(unsigned Arg) const
Expr * getArgAsExpr(unsigned Arg) const
AttributeCommonInfo::Kind getKind() const
void setUsedAsTypeAttr(bool Used=true)
bool checkAtMostNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at most as many args as Num.
bool hasMSPropertyAttr() const
void addAtEnd(ParsedAttr *newAttr)
bool hasAttribute(ParsedAttr::Kind K) const
void remove(ParsedAttr *ToBeRemoved)
void takeOneFrom(ParsedAttributes &Other, ParsedAttr *PA)
TypeLoc getValueLoc() const
void setKWLoc(SourceLocation Loc)
Pointer-authentication qualifiers.
static PointerAuthQualifier Create(unsigned Key, bool IsAddressDiscriminated, unsigned ExtraDiscriminator, PointerAuthenticationMode AuthenticationMode, bool IsIsaPointer, bool AuthenticatesNullValues)
@ MaxKey
The maximum supported pointer-authentication key.
void setStarLoc(SourceLocation Loc)
PointerType - C99 6.7.5.1 - Pointer Declarators.
SourceLocation getPragmaAssumeNonNullLoc() const
The location of the currently-active #pragma clang assume_nonnull begin.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
PointerAuthQualifier getPointerAuth() const
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
SplitQualType getSplitUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
UnqualTypeLoc getUnqualifiedLoc() const
The collection of all-type qualifiers we support.
void removeCVRQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
void addCVRUQualifiers(unsigned mask)
static Qualifiers fromCVRMask(unsigned CVR)
void setUnaligned(bool flag)
std::string getAsString() const
@ MaxAddressSpace
The maximum supported address space number.
void addObjCLifetime(ObjCLifetime type)
void setAmpAmpLoc(SourceLocation Loc)
QualType getPointeeType() const
bool isSpelledAsLValue() const
bool isFunctionDeclarationScope() const
isFunctionDeclarationScope - Return true if this scope is a function prototype scope.
A generic diagnostic builder for errors which may or may not be deferred.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
QualType ProcessResourceTypeAttributes(QualType Wrapped)
QualType getInoutParameterType(QualType Ty)
bool isCFError(RecordDecl *D)
IdentifierInfo * getNSErrorIdent()
Retrieve the identifier "NSError".
bool checkNSReturnsRetainedReturnType(SourceLocation loc, QualType type)
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
Abstract base class used for diagnosing integer constant expression violations.
Sema - This implements semantic analysis and AST building for C.
bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a reachable definition.
QualType BuildParenType(QualType T)
Build a paren type including T.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
bool ConstantFoldAttrArgs(const AttributeCommonInfo &CI, MutableArrayRef< Expr * > Args)
ConstantFoldAttrArgs - Folds attribute arguments into ConstantExprs (unless they are value dependent ...
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Scope * getCurScope() const
Retrieve the parser's current scope.
bool hasStructuralCompatLayout(Decl *D, Decl *Suggested)
Determine if D and Suggested have a structurally compatible layout as described in C11 6....
bool checkArrayElementAlignment(QualType EltTy, SourceLocation Loc)
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
UnaryTransformType::UTTKind UTTKind
QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace, SourceLocation AttrLoc)
BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an expression is uninstantiated.
bool checkPointerAuthDiscriminatorArg(Expr *Arg, PointerAuthDiscArgKind Kind, unsigned &IntVal)
QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc)
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.
bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS)
Check whether the given variable declaration has a size that fits within the address space it is decl...
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)
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
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 ...
void completeExprArrayBound(Expr *E)
bool hasExplicitCallingConv(QualType T)
bool CheckRegparmAttr(const ParsedAttr &attr, unsigned &value)
Checks a regparm attribute, returning true if it is ill-formed and otherwise setting numParams to the...
FileNullabilityMap NullabilityMap
A mapping that describes the nullability we've seen in each header file.
sema::FunctionScopeInfo * getCurFunction() const
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
QualType BuildMemberPointerType(QualType T, const CXXScopeSpec &SS, CXXRecordDecl *Cls, SourceLocation Loc, DeclarationName Entity)
Build a member pointer type T Class::*.
ExprResult DefaultLvalueConversion(Expr *E)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
QualType BuiltinDecay(QualType BaseType, SourceLocation Loc)
IdentifierInfo * getNullabilityKeyword(NullabilityKind nullability)
Retrieve the keyword associated.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
bool isAcceptable(const NamedDecl *D, AcceptableKind Kind)
Determine whether a declaration is acceptable (visible/reachable).
QualType getDecltypeForExpr(Expr *E)
getDecltypeForExpr - Given an expr, will return the decltype for that expression, according to the ru...
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
QualType BuiltinAddReference(QualType BaseType, UTTKind UKind, SourceLocation Loc)
bool hasVisibleMergedDefinition(const NamedDecl *Def)
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
QualType BuildAtomicType(QualType T, SourceLocation Loc)
void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl, MissingImportKind MIK, bool Recover=true)
Diagnose that the specified declaration needs to be visible but isn't, and suggest a module import th...
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, TemplateDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
bool diagnoseConflictingFunctionEffect(const FunctionEffectsRef &FX, const FunctionEffectWithCondition &EC, SourceLocation NewAttrLoc)
Warn and return true if adding a function effect to a set would create a conflict.
TypeSourceInfo * ReplaceAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
TypeResult ActOnTypeName(Declarator &D)
bool isSFINAEContext() const
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
void checkUnusedDeclAttributes(Declarator &D)
checkUnusedDeclAttributes - Given a declarator which is not being used to build a declaration,...
QualType BuildPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a pointer type.
bool CheckAttrTarget(const ParsedAttr &CurrAttr)
QualType BuiltinAddPointer(QualType BaseType, SourceLocation Loc)
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
bool CheckImplicitNullabilityTypeSpecifier(QualType &Type, NullabilityKind Nullability, SourceLocation DiagLoc, bool AllowArrayTypes, bool OverrideExisting)
Check whether a nullability type specifier can be added to the given type through some means not writ...
void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc)
bool CheckDistantExceptionSpec(QualType T)
CheckDistantExceptionSpec - Check if the given type is a pointer or pointer to member to a function w...
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.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
Exposes information about the current target.
virtual bool hasBitIntType() const
Determine whether the _BitInt type is supported on this target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual size_t getMaxBitIntWidth() const
virtual std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts, ArmStreamingKind Mode, llvm::StringMap< bool > *FeatureMap=nullptr) const
Returns target-specific min and max values VScale_Range.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
virtual bool allowHalfArgsAndReturns() const
Whether half args and returns are supported.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
virtual bool hasFloat16Type() const
Determine whether the _Float16 type is supported on this target.
virtual bool hasIbm128Type() const
Determine whether the __ibm128 type is supported on this target.
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
virtual bool hasBFloat16Type() const
Determine whether the _BFloat16 type is supported on this target.
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SourceLocation getRAngleLoc() const
void copy(TemplateSpecializationTypeLoc Loc)
Declaration of a template type parameter.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, int D, int P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
const Type * getTypeForDecl() const
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void pushFullCopy(TypeLoc L)
Pushes a copy of the given TypeLoc onto this builder.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
unsigned getFullDataSize() const
Returns the size of the type source info data block.
AutoTypeLoc getContainedAutoTypeLoc() const
Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...
void * getOpaqueData() const
Get the pointer where source information is stored.
void copy(TypeLoc other)
Copies the other type loc into this one.
void initialize(ASTContext &Context, SourceLocation Loc) const
Initializes this to state that every location in this type is the given location.
SourceLocation getEndLoc() const
Get the end source location.
SourceLocation getBeginLoc() const
Get the begin source location.
void setUnmodifiedTInfo(TypeSourceInfo *TI) const
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isBlockPointerType() const
bool isBooleanType() const
QualType getRVVEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an RVV builtin type.
bool isIncompleteArrayType() const
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
bool isUndeducedAutoType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
CXXRecordDecl * castAsCXXRecordDecl() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
NestedNameSpecifier getPrefix() const
If this type represents a qualified-id, this returns its nested name specifier.
bool isSizelessBuiltinType() const
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
const Type * getArrayElementTypeNoTypeQual() const
If this is an array type, return the element type of the array, potentially with type qualifiers miss...
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool canHaveNullability(bool ResultIfUnknown=true) const
Determine whether the given type can have a nullability specifier applied to it, i....
QualType getSveEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an SVE builtin type.
bool isBitIntType() const
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isChar16Type() const
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool isMemberPointerType() const
bool isAtomicType() const
bool isObjCObjectType() const
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isRVVVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'riscv_rvv_vector_bits' type attribute,...
bool isRealFloatingType() const
Floating point categories.
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isObjCARCImplicitlyUnretainedType() const
Determines if this type, which must satisfy isObjCLifetimeType(), is implicitly __unsafe_unretained r...
bool isRecordType() const
bool isObjCRetainableType() const
NullabilityKindOrNone getNullability() const
Determine the nullability of the given type.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
void setParensRange(SourceRange range)
void setTypeofLoc(SourceLocation Loc)
Wrapper of type source information for a type with no direct qualifiers.
TypeLocClass getTypeLocClass() const
UnionParsedType ConversionFunctionId
When Kind == IK_ConversionFunctionId, the type that the conversion function names.
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
@ Definition
This declaration is definitely a definition.
void setNameLoc(SourceLocation Loc)
Represents a GCC generic vector type.
VectorKind getVectorKind() const
static DelayedDiagnostic makeForbiddenType(SourceLocation loc, unsigned diagnostic, QualType type, unsigned argument)
Retains information about a function, method, or block that is currently being parsed.
Defines the clang::TargetInfo interface.
const internal::VariadicDynCastAllOfMatcher< Decl, TypedefDecl > typedefDecl
Matches typedef declarations.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Decl, RecordDecl > recordDecl
Matches class, struct, and union declarations.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
@ ExpectedParameterOrImplicitObjectParameter
@ ExpectedFunctionWithProtoType
@ GNUAutoType
__auto_type (GNU extension)
@ DecltypeAuto
decltype(auto)
llvm::StringRef getParameterABISpelling(ParameterABI kind)
FunctionEffectMode
Used with attributes/effects with a boolean condition, e.g. nonblocking.
LLVM_READONLY bool isAsciiIdentifierContinue(unsigned char c)
NullabilityKind
Describes the nullability of a particular type.
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
llvm::PointerUnion< Expr *, IdentifierLoc * > ArgsUnion
A union of the various pointer types that can be passed to an ParsedAttr as an argument.
@ Success
Annotation was successful.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
TypeOfKind
The kind of 'typeof' expression we're after.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
@ AANT_ArgumentIntegerConstant
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
llvm::StringRef getNullabilitySpelling(NullabilityKind kind, bool isContextSensitive=false)
Retrieve the spelling of the given nullability kind.
ArraySizeModifier
Capture whether this is a normal array (e.g.
@ SwiftAsyncContext
This parameter (which must have pointer type) uses the special Swift asynchronous context-pointer ABI...
@ SwiftErrorResult
This parameter (which must have pointer-to-pointer type) uses the special Swift error-result ABI trea...
@ Ordinary
This parameter uses ordinary ABI rules for its type.
@ SwiftIndirectResult
This parameter (which must have pointer type) is a Swift indirect result parameter.
@ SwiftContext
This parameter (which must have pointer type) uses the special Swift context-pointer ABI treatment.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
bool supportsVariadicCall(CallingConv CC)
Checks whether the given calling convention supports variadic calls.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
static bool isBlockPointer(Expr *Arg)
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
@ Keyword
The name has been typo-corrected to a keyword.
@ Type
The name was classified as a type.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ FirstTargetAddressSpace
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
@ Deduced
The normal deduced case.
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ NeonPoly
is ARM Neon polynomial vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ None
The alignment was not explicit in code.
@ ArrayBound
Array bound in array declarator or new-expression.
@ PackIndex
Index of a pack indexing expression or specifier.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
ActionResult< Expr * > ExprResult
@ Parens
New-expression has a C++98 paren-delimited initializer.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
@ Implicit
An implicit conversion.
OptionalUnsigned< NullabilityKind > NullabilityKindOrNone
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 OverflowBehaviorLoc
The location of an __ob_wrap or __ob_trap qualifier, if any.
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.
unsigned OverflowBehaviorIsWrap
Whether the overflow behavior qualifier is wrap (true) or trap (false).
bool LValueRef
True if this is an lvalue reference, false if it's an rvalue reference.
bool HasRestrict
The type qualifier: restrict. [GNU] C++ extension.
One instance of this struct is used for each type in a declarator that is parsed.
const ParsedAttributesView & getAttrs() const
If there are attributes applied to this declaratorchunk, return them.
SourceLocation EndLoc
EndLoc - If valid, the place where this chunck ends.
static DeclaratorChunk getFunction(bool HasProto, bool IsAmbiguous, SourceLocation LParenLoc, ParamInfo *Params, unsigned NumParams, SourceLocation EllipsisLoc, SourceLocation RParenLoc, bool RefQualifierIsLvalueRef, SourceLocation RefQualifierLoc, SourceLocation MutableLoc, ExceptionSpecificationType ESpecType, SourceRange ESpecRange, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, ArrayRef< NamedDecl * > DeclsInPrototype, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult(), SourceLocation TrailingReturnTypeLoc=SourceLocation(), DeclSpec *MethodQualifiers=nullptr)
DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
MemberPointerTypeInfo Mem
SourceLocation Loc
Loc - The place where this type was defined.
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
Describes whether we've seen any nullability information for the given file.
SourceLocation PointerEndLoc
The end location for the first pointer declarator in the file.
SourceLocation PointerLoc
The first pointer declarator (of any pointer kind) in the file that does not have a corresponding nul...
bool SawTypeNullability
Whether we saw any type nullability annotations in the given file.
uint8_t PointerKind
Which kind of pointer declarator we saw.
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Holds information about the various types of exception specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionTypeExtraAttributeInfo ExtraAttributeInfo
unsigned AArch64SMEAttributes
SourceLocation EllipsisLoc
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
RefQualifierKind RefQualifier
unsigned HasTrailingReturn
void setArmSMEAttribute(AArch64SMETypeAttributes Kind, bool Enable=true)
FunctionType::ExtInfo ExtInfo
TypeSourceInfo * ContainedTyInfo
SmallVector< NamedDecl *, 4 > TemplateParams
Store the list of the template parameters for a generic lambda or an abbreviated function template.
unsigned AutoTemplateParameterDepth
If this is a generic lambda or abbreviated function template, use this as the depth of each 'auto' pa...
static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into an elaborated type keyword.
NestedNameSpecifier Prefix
Describes how types, statements, expressions, and declarations should be printed.
Abstract class used to diagnose incomplete types.
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
SplitQualType getSingleStepDesugaredType() const
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
bool IsEquivalent(Decl *D1, Decl *D2)
Determine whether the two declarations are structurally equivalent.
Information about a template-id annotation token.
const IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.