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"
49#include "llvm/TargetParser/RISCVTargetParser.h"
83 bool useExpansionLoc =
true;
84 switch (
attr.getKind()) {
85 case ParsedAttr::AT_ObjCGC:
88 case ParsedAttr::AT_ObjCOwnership:
94 useExpansionLoc =
false;
99 StringRef name =
attr.getAttrName()->getName();
103 attr.isArgIdent(0) ?
attr.getArgAsIdent(0)->getIdentifierInfo() :
nullptr;
104 if (useExpansionLoc && loc.
isMacroID() && II) {
105 if (II->
isStr(
"strong")) {
107 }
else if (II->
isStr(
"weak")) {
112 S.
Diag(loc,
attr.isRegularKeywordAttribute()
113 ? diag::err_type_attribute_wrong_type
114 : diag::warn_type_attribute_wrong_type)
115 << name << WhichType <<
type;
120#define OBJC_POINTER_TYPE_ATTRS_CASELIST \
121 case ParsedAttr::AT_ObjCGC: \
122 case ParsedAttr::AT_ObjCOwnership
125#define CALLING_CONV_ATTRS_CASELIST \
126 case ParsedAttr::AT_CDecl: \
127 case ParsedAttr::AT_FastCall: \
128 case ParsedAttr::AT_StdCall: \
129 case ParsedAttr::AT_ThisCall: \
130 case ParsedAttr::AT_RegCall: \
131 case ParsedAttr::AT_Pascal: \
132 case ParsedAttr::AT_SwiftCall: \
133 case ParsedAttr::AT_SwiftAsyncCall: \
134 case ParsedAttr::AT_VectorCall: \
135 case ParsedAttr::AT_AArch64VectorPcs: \
136 case ParsedAttr::AT_AArch64SVEPcs: \
137 case ParsedAttr::AT_MSABI: \
138 case ParsedAttr::AT_SysVABI: \
139 case ParsedAttr::AT_Pcs: \
140 case ParsedAttr::AT_IntelOclBicc: \
141 case ParsedAttr::AT_PreserveMost: \
142 case ParsedAttr::AT_PreserveAll: \
143 case ParsedAttr::AT_M68kRTD: \
144 case ParsedAttr::AT_PreserveNone: \
145 case ParsedAttr::AT_RISCVVectorCC: \
146 case ParsedAttr::AT_RISCVVLSCC
149#define FUNCTION_TYPE_ATTRS_CASELIST \
150 case ParsedAttr::AT_NSReturnsRetained: \
151 case ParsedAttr::AT_NoReturn: \
152 case ParsedAttr::AT_NonBlocking: \
153 case ParsedAttr::AT_NonAllocating: \
154 case ParsedAttr::AT_Blocking: \
155 case ParsedAttr::AT_Allocating: \
156 case ParsedAttr::AT_Regparm: \
157 case ParsedAttr::AT_CFIUncheckedCallee: \
158 case ParsedAttr::AT_CFISalt: \
159 case ParsedAttr::AT_CmseNSCall: \
160 case ParsedAttr::AT_ArmStreaming: \
161 case ParsedAttr::AT_ArmStreamingCompatible: \
162 case ParsedAttr::AT_ArmPreserves: \
163 case ParsedAttr::AT_ArmIn: \
164 case ParsedAttr::AT_ArmOut: \
165 case ParsedAttr::AT_ArmInOut: \
166 case ParsedAttr::AT_ArmAgnostic: \
167 case ParsedAttr::AT_AnyX86NoCallerSavedRegisters: \
168 case ParsedAttr::AT_AnyX86NoCfCheck: \
169 CALLING_CONV_ATTRS_CASELIST
172#define MS_TYPE_ATTRS_CASELIST \
173 case ParsedAttr::AT_Ptr32: \
174 case ParsedAttr::AT_Ptr64: \
175 case ParsedAttr::AT_SPtr: \
176 case ParsedAttr::AT_UPtr
179#define NULLABILITY_TYPE_ATTRS_CASELIST \
180 case ParsedAttr::AT_TypeNonNull: \
181 case ParsedAttr::AT_TypeNullable: \
182 case ParsedAttr::AT_TypeNullableResult: \
183 case ParsedAttr::AT_TypeNullUnspecified
188 class TypeProcessingState {
212 using TypeAttrPair = std::pair<const AttributedType*, const Attr*>;
214 bool AttrsForTypesSorted =
true;
218 llvm::DenseMap<const MacroQualifiedType *, SourceLocation> LocsForMacros;
226 bool ParsedHLSLParamMod;
230 :
sema(
sema), declarator(declarator),
232 ParsedHLSLParamMod(
false) {}
234 Sema &getSema()
const {
242 bool isProcessingDeclSpec()
const {
246 unsigned getCurrentChunkIndex()
const {
250 void setCurrentChunkIndex(
unsigned idx) {
256 if (isProcessingDeclSpec())
257 return getMutableDeclSpec().getAttributes();
262 void saveDeclSpecAttrs() {
264 if (!savedAttrs.empty())
267 DeclSpec &spec = getMutableDeclSpec();
268 llvm::append_range(savedAttrs,
275 ignoredTypeAttrs.push_back(&
attr);
281 for (
auto *
Attr : ignoredTypeAttrs)
290 sema.Context.getAttributedType(A, ModifiedType, EquivType);
292 AttrsForTypesSorted =
false;
297 QualType getBTFTagAttributedType(
const BTFTypeTagAttr *BTFAttr,
299 return sema.Context.getBTFTagAttributedType(BTFAttr, WrappedType);
305 getOverflowBehaviorType(OverflowBehaviorType::OverflowBehaviorKind Kind,
307 return sema.Context.getOverflowBehaviorType(Kind, UnderlyingType);
314 QualType T =
sema.ReplaceAutoType(TypeWithAuto, Replacement);
315 if (
auto *AttrTy = TypeWithAuto->
getAs<AttributedType>()) {
318 for (TypeAttrPair &A : AttrsForTypes) {
319 if (A.first == AttrTy)
322 AttrsForTypesSorted =
false;
328 const Attr *takeAttrForAttributedType(
const AttributedType *AT) {
329 if (!AttrsForTypesSorted) {
330 llvm::stable_sort(AttrsForTypes, llvm::less_first());
331 AttrsForTypesSorted =
true;
336 for (
auto It = llvm::partition_point(
338 [=](
const TypeAttrPair &A) {
return A.first < AT; });
339 It != AttrsForTypes.end() && It->first == AT; ++It) {
342 It->second =
nullptr;
356 auto FoundLoc = LocsForMacros.find(MQT);
357 assert(FoundLoc != LocsForMacros.end() &&
358 "Unable to find macro expansion location for MacroQualifedType");
359 return FoundLoc->second;
364 LocsForMacros[MQT] = Loc;
367 void setParsedNoDeref(
bool parsed) { parsedNoDeref = parsed; }
369 bool didParseNoDeref()
const {
return parsedNoDeref; }
371 void setParsedHLSLParamMod(
bool Parsed) { ParsedHLSLParamMod = Parsed; }
373 bool didParseHLSLParamMod()
const {
return ParsedHLSLParamMod; }
375 ~TypeProcessingState() {
376 if (savedAttrs.empty())
379 getMutableDeclSpec().getAttributes().clearListOnly();
381 getMutableDeclSpec().getAttributes().addAtEnd(AL);
385 DeclSpec &getMutableDeclSpec()
const {
427 if (
attr.getKind() == ParsedAttr::AT_ObjCGC)
429 assert(
attr.getKind() == ParsedAttr::AT_ObjCOwnership);
444 bool onlyBlockPointers) {
450 for (; i != 0; --i) {
452 switch (fnChunk.
Kind) {
468 for (--i; i != 0; --i) {
470 switch (ptrChunk.
Kind) {
480 if (onlyBlockPointers)
489 llvm_unreachable(
"bad declarator chunk kind");
495 llvm_unreachable(
"bad declarator chunk kind");
512 Declarator &declarator = state.getDeclarator();
515 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
517 switch (chunk.
Kind) {
523 if (state.isProcessingDeclSpec() &&
524 attr.getKind() == ParsedAttr::AT_ObjCOwnership)
527 if (!destChunk) destChunk = &chunk;
540 if (state.isProcessingDeclSpec() &&
541 attr.getKind() == ParsedAttr::AT_ObjCOwnership) {
568 Declarator &declarator = state.getDeclarator();
572 unsigned innermost = -1U;
573 bool considerDeclSpec =
true;
576 switch (chunk.
Kind) {
590 considerDeclSpec =
false;
598 if (considerDeclSpec) {
603 state.saveDeclSpecAttrs();
612 if (innermost != -1U) {
620 state.addIgnoredTypeAttr(
attr);
629 Declarator &declarator = state.getDeclarator();
633 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
635 switch (chunk.
Kind) {
662 Declarator &declarator = state.getDeclarator();
682 state.saveDeclSpecAttrs();
686 state,
attr, state.getCurrentAttributes(), declSpecType, CFT))
691 state.addIgnoredTypeAttr(
attr);
702 Declarator &declarator = state.getDeclarator();
712 state.addIgnoredTypeAttr(
attr);
737 if (
attr.isStandardAttributeSyntax() ||
attr.isRegularKeywordAttribute())
740 switch (
attr.getKind()) {
757 case ParsedAttr::AT_ObjCKindOf:
770 Declarator &declarator = state.getDeclarator();
816 {}, loc, loc, declarator));
831 typedef std::pair<DeclSpec::TQ, SourceLocation> QualLoc;
836 if (!(RemoveTQs & Qual.first))
840 if (TypeQuals & Qual.first)
841 S.
Diag(Qual.second, DiagID)
846 TypeQuals &= ~Qual.first;
860 if (AL.isInvalid() || !AL.isTypeAttr())
863 diag::warn_block_literal_attributes_on_omitted_return_type)
865 ToBeRemoved.push_back(&AL);
875 diag::warn_block_literal_qualifiers_on_omitted_return_type);
881static OpenCLAccessAttr::Spelling
884 if (AL.getKind() == ParsedAttr::AT_OpenCLAccess)
885 return static_cast<OpenCLAccessAttr::Spelling
>(AL.getSemanticSpelling());
886 return OpenCLAccessAttr::Keyword_read_only;
889static UnaryTransformType::UTTKind
892#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
894 return UnaryTransformType::Enum;
895#include "clang/Basic/BuiltinTraits.inc"
897 llvm_unreachable(
"attempted to parse a non-unary transform builtin");
911 Sema &S = state.getSema();
912 Declarator &declarator = state.getDeclarator();
929 Result = Context.SignedCharTy;
932 "Unknown TSS value");
933 Result = Context.UnsignedCharTy;
942 Context.getPrintingPolicy());
943 Result = Context.getSignedWCharType();
946 "Unknown TSS value");
949 Context.getPrintingPolicy());
950 Result = Context.getUnsignedWCharType();
955 "Unknown TSS value");
960 "Unknown TSS value");
961 Result = Context.Char16Ty;
965 "Unknown TSS value");
966 Result = Context.Char32Ty;
976 Result = Context.getAutoDeductType();
980 Context.DependentTy)) {
981 Result = Context.DependentTy;
997 S.
Diag(DeclLoc, diag::warn_missing_type_specifier)
1008 S.
Diag(DeclLoc, diag::err_missing_type_specifier)
1019 S.
Diag(DeclLoc, diag::err_missing_actual_pipe_type)
1025 "implicit int is disabled?");
1026 S.
Diag(DeclLoc, diag::ext_missing_type_specifier)
1040 Result = Context.ShortTy;
1046 Result = Context.LongLongTy;
1056 diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);
1065 Result = Context.UnsignedIntTy;
1068 Result = Context.UnsignedShortTy;
1071 Result = Context.UnsignedLongTy;
1074 Result = Context.UnsignedLongLongTy;
1084 diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);
1108 Result = Context.ShortAccumTy;
1111 Result = Context.AccumTy;
1114 Result = Context.LongAccumTy;
1117 llvm_unreachable(
"Unable to specify long long as _Accum width");
1124 Result = Context.getCorrespondingSaturatedType(
Result);
1131 Result = Context.ShortFractTy;
1134 Result = Context.FractTy;
1137 Result = Context.LongFractTy;
1140 llvm_unreachable(
"Unable to specify long long as _Fract width");
1147 Result = Context.getCorrespondingSaturatedType(
Result);
1157 Result = Context.UnsignedInt128Ty;
1159 Result = Context.Int128Ty;
1169 Result = Context.Float16Ty;
1177 Result = Context.BFloat16Ty;
1182 Result = Context.LongDoubleTy;
1184 Result = Context.DoubleTy;
1189 << (S.
getLangOpts().getOpenCLCompatibleVersion() >= 300
1190 ?
"cl_khr_fp64 and __opencl_c_fp64"
1201 Result = Context.Float128Ty;
1208 Result = Context.Ibm128Ty;
1239 "No qualifiers on tag names!");
1252 "Can't handle qualifiers on typedef names yet!");
1265 assert(!
Result.isNull() &&
"Didn't get a type for typeof?");
1266 if (!
Result->isDependentType())
1267 if (
const auto *TT =
Result->getAs<TagType>())
1270 Result = Context.getTypeOfType(
1278 assert(E &&
"Didn't get an expression for typeof?");
1292 assert(E &&
"Didn't get an expression for decltype?");
1310#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
1311#include "clang/Basic/BuiltinTraits.inc"
1313 assert(!
Result.isNull() &&
"Didn't get a type for the transformation?");
1333 TypeConstraintConcept = TemplateId->
Template.get();
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"
1394#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
1395 case DeclSpec::TST_##Name: \
1396 Result = Context.SingletonId; \
1398#include "clang/Basic/HLSLPackedTypes.def"
1409 if (
Result->containsErrors())
1414 bool IsOpenCLC30Compatible =
1424 (IsOpenCLC30Compatible &&
1427 << 0 <<
Result <<
"__opencl_c_images";
1429 }
else if (
Result->isOCLImage3dWOType() &&
1434 << (IsOpenCLC30Compatible
1435 ?
"cl_khr_3d_image_writes and __opencl_c_3d_image_writes"
1436 :
"cl_khr_3d_image_writes");
1448 Context.getPrintingPolicy());
1456 unsigned typeSize =
static_cast<unsigned>(Context.getTypeSize(
Result));
1457 assert(typeSize > 0 &&
"type size for vector must be greater than 0 bits");
1463 Result = Context.getVectorType(
Result, 128/typeSize, VecKind);
1488 if (AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
1499 if (AL.isStandardAttributeSyntax() && AL.isClangScope() &&
1500 !(AL.getKind() == ParsedAttr::AT_MatrixType &&
1502 S.
Diag(AL.getLoc(), diag::warn_type_attribute_deprecated_on_decl)
1530 if (
Result->isFunctionType()) {
1531 unsigned DiagId = diag::warn_typecheck_function_qualifiers_ignored;
1533 DiagId = diag::ext_typecheck_function_qualifiers_unspecified;
1549 if (TypeQuals &&
Result->isReferenceType()) {
1551 S, DS, TypeQuals,
Result,
1553 diag::warn_typecheck_reference_qualifiers);
1560 && TypeQuals &
Result.getCVRQualifiers()) {
1587 if (
Result->isAtomicType()) {
1589 StringRef SpecifierName =
1591 S.
Diag(Loc, diag::err_overflow_behavior_atomic_type)
1592 << SpecifierName <<
Result.getAsString() << 1;
1593 }
else if (!
Result->isIntegerType()) {
1595 StringRef SpecifierName =
1597 S.
Diag(Loc, diag::err_overflow_behavior_non_integer_type)
1598 << SpecifierName <<
Result.getAsString() << 1;
1600 OverflowBehaviorType::OverflowBehaviorKind Kind =
1602 ? OverflowBehaviorType::OverflowBehaviorKind::Wrap
1603 : OverflowBehaviorType::OverflowBehaviorKind::Trap;
1611 assert(!
Result.isNull() &&
"This function should not return a null type");
1628 if (
T->isReferenceType()) {
1636 unsigned DiagID = 0;
1650 DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;
1655 DiagID = diag::err_typecheck_invalid_restrict_not_pointer;
1661 Diag(Loc, DiagID) << EltTy;
1664 if (
T->isArrayType())
1665 DiagCompat(Loc, diag_compat::restrict_on_array_of_pointers);
1669 return Context.getQualifiedType(
T, Qs);
1673 unsigned CVRAU,
const DeclSpec *DS) {
1678 if (
T->isReferenceType())
1707 Split.Quals.addCVRQualifiers(CVR);
1725 if (!
type->isObjCLifetimeType() ||
1735 if (
type.isConstQualified()) {
1741 }
else if (
type->isObjCARCImplicitlyUnretainedType()) {
1759 diag::err_arc_indirect_no_ownership,
type, isReference));
1761 S.
Diag(loc, diag::err_arc_indirect_no_ownership) <<
type << isReference;
1765 assert(implicitLifetime &&
"didn't infer any lifetime!");
1806enum QualifiedFunctionKind { QFK_BlockPointer, QFK_Pointer, QFK_Reference };
1812 QualifiedFunctionKind QFK) {
1819 S.
Diag(Loc, diag::err_compound_qualified_function_type)
1820 << QFK << isa<FunctionType>(
T.IgnoreParens()) <<
T
1831 Diag(Loc, diag::err_qualified_function_typeid)
1848 if (
T->isReferenceType()) {
1850 Diag(Loc, diag::err_illegal_decl_pointer_to_reference)
1858 Diag(Loc, diag::err_opencl_function_pointer) << 0;
1863 Diag(Loc, diag::err_hlsl_pointers_unsupported) << 0;
1870 if (
T->isObjCObjectType())
1871 return Context.getObjCObjectPointerType(
T);
1883 if (
T.isWebAssemblyReferenceType()) {
1884 Diag(Loc, diag::err_wasm_reference_pr) << 0;
1889 if (
T->getUnqualifiedDesugaredType()->isWebAssemblyTableType()) {
1890 Diag(Loc, diag::err_wasm_table_pr) << 0;
1903 "Unresolved overloaded function type");
1930 if (
T->isVoidType()) {
1931 Diag(Loc, diag::err_reference_to_void);
1936 Diag(Loc, diag::err_hlsl_pointers_unsupported) << 1;
1946 Diag(Loc, diag::err_opencl_function_pointer) << 1;
1959 T.isWebAssemblyReferenceType()) {
1960 Diag(Loc, diag::err_wasm_reference_pr) << 1;
1963 if (
T->isWebAssemblyTableType()) {
1964 Diag(Loc, diag::err_wasm_table_pr) << 1;
1970 return Context.getLValueReferenceType(
T, SpelledAsLValue);
1971 return Context.getRValueReferenceType(
T);
1975 if (
T->isPointerType())
1976 return S.
Diag(Loc, diag::err_invalid_pipe_packet_type)
1978 if (
T->isReferenceType())
1979 return S.
Diag(Loc, diag::err_invalid_pipe_packet_type)
1981 if (
T->isBlockPointerType())
1982 return S.
Diag(Loc, diag::err_invalid_pipe_packet_type)
1984 if (!
T->isObjectType())
1985 return S.
Diag(Loc, diag::err_invalid_pipe_packet_type)
1988 return S.
Diag(Loc, diag::err_invalid_pipe_packet_type)
2003 return Context.getWritePipeType(
T);
2009 return Context.getDependentBitIntType(IsUnsigned, BitWidth);
2011 llvm::APSInt Bits(32);
2018 size_t NumBits = Bits.getZExtValue();
2019 if (!IsUnsigned && NumBits < 2) {
2020 Diag(Loc, diag::err_bit_int_bad_size) << 0;
2024 if (IsUnsigned && NumBits < 1) {
2025 Diag(Loc, diag::err_bit_int_bad_size) << 1;
2031 Diag(Loc, diag::err_bit_int_max_size)
2036 return Context.getBitIntType(IsUnsigned, NumBits);
2045 llvm::APSInt &SizeVal,
unsigned VLADiag,
2070 VLADiagnoser(
unsigned VLADiag,
bool VLAIsError)
2071 : VLADiag(VLADiag), VLAIsError(VLAIsError) {}
2075 return S.
Diag(Loc, diag::err_array_size_non_int) <<
T;
2080 IsVLA = !VLAIsError;
2081 return S.
Diag(Loc, VLADiag);
2086 return S.
Diag(Loc, diag::ext_vla_folded_to_constant);
2088 } Diagnoser(VLADiag, VLAIsError);
2092 if (Diagnoser.IsVLA)
2098 EltTy =
Context.getBaseElementType(EltTy);
2106 if (Size.isMultipleOf(Alignment))
2109 Diag(Loc, diag::err_array_element_alignment)
2110 << EltTy << Size.getQuantity() << Alignment.
getQuantity();
2115 const llvm::APSInt &NumElements,
2117 unsigned ActiveSizeBits = NumElements.getActiveBits();
2118 if (!ElementType->isDependentType() && !ElementType->isIncompleteType() &&
2119 !ElementType->isUndeducedType() && ElementType->isConstantSizeType())
2122 Context, ElementType, NumElements));
2126 Diag(Loc, diag::err_array_too_large)
2127 <<
toString(NumElements, 10, NumElements.isSigned(),
2135 Expr *ArraySize,
unsigned Quals,
2154 if (
T->isReferenceType()) {
2155 Diag(Loc, diag::err_illegal_decl_array_of_references)
2160 if (
T->isVoidType() ||
T->isIncompleteArrayType()) {
2161 Diag(Loc, diag::err_array_incomplete_or_sizeless_type) << 0 <<
T;
2166 diag::err_array_of_abstract_type))
2171 if (
Context.getTargetInfo().getCXXABI().isMicrosoft())
2173 if (!MPTy->getQualifier().isDependent())
2179 if (!
T.isWebAssemblyReferenceType() &&
2181 diag::err_array_incomplete_or_sizeless_type))
2186 if (
Context.getTargetInfo().getTriple().isWasm() &&
T->isArrayType()) {
2187 const auto *ATy = dyn_cast<ArrayType>(
T);
2188 if (ATy && ATy->getElementType().isWebAssemblyReferenceType()) {
2189 Diag(Loc, diag::err_wasm_reftype_multidimensional_array);
2194 if (
T->isSizelessType() && !
T.isWebAssemblyReferenceType()) {
2195 Diag(Loc, diag::err_array_incomplete_or_sizeless_type) << 1 <<
T;
2199 if (
T->isFunctionType()) {
2200 Diag(Loc, diag::err_illegal_decl_array_of_functions)
2205 if (
const auto *RD =
T->getAsRecordDecl()) {
2208 if (RD->hasFlexibleArrayMember())
2209 Diag(Loc, diag::ext_flexible_array_in_array) <<
T;
2210 }
else if (
T->isObjCObjectType()) {
2211 Diag(Loc, diag::err_objc_array_of_interfaces) <<
T;
2222 ArraySize =
Result.get();
2226 if (ArraySize && !ArraySize->
isPRValue()) {
2231 ArraySize =
Result.get();
2254 if (
const auto *CondExpr = dyn_cast_if_present<ConditionalOperator>(
2256 std::optional<llvm::APSInt> LHS =
2257 CondExpr->getLHS()->getIntegerConstantExpr(
Context);
2258 std::optional<llvm::APSInt> RHS =
2259 CondExpr->getRHS()->getIntegerConstantExpr(
Context);
2260 return LHS && RHS && LHS->isNegative() != RHS->isNegative();
2270 VLADiag = diag::err_opencl_vla;
2273 VLADiag = diag::warn_vla_used;
2276 VLADiag = diag::err_vla_in_sfinae;
2279 VLADiag = diag::err_openmp_vla_in_task_untied;
2284 ? diag::ext_vla_cxx_in_gnu_mode_static_assert
2285 : diag::ext_vla_cxx_static_assert;
2287 VLADiag =
getLangOpts().GNUMode ? diag::ext_vla_cxx_in_gnu_mode
2288 : diag::ext_vla_cxx;
2291 VLADiag = diag::ext_vla;
2295 llvm::APSInt ConstVal(
Context.getTypeSize(
Context.getSizeType()));
2302 T =
Context.getVariableArrayType(
T,
nullptr, ASM, IndexTypeQuals);
2304 T =
Context.getIncompleteArrayType(
T, ASM, IndexTypeQuals);
2307 T =
Context.getDependentSizedArrayType(
T, ArraySize, ASM, IndexTypeQuals);
2314 if (!R.isUsable()) {
2318 T =
Context.getVariableArrayType(
T, ArraySize, ASM, IndexTypeQuals);
2319 }
else if (!
T->isDependentType() && !
T->isIncompleteType() &&
2320 !
T->isConstantSizeType()) {
2327 T =
Context.getVariableArrayType(
T, ArraySize, ASM, IndexTypeQuals);
2332 if (ConstVal.isSigned() && ConstVal.isNegative()) {
2339 diag::err_typecheck_negative_array_size)
2343 if (ConstVal == 0 && !
T.isWebAssemblyReferenceType()) {
2354 : diag::ext_typecheck_zero_array_size)
2364 T =
Context.getConstantArrayType(
T, ConstVal, ArraySize, ASM,
2369 if (
T->isVariableArrayType()) {
2370 if (!
Context.getTargetInfo().isVLASupported()) {
2374 IsCUDADevice ? diag::err_cuda_vla : diag::err_vla_unsupported)
2375 << (IsCUDADevice ? llvm::to_underlying(
CUDA().CurrentTarget()) : 0);
2379 FSI->setHasVLA(Loc);
2387 : diag::ext_c99_array_usage)
2398 Diag(Loc, diag::err_opencl_invalid_type_array) << ArrType;
2408 bool ForMatrixType =
false) {
2411 if (!llvm::isPowerOf2_32(NumBits))
2412 return S.
Diag(AttrLoc, diag::err_attribute_invalid_bitint_vector_type)
2432 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) << CurType;
2441 return Context.getDependentVectorType(CurType, SizeExpr, AttrLoc,
2444 std::optional<llvm::APSInt> VecSize =
2447 Diag(AttrLoc, diag::err_attribute_argument_type)
2453 if (VecSize->isNegative()) {
2454 Diag(SizeExpr->
getExprLoc(), diag::err_attribute_vec_negative_size);
2459 return Context.getDependentVectorType(CurType, SizeExpr, AttrLoc,
2464 Diag(AttrLoc, diag::err_attribute_size_too_large)
2468 uint64_t VectorSizeBits = VecSize->getZExtValue() * 8;
2469 unsigned TypeSize =
static_cast<unsigned>(
Context.getTypeSize(CurType));
2471 if (VectorSizeBits == 0) {
2472 Diag(AttrLoc, diag::err_attribute_zero_size)
2477 if (!TypeSize || VectorSizeBits % TypeSize) {
2478 Diag(AttrLoc, diag::err_attribute_invalid_size)
2484 Diag(AttrLoc, diag::err_attribute_size_too_large)
2489 return Context.getVectorType(CurType, VectorSizeBits / TypeSize,
2505 if ((!
T->isDependentType() && !
T->isIntegerType() &&
2506 !
T->isRealFloatingType()) ||
2507 T->isEnumeralType() || (IsNoBoolVecLang &&
T->isBooleanType())) {
2508 Diag(AttrLoc, diag::err_attribute_invalid_vector_type) <<
T;
2517 std::optional<llvm::APSInt> VecSize =
2520 Diag(AttrLoc, diag::err_attribute_argument_type)
2526 if (VecSize->isNegative()) {
2527 Diag(SizeExpr->
getExprLoc(), diag::err_attribute_vec_negative_size);
2534 Diag(AttrLoc, diag::err_attribute_size_too_large)
2538 unsigned VectorSize =
static_cast<unsigned>(VecSize->getZExtValue());
2540 if (VectorSize == 0) {
2541 Diag(AttrLoc, diag::err_attribute_zero_size)
2546 if (!
T->isDependentType() &&
2548 Diag(AttrLoc, diag::err_attribute_size_too_large)
2553 return Context.getExtVectorType(
T, VectorSize);
2556 return Context.getDependentSizedExtVectorType(
T, SizeExpr, AttrLoc);
2561 assert(
Context.getLangOpts().MatrixTypes &&
2562 "Should never build a matrix type when it is disabled");
2567 Diag(AttrLoc, diag::err_attribute_invalid_matrix_type) << ElementTy;
2578 return Context.getDependentSizedMatrixType(ElementTy, NumRows, NumCols,
2581 std::optional<llvm::APSInt> ValueRows =
2583 std::optional<llvm::APSInt> ValueColumns =
2590 if (!ValueRows && !ValueColumns) {
2591 Diag(AttrLoc, diag::err_attribute_argument_type)
2599 Diag(AttrLoc, diag::err_attribute_argument_type)
2605 if (!ValueColumns) {
2606 Diag(AttrLoc, diag::err_attribute_argument_type)
2612 unsigned MatrixRows =
static_cast<unsigned>(ValueRows->getZExtValue());
2613 unsigned MatrixColumns =
static_cast<unsigned>(ValueColumns->getZExtValue());
2614 if (MatrixRows == 0 && MatrixColumns == 0) {
2615 Diag(AttrLoc, diag::err_attribute_zero_size)
2616 <<
"matrix" << RowRange << ColRange;
2619 if (MatrixRows == 0) {
2620 Diag(AttrLoc, diag::err_attribute_zero_size) <<
"matrix" << RowRange;
2623 if (MatrixColumns == 0) {
2624 Diag(AttrLoc, diag::err_attribute_zero_size) <<
"matrix" << ColRange;
2627 if (MatrixRows >
Context.getLangOpts().MaxMatrixDimension &&
2628 MatrixColumns >
Context.getLangOpts().MaxMatrixDimension) {
2629 Diag(AttrLoc, diag::err_attribute_size_too_large)
2630 << RowRange << ColRange <<
"matrix row and column";
2633 if (MatrixRows >
Context.getLangOpts().MaxMatrixDimension) {
2634 Diag(AttrLoc, diag::err_attribute_size_too_large)
2635 << RowRange <<
"matrix row";
2638 if (MatrixColumns >
Context.getLangOpts().MaxMatrixDimension) {
2639 Diag(AttrLoc, diag::err_attribute_size_too_large)
2640 << ColRange <<
"matrix column";
2643 return Context.getConstantMatrixType(ElementTy, MatrixRows, MatrixColumns);
2647 if ((
T->isArrayType() && !
getLangOpts().allowArrayReturnTypes()) ||
2648 T->isFunctionType()) {
2649 Diag(Loc, diag::err_func_returning_array_function)
2650 <<
T->isFunctionType() <<
T;
2655 if (
T->isHalfType() && !
getLangOpts().NativeHalfArgsAndReturns &&
2656 !
Context.getTargetInfo().allowHalfArgsAndReturns()) {
2657 Diag(Loc, diag::err_parameters_retval_cannot_have_fp16_type) << 1 <<
2664 if (
T->isObjCObjectType()) {
2665 Diag(Loc, diag::err_object_cannot_be_passed_returned_by_value)
2671 if (
T.getPointerAuth()) {
2672 Diag(Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 0;
2676 if (
T.hasNonTrivialToPrimitiveDestructCUnion() ||
2677 T.hasNonTrivialToPrimitiveCopyCUnion())
2684 Diag(Loc, diag::warn_deprecated_volatile_return) <<
T;
2699 bool emittedError =
false;
2701 enum class RequiredCC { OnlySwift, SwiftOrSwiftAsync };
2702 auto checkCompatible = [&](
unsigned paramIndex, RequiredCC required) {
2704 (required == RequiredCC::OnlySwift)
2707 if (isCompatible || emittedError)
2709 S.
Diag(getParamLoc(paramIndex), diag::err_swift_param_attr_not_swiftcall)
2711 << (required == RequiredCC::OnlySwift);
2712 emittedError =
true;
2714 for (
size_t paramIndex = 0, numParams = paramTypes.size();
2715 paramIndex != numParams; ++paramIndex) {
2726 checkCompatible(paramIndex, RequiredCC::SwiftOrSwiftAsync);
2727 if (paramIndex != 0 &&
2730 S.
Diag(getParamLoc(paramIndex),
2731 diag::err_swift_indirect_result_not_first);
2736 checkCompatible(paramIndex, RequiredCC::SwiftOrSwiftAsync);
2745 checkCompatible(paramIndex, RequiredCC::OnlySwift);
2746 if (paramIndex == 0 ||
2749 S.
Diag(getParamLoc(paramIndex),
2750 diag::err_swift_error_result_not_after_swift_context);
2754 llvm_unreachable(
"bad ABI kind");
2766 for (
unsigned Idx = 0, Cnt = ParamTypes.size(); Idx < Cnt; ++Idx) {
2768 QualType ParamType =
Context.getAdjustedParameterType(ParamTypes[Idx]);
2770 Diag(Loc, diag::err_param_with_void_type);
2773 !
Context.getTargetInfo().allowHalfArgsAndReturns()) {
2775 Diag(Loc, diag::err_parameters_retval_cannot_have_fp16_type) << 0 <<
2779 Diag(Loc, diag::err_wasm_table_as_function_parameter);
2783 Diag(Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
2790 Diag(Loc, diag::warn_deprecated_volatile_param) << ParamType;
2792 ParamTypes[Idx] = ParamType;
2797 [=](
unsigned i) {
return Loc; });
2808 return Context.getFunctionType(
T, ParamTypes, EPI);
2823 D <<
"member pointer";
2831 Diag(Loc, diag::err_distant_exception_spec);
2837 if (
T->isReferenceType()) {
2838 Diag(Loc, diag::err_illegal_decl_mempointer_to_reference)
2843 if (
T->isVoidType()) {
2844 Diag(Loc, diag::err_illegal_decl_mempointer_to_void)
2852 Diag(Loc, diag::err_opencl_function_pointer) << 0;
2857 Diag(Loc, diag::err_hlsl_pointers_unsupported) << 0;
2866 if (
T->isFunctionType())
2875 if (!
T->isFunctionType()) {
2876 Diag(Loc, diag::err_nonfunction_block_type);
2886 return Context.getBlockPointerType(
T);
2892 if (TInfo) *TInfo =
nullptr;
2897 if (
const LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) {
2898 QT = LIT->getType();
2899 TSI = LIT->getTypeSourceInfo();
2909 unsigned chunkIndex);
2916 Sema &S = state.getSema();
2917 Declarator &declarator = state.getDeclarator();
2923 unsigned outermostPointerIndex = 0;
2925 unsigned numPointers = 0;
2927 unsigned chunkIndex = i;
2929 switch (chunk.
Kind) {
2939 outermostPointerIndex = chunkIndex;
2947 if (numPointers != 1)
return;
2949 outermostPointerIndex = chunkIndex;
2967 if (numPointers == 1) {
2985 }
else if (numPointers == 2) {
2998 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership)
3002 outermostPointerIndex);
3024 }
const QualKinds[5] = {
3038 for (
auto &E : QualKinds) {
3039 if (Quals & E.Mask) {
3040 if (!QualStr.empty()) QualStr +=
' ';
3057 << QualStr <<
NumQuals << FixIts[0] << FixIts[1] << FixIts[2] << FixIts[3];
3063 unsigned FunctionChunkIndex) {
3073 for (
unsigned OuterChunkIndex = FunctionChunkIndex + 1,
3075 OuterChunkIndex != End; ++OuterChunkIndex) {
3077 switch (OuterChunk.
Kind) {
3084 diag::warn_qual_return_type,
3110 llvm_unreachable(
"unknown declarator chunk kind");
3131static std::pair<QualType, TypeSourceInfo *>
3135 Sema &S = state.getSema();
3139 const unsigned AutoParameterPosition = Info.
TemplateParams.size();
3152 AutoParameterPosition,
3154 AutoParameterPosition),
3155 false, IsParameterPack,
3156 Auto->isConstrained());
3161 if (
Auto->isConstrained()) {
3168 for (
unsigned Idx = 0; Idx < AutoLoc.
getNumArgs(); ++Idx) {
3228 QualType NewT = state.ReplaceAutoType(
T, Replacement);
3232 return {NewT, NewTSI};
3241 Sema &SemaRef = state.getSema();
3244 ReturnTypeInfo =
nullptr;
3247 TagDecl *OwnedTagDecl =
nullptr;
3297 DeducedType *
Deduced =
T->getContainedDeducedType();
3298 bool DeducedIsTrailingReturnType =
false;
3302 DeducedIsTrailingReturnType =
true;
3312 bool IsCXXAutoType =
3314 bool IsDeducedReturnType =
false;
3364 assert(Info &&
"No LambdaScopeInfo on the stack!");
3370 if (!DeducedIsTrailingReturnType)
3383 llvm_unreachable(
"unhandled tag kind");
3385 Error = Cxx ? 1 : 2;
3388 Error = Cxx ? 3 : 4;
3433 if (!SemaRef.
getLangOpts().CPlusPlus14 || !IsCXXAutoType)
3435 IsDeducedReturnType =
true;
3438 if (!SemaRef.
getLangOpts().CPlusPlus14 || !IsCXXAutoType)
3440 IsDeducedReturnType =
true;
3445 if (IsCXXAutoType && !
Auto->isDecltypeAuto())
3478 (!SemaRef.
getLangOpts().CPlusPlus11 || !IsCXXAutoType))
3484 switch (
Auto->getKeyword()) {
3491 "unknown auto type");
3495 auto *DTST = dyn_cast<DeducedTemplateSpecializationType>(
Deduced);
3498 SemaRef.
Diag(AutoRange.
getBegin(), diag::err_auto_not_allowed)
3511 unsigned DiagId = 0;
3513 DiagId = diag::warn_cxx11_compat_generic_lambda;
3514 else if (IsDeducedReturnType)
3515 DiagId = diag::warn_cxx11_compat_deduced_return_type;
3517 DiagId = diag::warn_cxx98_compat_auto_type_specifier;
3520 SemaRef.
Diag(AutoRange.
getBegin(), DiagId) << AutoRange;
3528 unsigned DiagID = 0;
3534 llvm_unreachable(
"parser should not have allowed this");
3550 DiagID = diag::err_type_defined_in_alias_template;
3562 DiagID = diag::err_type_defined_in_type_specifier;
3572 DiagID = diag::err_type_defined_in_param_type;
3578 DiagID = diag::err_type_defined_in_condition;
3589 assert(!
T.isNull() &&
"This function should not return a null type");
3598 assert(FTI.
isAmbiguous &&
"no direct-initializer / function ambiguity");
3628 FTI.
NumParams ? diag::warn_parens_disambiguated_as_function_declaration
3629 : diag::warn_empty_parens_are_function_decl)
3640 if (Comma.getFileID() != Name.
getFileID() ||
3648 Result.suppressDiagnostics();
3661 S.
Diag(B, diag::note_additional_parens_for_variable_declaration)
3676 S.
Diag(DeclType.
Loc, diag::note_empty_parens_default_ctor)
3684 S.
Diag(DeclType.
Loc, diag::note_empty_parens_zero_initialize)
3695 "do not have redundant top-level parentheses");
3704 bool CouldBeTemporaryObject =
3708 (
T->isRecordType() ||
T->isDependentType()) &&
3711 bool StartsWithDeclaratorId =
true;
3719 StartsWithDeclaratorId =
false;
3724 CouldBeTemporaryObject =
false;
3732 CouldBeTemporaryObject =
false;
3733 StartsWithDeclaratorId =
false;
3743 CouldBeTemporaryObject =
false;
3750 CouldBeTemporaryObject =
false;
3751 StartsWithDeclaratorId =
false;
3761 if (CouldBeTemporaryObject) {
3765 CouldBeTemporaryObject =
false;
3766 Result.suppressDiagnostics();
3771 if (!CouldBeTemporaryObject) {
3795 S.
Diag(
Paren.Loc, diag::warn_redundant_parens_around_declarator)
3801 S.
Diag(
Paren.Loc, diag::warn_parens_disambiguated_as_variable_declaration)
3803 auto *RD =
T->getAsCXXRecordDecl();
3804 if (!RD || !RD->hasDefinition() || RD->hasNonTrivialDestructor())
3805 S.
Diag(
Paren.Loc, diag::note_raii_guard_add_name)
3810 S.
Diag(D.
getBeginLoc(), diag::note_function_style_cast_add_parentheses)
3813 S.
Diag(
Paren.Loc, diag::note_remove_parens_for_variable_declaration)
3829 switch (AL.getKind()) {
3848 bool IsCXXInstanceMethod =
false;
3854 unsigned I = ChunkIndex;
3855 bool FoundNonParen =
false;
3856 while (I && !FoundNonParen) {
3859 FoundNonParen =
true;
3862 if (FoundNonParen) {
3865 IsCXXInstanceMethod =
3870 IsCXXInstanceMethod =
3878 IsCXXInstanceMethod =
3886 IsCXXInstanceMethod);
3894 if (Triple.isSPIRV() && Triple.getVendor() != llvm::Triple::AMD) {
3896 if (AL.getKind() == ParsedAttr::AT_CUDAGlobal) {
3904 for (
const ParsedAttr &AL : llvm::concat<ParsedAttr>(
3907 if (AL.getKind() == ParsedAttr::AT_DeviceKernel) {
3918 enum class SimplePointerKind {
3927 switch (nullability) {
3929 if (!Ident__Nonnull)
3930 Ident__Nonnull =
PP.getIdentifierInfo(
"_Nonnull");
3931 return Ident__Nonnull;
3934 if (!Ident__Nullable)
3935 Ident__Nullable =
PP.getIdentifierInfo(
"_Nullable");
3936 return Ident__Nullable;
3939 if (!Ident__Nullable_result)
3940 Ident__Nullable_result =
PP.getIdentifierInfo(
"_Nullable_result");
3941 return Ident__Nullable_result;
3944 if (!Ident__Null_unspecified)
3945 Ident__Null_unspecified =
PP.getIdentifierInfo(
"_Null_unspecified");
3946 return Ident__Null_unspecified;
3948 llvm_unreachable(
"Unknown nullability kind.");
3955 if (AL.getKind() == ParsedAttr::AT_TypeNonNull ||
3956 AL.getKind() == ParsedAttr::AT_TypeNullable ||
3957 AL.getKind() == ParsedAttr::AT_TypeNullableResult ||
3958 AL.getKind() == ParsedAttr::AT_TypeNullUnspecified)
3967 enum class PointerDeclaratorKind {
3975 MaybePointerToCFRef,
3979 NSErrorPointerPointer,
3985 enum class PointerWrappingDeclaratorKind {
3999static PointerDeclaratorKind
4001 PointerWrappingDeclaratorKind &wrappingKind) {
4002 unsigned numNormalPointers = 0;
4005 if (
type->isDependentType())
4006 return PointerDeclaratorKind::NonPointer;
4011 switch (chunk.
Kind) {
4013 if (numNormalPointers == 0)
4014 wrappingKind = PointerWrappingDeclaratorKind::Array;
4023 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
4024 : PointerDeclaratorKind::SingleLevelPointer;
4030 if (numNormalPointers == 0)
4031 wrappingKind = PointerWrappingDeclaratorKind::Reference;
4035 ++numNormalPointers;
4036 if (numNormalPointers > 2)
4037 return PointerDeclaratorKind::MultiLevelPointer;
4043 unsigned numTypeSpecifierPointers = 0;
4047 ++numNormalPointers;
4049 if (numNormalPointers > 2)
4050 return PointerDeclaratorKind::MultiLevelPointer;
4052 type = ptrType->getPointeeType();
4053 ++numTypeSpecifierPointers;
4059 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
4060 : PointerDeclaratorKind::SingleLevelPointer;
4065 return numNormalPointers > 0 ? PointerDeclaratorKind::MultiLevelPointer
4066 : PointerDeclaratorKind::SingleLevelPointer;
4071 ++numNormalPointers;
4072 ++numTypeSpecifierPointers;
4075 if (
auto objcClassDecl = objcObjectPtr->getInterfaceDecl()) {
4077 numNormalPointers == 2 && numTypeSpecifierPointers < 2) {
4078 return PointerDeclaratorKind::NSErrorPointerPointer;
4087 if (objcClass->getInterface()->getIdentifier() ==
4089 if (numNormalPointers == 2 && numTypeSpecifierPointers < 2)
4090 return PointerDeclaratorKind::NSErrorPointerPointer;
4097 if (numNormalPointers == 0)
4098 return PointerDeclaratorKind::NonPointer;
4102 if (numNormalPointers == 2 && numTypeSpecifierPointers < 2 &&
4104 return PointerDeclaratorKind::CFErrorRefPointer;
4112 switch (numNormalPointers) {
4114 return PointerDeclaratorKind::NonPointer;
4117 return PointerDeclaratorKind::SingleLevelPointer;
4120 return PointerDeclaratorKind::MaybePointerToCFRef;
4123 return PointerDeclaratorKind::MultiLevelPointer;
4132 if (ctx->isFunctionOrMethod())
4135 if (ctx->isFileContext())
4146 bool invalid =
false;
4148 if (invalid || !sloc.
isFile())
4166template <
typename DiagBuilderT>
4175 if (!FixItLoc.
isValid() || FixItLoc == PointerLoc)
4184 InsertionTextBuf +=
" ";
4185 StringRef InsertionText = InsertionTextBuf.str();
4188 InsertionText = InsertionText.drop_back();
4189 }
else if (NextChar[-1] ==
'[') {
4190 if (NextChar[0] ==
']')
4191 InsertionText = InsertionText.drop_back().drop_front();
4193 InsertionText = InsertionText.drop_front();
4196 InsertionText = InsertionText.drop_back().drop_front();
4203 SimplePointerKind PointerKind,
4208 if (PointerKind == SimplePointerKind::Array) {
4209 S.
Diag(PointerLoc, diag::warn_nullability_missing_array);
4211 S.
Diag(PointerLoc, diag::warn_nullability_missing)
4212 <<
static_cast<unsigned>(PointerKind);
4215 auto FixItLoc = PointerEndLoc.
isValid() ? PointerEndLoc : PointerLoc;
4216 if (FixItLoc.isMacroID())
4220 auto Diag = S.
Diag(FixItLoc, diag::note_nullability_fix_it);
4251 if (pointerKind == SimplePointerKind::Array)
4252 diagKind = diag::warn_nullability_missing_array;
4254 diagKind = diag::warn_nullability_missing;
4260 fileNullability.
PointerKind =
static_cast<unsigned>(pointerKind);
4292 auto kind =
static_cast<SimplePointerKind
>(fileNullability.
PointerKind);
4307 unsigned i = endIndex;
4335template<
typename AttrT>
4338 return ::new (Ctx) AttrT(Ctx, AL);
4356 llvm_unreachable(
"unknown NullabilityKind");
4367 if (ASOld != ASNew) {
4368 S.
Diag(AttrLoc, diag::err_attribute_address_multiple_qualifiers);
4373 diag::warn_attribute_address_multiple_identical_qualifiers);
4382 return T->canHaveNullability(
false) &&
4388 T->getCanonicalTypeInternal());
4398 Sema &S = state.getSema();
4408 bool IsTypedefName =
4414 bool IsQualifiedFunction =
T->isFunctionProtoType() &&
4422 if (
auto *DT =
T->getAs<DeducedType>(); DT && !
T->containsErrors()) {
4423 const AutoType *AT =
T->getAs<AutoType>();
4425 if ((AT && AT->isDecltypeAuto()) || IsClassTemplateDeduction) {
4427 unsigned Index = E - I - 1;
4429 unsigned DiagId = IsClassTemplateDeduction
4430 ? diag::err_deduced_class_template_compound_type
4431 : diag::err_decltype_auto_compound_type;
4432 unsigned DiagKind = 0;
4433 switch (DeclChunk.
Kind) {
4437 if (IsClassTemplateDeduction) {
4445 DiagId = diag::err_decltype_auto_function_declarator_not_declaration;
4463 S.
Diag(DeclChunk.
Loc, DiagId) << DiagKind;
4472 bool inferNullabilityCS =
false;
4473 bool inferNullabilityInnerOnly =
false;
4474 bool inferNullabilityInnerOnlyComplete =
false;
4477 bool inAssumeNonNullRegion =
false;
4479 if (assumeNonNullLoc.
isValid()) {
4480 inAssumeNonNullRegion =
true;
4494 } complainAboutMissingNullability = CAMN_No;
4495 unsigned NumPointersRemaining = 0;
4496 auto complainAboutInferringWithinChunk = PointerWrappingDeclaratorKind::None;
4498 if (IsTypedefName) {
4502 complainAboutMissingNullability = CAMN_InnerPointers;
4506 ++NumPointersRemaining;
4511 switch (chunk.
Kind) {
4519 ++NumPointersRemaining;
4527 ++NumPointersRemaining;
4532 bool isFunctionOrMethod =
false;
4533 switch (
auto context = state.getDeclarator().getContext()) {
4539 isFunctionOrMethod =
true;
4543 if (state.getDeclarator().isObjCIvar() && !isFunctionOrMethod) {
4544 complainAboutMissingNullability = CAMN_No;
4549 if (state.getDeclarator().isObjCWeakProperty()) {
4552 complainAboutMissingNullability = CAMN_No;
4553 if (inAssumeNonNullRegion) {
4563 complainAboutMissingNullability = CAMN_Yes;
4566 auto wrappingKind = PointerWrappingDeclaratorKind::None;
4568 case PointerDeclaratorKind::NonPointer:
4569 case PointerDeclaratorKind::MultiLevelPointer:
4573 case PointerDeclaratorKind::SingleLevelPointer:
4575 if (inAssumeNonNullRegion) {
4576 complainAboutInferringWithinChunk = wrappingKind;
4583 case PointerDeclaratorKind::CFErrorRefPointer:
4584 case PointerDeclaratorKind::NSErrorPointerPointer:
4587 if (isFunctionOrMethod && inAssumeNonNullRegion)
4591 case PointerDeclaratorKind::MaybePointerToCFRef:
4592 if (isFunctionOrMethod) {
4596 auto hasCFReturnsAttr =
4598 return AttrList.hasAttribute(ParsedAttr::AT_CFReturnsRetained) ||
4599 AttrList.hasAttribute(ParsedAttr::AT_CFReturnsNotRetained);
4604 hasCFReturnsAttr(InnermostChunk->getAttrs()) ||
4607 inferNullabilityInnerOnly =
true;
4617 complainAboutMissingNullability = CAMN_Yes;
4645 auto isVaList = [&S](
QualType T) ->
bool {
4651 if (typedefTy->getDecl() == vaListTypedef)
4653 if (
auto *name = typedefTy->getDecl()->getIdentifier())
4654 if (name->isStr(
"va_list"))
4656 typedefTy = typedefTy->desugar()->getAs<
TypedefType>();
4657 }
while (typedefTy);
4663 auto inferPointerNullability =
4668 if (NumPointersRemaining > 0)
4669 --NumPointersRemaining;
4676 if (inferNullability && !inferNullabilityInnerOnlyComplete) {
4679 ? ParsedAttr::Form::ContextSensitiveKeyword()
4680 : ParsedAttr::Form::Keyword(
false ,
4686 attrs.addAtEnd(nullabilityAttr);
4688 if (inferNullabilityCS) {
4689 state.getDeclarator().getMutableDeclSpec().getObjCQualifiers()
4693 if (pointerLoc.isValid() &&
4694 complainAboutInferringWithinChunk !=
4695 PointerWrappingDeclaratorKind::None) {
4697 S.
Diag(pointerLoc, diag::warn_nullability_inferred_on_nested_type);
4702 if (inferNullabilityInnerOnly)
4703 inferNullabilityInnerOnlyComplete =
true;
4704 return nullabilityAttr;
4709 switch (complainAboutMissingNullability) {
4713 case CAMN_InnerPointers:
4714 if (NumPointersRemaining == 0)
4730 if (NumPointersRemaining > 0)
4731 --NumPointersRemaining;
4733 SimplePointerKind pointerKind = SimplePointerKind::Pointer;
4734 if (
T->isBlockPointerType())
4735 pointerKind = SimplePointerKind::BlockPointer;
4736 else if (
T->isMemberPointerType())
4737 pointerKind = SimplePointerKind::MemberPointer;
4739 if (
auto *
attr = inferPointerNullability(
4744 T = state.getAttributedType(
4750 if (complainAboutMissingNullability == CAMN_Yes &&
T->isArrayType() &&
4758 bool ExpectNoDerefChunk =
4759 state.getCurrentAttributes().hasAttribute(ParsedAttr::AT_NoDeref);
4769 bool AreDeclaratorChunksValid =
true;
4771 unsigned chunkIndex = e - i - 1;
4772 state.setCurrentChunkIndex(chunkIndex);
4775 switch (DeclType.
Kind) {
4783 if (!LangOpts.Blocks)
4784 S.
Diag(DeclType.
Loc, diag::err_blocks_disable) << LangOpts.OpenCL;
4787 inferPointerNullability(SimplePointerKind::BlockPointer, DeclType.
Loc,
4789 state.getDeclarator().getAttributePool());
4795 if (LangOpts.OpenCL)
4810 inferPointerNullability(SimplePointerKind::Pointer, DeclType.
Loc,
4812 state.getDeclarator().getAttributePool());
4815 T = Context.getObjCObjectPointerType(
T);
4824 if (LangOpts.OpenCL) {
4825 if (
T->isImageType() ||
T->isSamplerT() ||
T->isPipeType() ||
4826 T->isBlockPointerType()) {
4840 diag::err_overflow_behavior_non_integer_type)
4874 if (chunkIndex != 0 && !ArraySize &&
4893 S.
Diag(DeclType.
Loc, diag::err_array_star_outside_prototype);
4904 S.
Diag(DeclType.
Loc, diag::err_array_static_outside_prototype)
4906 :
"type qualifier");
4917 S.
Diag(DeclType.
Loc, diag::err_array_static_not_outermost)
4919 :
"type qualifier");
4929 if (complainAboutMissingNullability == CAMN_Yes &&
4945 IsQualifiedFunction =
4951 return SS.isInvalid() ||
4952 isa_and_present<CXXRecordDecl>(
4977 if (
First &&
First->isExplicitObjectParameter() &&
4991 diag::err_explicit_object_parameter_nonmember)
4992 << 2 << 0 <<
First->getSourceRange();
4995 diag::err_explicit_object_parameter_invalid)
4996 <<
First->getSourceRange();
5002 AreDeclaratorChunksValid =
false;
5015 ? diag::err_auto_missing_trailing_return
5016 : diag::err_deduced_return_type);
5019 AreDeclaratorChunksValid =
false;
5022 diag::warn_cxx11_compat_deduced_return_type);
5031 AreDeclaratorChunksValid =
false;
5034 if (
T != Context.DependentTy) {
5036 diag::err_deduction_guide_with_complex_decl)
5040 AreDeclaratorChunksValid =
false;
5057 S.
Diag(Loc, diag::err_trailing_return_without_auto) <<
T << SR;
5060 AreDeclaratorChunksValid =
false;
5067 }
else if (AutoType *
Auto =
T->getContainedAutoType()) {
5076 if (InventedParamInfo) {
5078 state,
T, TInfo,
Auto, *InventedParamInfo);
5091 T->isFunctionType()) &&
5094 unsigned diagID = diag::err_func_returning_array_function;
5097 if (chunkIndex == 0 &&
5099 diagID = diag::err_block_returning_array_function;
5100 S.
Diag(DeclType.
Loc, diagID) <<
T->isFunctionType() <<
T;
5103 AreDeclaratorChunksValid =
false;
5108 if (
T->isHalfType()) {
5116 }
else if (!S.
getLangOpts().NativeHalfArgsAndReturns &&
5119 diag::err_parameters_retval_cannot_have_fp16_type) << 1;
5125 if (
T.getPointerAuth()) {
5126 S.
Diag(DeclType.
Loc, diag::err_ptrauth_qualifier_invalid) <<
T << 0;
5129 if (LangOpts.OpenCL) {
5132 if (
T->isBlockPointerType() ||
T->isImageType() ||
T->isSamplerT() ||
5143 "__cl_clang_variadic_functions", S.
getLangOpts()) &&
5155 if (
T->isObjCObjectType()) {
5164 S.
Diag(DiagLoc, diag::err_object_cannot_be_passed_returned_by_value)
5168 T = Context.getObjCObjectPointerType(
T);
5176 AreDeclaratorChunksValid =
false;
5184 if ((
T.getCVRQualifiers() ||
T->isAtomicType()) &&
5188 (
T->isRecordType() ||
T->isDependentType() ||
5189 T->isUndeducedAutoType()))) {
5196 S.
Diag(DeclType.
Loc, diag::err_func_returning_qualified_void) <<
T;
5203 if (
T.isVolatileQualified() && S.
getLangOpts().CPlusPlus20)
5204 S.
Diag(DeclType.
Loc, diag::warn_deprecated_volatile_return) <<
T;
5209 if (
T.getQualifiers().hasObjCLifetime()) {
5214 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership) {
5215 AttrLoc = AL.getLoc();
5222 if (AL.getKind() == ParsedAttr::AT_ObjCOwnership) {
5223 AttrLoc = AL.getLoc();
5237 S.
Diag(AttrLoc, diag::warn_arc_lifetime_result_type)
5238 <<
T.getQualifiers().getObjCLifetime();
5246 S.
Diag(Tag->getLocation(), diag::err_type_defined_in_result_type)
5247 << Context.getCanonicalTagType(Tag);
5254 diag::err_exception_spec_in_typedef)
5272 T = Context.getFunctionNoProtoType(
T, EI);
5280 diag::warn_c17_compat_ellipsis_only_parameter);
5282 ParsedAttr::AT_Overloadable) &&
5284 ParsedAttr::AT_Overloadable) &&
5286 ParsedAttr::AT_Overloadable))
5294 diag::err_ident_list_in_fn_declaration);
5298 ? Context.getFunctionNoProtoType(
T, EI)
5300 AreDeclaratorChunksValid =
false;
5323 bool HasAnyInterestingExtParameterInfos =
false;
5325 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
5327 QualType ParamTy = Param->getType();
5328 assert(!ParamTy.
isNull() &&
"Couldn't parse type?");
5339 ParamTy = Context.IntTy;
5340 Param->setType(ParamTy);
5344 ParamTy = Context.IntTy;
5345 Param->setType(ParamTy);
5349 S.
Diag(DeclType.
Loc, diag::err_void_param_qualified);
5351 for (
const auto *A : Param->attrs()) {
5352 S.
Diag(A->getLoc(), diag::warn_attribute_on_void_param)
5353 << A << A->getRange();
5358 if (Param->isExplicitObjectParameter()) {
5359 S.
Diag(Param->getLocation(),
5360 diag::err_void_explicit_object_param);
5373 S.
Diag(Param->getLocation(), diag::err_opencl_invalid_param)
5376 Param->setInvalidDecl();
5378 }
else if (!S.
getLangOpts().NativeHalfArgsAndReturns &&
5380 S.
Diag(Param->getLocation(),
5381 diag::err_parameters_retval_cannot_have_fp16_type) << 0;
5385 if (Context.isPromotableIntegerType(ParamTy)) {
5386 ParamTy = Context.getPromotedIntegerType(ParamTy);
5387 Param->setKNRPromoted(
true);
5389 if (BTy->getKind() == BuiltinType::Float) {
5390 ParamTy = Context.DoubleTy;
5391 Param->setKNRPromoted(
true);
5396 S.
Diag(Param->getLocation(), diag::err_opencl_invalid_param)
5401 if (LangOpts.ObjCAutoRefCount && Param->hasAttr<NSConsumedAttr>()) {
5402 ExtParameterInfos[i] = ExtParameterInfos[i].withIsConsumed(
true);
5403 HasAnyInterestingExtParameterInfos =
true;
5407 ExtParameterInfos[i] =
5408 ExtParameterInfos[i].withABI(
attr->getABI());
5409 HasAnyInterestingExtParameterInfos =
true;
5412 if (Param->hasAttr<PassObjectSizeAttr>()) {
5413 ExtParameterInfos[i] = ExtParameterInfos[i].withHasPassObjectSize();
5414 HasAnyInterestingExtParameterInfos =
true;
5417 if (Param->hasAttr<NoEscapeAttr>()) {
5418 ExtParameterInfos[i] = ExtParameterInfos[i].withIsNoEscape(
true);
5419 HasAnyInterestingExtParameterInfos =
true;
5422 ParamTys.push_back(ParamTy);
5425 if (HasAnyInterestingExtParameterInfos) {
5434 Expr *NoexceptExpr =
nullptr;
5440 DynamicExceptions.reserve(N);
5441 DynamicExceptionRanges.reserve(N);
5442 for (
unsigned I = 0; I != N; ++I) {
5453 DynamicExceptionRanges,
5460 auto IsClassMember = [&]() {
5461 return (!state.getDeclarator().getCXXScopeSpec().isEmpty() &&
5462 state.getDeclarator()
5466 state.getDeclarator().getContext() ==
5468 state.getDeclarator().getContext() ==
5472 if (state.getSema().getLangOpts().OpenCLCPlusPlus && IsClassMember()) {
5492 T = Context.getFunctionType(
T, ParamTys, EPI);
5501 inferPointerNullability(SimplePointerKind::MemberPointer, DeclType.
Loc,
5503 state.getDeclarator().getAttributePool());
5508 AreDeclaratorChunksValid =
false;
5517 AreDeclaratorChunksValid =
false;
5536 AreDeclaratorChunksValid =
false;
5545 S.
Diag(DeclType.
Loc, diag::warn_noderef_on_non_pointer_or_array);
5547 ExpectNoDerefChunk = state.didParseNoDeref();
5551 if (ExpectNoDerefChunk)
5552 S.
Diag(state.getDeclarator().getBeginLoc(),
5553 diag::warn_noderef_on_non_pointer_or_array);
5566 bool IsBlock =
false;
5568 switch (DeclType.Kind) {
5580 S.
Diag(DeclType.Loc, diag::warn_strict_prototypes)
5592 assert(!
T.isNull() &&
"T must not be null after this point");
5594 if (LangOpts.CPlusPlus &&
T->isFunctionType()) {
5596 assert(FnTy &&
"Why oh why is there not a FunctionProtoType here?");
5609 ExplicitObjectMember,
5613 Kind = DeductionGuide;
5630 auto *P = dyn_cast_or_null<ParmVarDecl>(Chunk.
Fun.
Params->
Param);
5631 if (P && P->isExplicitObjectParameter())
5632 Kind = ExplicitObjectMember;
5658 if (IsQualifiedFunction &&
5684 if (!RemovalLocs.empty()) {
5685 llvm::sort(RemovalLocs,
5687 RemovalRange =
SourceRange(RemovalLocs.front(), RemovalLocs.back());
5688 Loc = RemovalLocs.front();
5692 S.
Diag(Loc, diag::err_invalid_qualified_function_type)
5716 if (!AL.slidesFromDeclToDeclSpecLegacyBehavior()) {
5724 state.diagnoseIgnoredTypeAttrs(
T);
5735 if (
T.isVolatileQualified() && S.
getLangOpts().CPlusPlus20 &&
5760 if (!
T->containsUnexpandedParameterPack() &&
5761 (!LangOpts.CPlusPlus20 || !
T->getContainedAutoType())) {
5763 diag::err_function_parameter_pack_without_parameter_packs)
5767 T = Context.getPackExpansionType(
T, std::nullopt,
5780 if (
T->containsUnexpandedParameterPack())
5781 T = Context.getPackExpansionType(
T, std::nullopt);
5813 diag::err_ellipsis_in_declarator_not_parameter);
5819 assert(!
T.isNull() &&
"T must not be null at the end of this function");
5820 if (!AreDeclaratorChunksValid)
5821 return Context.getTrivialTypeSourceInfo(
T);
5823 if (state.didParseHLSLParamMod() && !
T->isConstantArrayType())
5832 TypeProcessingState state(*
this, D);
5855 unsigned chunkIndex) {
5856 Sema &S = state.getSema();
5864 const char *attrStr =
nullptr;
5865 switch (ownership) {
5883 &Args, 1, ParsedAttr::Form::GNU());
5892 Sema &S = state.getSema();
5896 bool hasIndirection =
false;
5899 switch (chunk.
Kind) {
5908 hasIndirection =
true;
5941 TypeProcessingState state(*
this, D);
5956 TypeProcessingState &State) {
5961 TypeProcessingState &State) {
5963 State.getSema().HLSL().TakeLocForHLSLAttribute(TL.
getTypePtr());
5971 if (AL.getKind() == ParsedAttr::AT_MatrixType) {
5980 llvm_unreachable(
"no matrix_type attribute found at the expected location!");
5985 switch (Chunk.
Kind) {
5990 llvm_unreachable(
"cannot be _Atomic qualified");
6008 class TypeSpecLocFiller :
public TypeLocVisitor<TypeSpecLocFiller> {
6010 ASTContext &Context;
6011 TypeProcessingState &State;
6015 TypeSpecLocFiller(Sema &S, ASTContext &Context, TypeProcessingState &State,
6017 : SemaRef(S), Context(Context), State(State), DS(DS) {}
6019 void VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6023 void VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
6026 void VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
6029 void VisitHLSLAttributedResourceTypeLoc(HLSLAttributedResourceTypeLoc TL) {
6033 void VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {}
6034 void VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
6037 State.getExpansionLocForMacroQualifiedType(TL.
getTypePtr()));
6039 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6044 void VisitPointerTypeLoc(PointerTypeLoc TL) { Visit(TL.
getNextTypeLoc()); }
6045 void VisitTypedefTypeLoc(TypedefTypeLoc TL) {
6047 TypeSourceInfo *TInfo =
nullptr;
6060 void VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
6062 TypeSourceInfo *TInfo =
nullptr;
6075 void VisitUsingTypeLoc(UsingTypeLoc TL) {
6077 TypeSourceInfo *TInfo =
nullptr;
6090 void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
6097 void VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
6098 TypeSourceInfo *RepTInfo =
nullptr;
6102 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6103 TypeSourceInfo *RepTInfo =
nullptr;
6107 void VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
6108 TypeSourceInfo *TInfo =
nullptr;
6119 TL.
copy(OldTL.
castAs<TemplateSpecializationTypeLoc>());
6121 OldTL.
castAs<TemplateSpecializationTypeLoc>().getRAngleLoc());
6123 void VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6129 void VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6135 TypeSourceInfo *TInfo =
nullptr;
6139 void VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
6144 void VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
6146 TypeSourceInfo *TInfo =
nullptr;
6150 void VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6155 TypeSourceInfo *TInfo =
nullptr;
6159 void VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6172 void VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6174 TypeSourceInfo *TInfo =
nullptr;
6179 void VisitAutoTypeLoc(AutoTypeLoc TL) {
6193 NestedNameSpecifierLoc NNS =
6196 : NestedNameSpecifierLoc());
6197 TemplateArgumentListInfo TemplateArgsInfo(TemplateId->
LAngleLoc,
6199 if (TemplateId->
NumArgs > 0) {
6208 NamedDecl *FoundDecl;
6213 FoundDecl = cast_if_present<NamedDecl>(TN.getAsTemplateDecl());
6221 void VisitDeducedTemplateSpecializationTypeLoc(
6222 DeducedTemplateSpecializationTypeLoc TL) {
6224 TypeSourceInfo *TInfo =
nullptr;
6230 void VisitTagTypeLoc(TagTypeLoc TL) {
6232 TypeSourceInfo *TInfo =
nullptr;
6240 ElaboratedTypeKeyword::None
6242 : SourceLocation());
6246 void VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6253 TypeSourceInfo *TInfo =
nullptr;
6265 void VisitPipeTypeLoc(PipeTypeLoc TL) {
6268 TypeSourceInfo *TInfo =
nullptr;
6273 void VisitExtIntTypeLoc(BitIntTypeLoc TL) {
6277 void VisitDependentExtIntTypeLoc(DependentBitIntTypeLoc TL) {
6281 void VisitTypeLoc(TypeLoc TL) {
6287 class DeclaratorLocFiller :
public TypeLocVisitor<DeclaratorLocFiller> {
6288 ASTContext &Context;
6289 TypeProcessingState &State;
6290 const DeclaratorChunk &Chunk;
6293 DeclaratorLocFiller(ASTContext &Context, TypeProcessingState &State,
6294 const DeclaratorChunk &Chunk)
6295 : Context(Context), State(State), Chunk(Chunk) {}
6297 void VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6298 llvm_unreachable(
"qualified type locs not expected here!");
6300 void VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6301 llvm_unreachable(
"decayed type locs not expected here!");
6303 void VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
6304 llvm_unreachable(
"array parameter type locs not expected here!");
6307 void VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6310 void VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
6313 void VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
6316 void VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
6319 void VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6322 void VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6326 void VisitPointerTypeLoc(PointerTypeLoc TL) {
6330 void VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6334 void VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6339 void VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6345 void VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6350 void VisitArrayTypeLoc(ArrayTypeLoc TL) {
6356 void VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6361 const DeclaratorChunk::FunctionTypeInfo &FTI = Chunk.
Fun;
6364 for (
unsigned i = 0, e = TL.
getNumParams(), tpi = 0; i != e; ++i) {
6370 void VisitParenTypeLoc(ParenTypeLoc TL) {
6375 void VisitPipeTypeLoc(PipeTypeLoc TL) {
6379 void VisitBitIntTypeLoc(BitIntTypeLoc TL) {
6382 void VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
6385 void VisitVectorTypeLoc(VectorTypeLoc TL) { TL.
setNameLoc(Chunk.
Loc); }
6386 void VisitDependentVectorTypeLoc(DependentVectorTypeLoc TL) {
6389 void VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6392 void VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6396 VisitDependentSizedExtVectorTypeLoc(DependentSizedExtVectorTypeLoc TL) {
6399 void VisitMatrixTypeLoc(MatrixTypeLoc TL) {
6403 void VisitTypeLoc(TypeLoc TL) {
6404 llvm_unreachable(
"unsupported TypeLoc kind in declarator!");
6415 if (AL.getKind() != ParsedAttr::AT_AddressSpace || AL.isInvalid() ||
6416 AL.getNumArgs() != 1 || !AL.isArgExpr(0))
6426 "no address_space attribute found at the expected location!");
6440 Sema &S = State.getSema();
6466 bool HasDesugaredTypeLoc =
true;
6467 while (HasDesugaredTypeLoc) {
6469 case TypeLoc::MacroQualified: {
6472 State.getExpansionLocForMacroQualifiedType(TL.
getTypePtr()));
6477 case TypeLoc::Attributed: {
6484 case TypeLoc::Adjusted:
6485 case TypeLoc::BTFTagAttributed: {
6490 case TypeLoc::DependentAddressSpace: {
6504 HasDesugaredTypeLoc =
false;
6515 if (ReturnTypeInfo) {
6535 "LocInfoType's TypeClass conflicts with an existing Type class");
6541 llvm_unreachable(
"LocInfoType leaked into the type system; an opaque TypeTy*"
6542 " was used directly instead of getting the QualType through"
6543 " GetTypeFromParser");
6550 "Type name should have no identifier!");
6587 const Expr *AddrSpace,
6590 std::optional<llvm::APSInt> OptAddrSpace =
6592 if (!OptAddrSpace) {
6593 S.
Diag(AttrLoc, diag::err_attribute_argument_type)
6598 llvm::APSInt &addrSpace = *OptAddrSpace;
6601 if (addrSpace.isSigned()) {
6602 if (addrSpace.isNegative()) {
6603 S.
Diag(AttrLoc, diag::err_attribute_address_space_negative)
6607 addrSpace.setIsSigned(
false);
6610 llvm::APSInt
max(addrSpace.getBitWidth());
6614 if (addrSpace >
max) {
6615 S.
Diag(AttrLoc, diag::err_attribute_address_space_too_high)
6637 return Context.getAddrSpaceQualType(
T, ASIdx);
6646 Diag(AttrLoc, diag::err_attribute_address_multiple_qualifiers);
6650 return Context.getDependentAddressSpaceType(
T, AddrSpace, AttrLoc);
6662 TypeProcessingState &State) {
6663 Sema &S = State.getSema();
6666 auto *StrLiteral = dyn_cast<StringLiteral>(
Attr.getArgAsExpr(0));
6675 StringRef BTFTypeTag = StrLiteral->getString();
6676 Type = State.getBTFTagAttributedType(
6677 ::new (Ctx) BTFTypeTagAttr(Ctx,
Attr, BTFTypeTag),
Type);
6685 TypeProcessingState &State) {
6686 Sema &S = State.getSema();
6691 S.
Diag(
Attr.
getLoc(), diag::err_attribute_address_function_type);
6697 if (
Attr.
getKind() == ParsedAttr::AT_AddressSpace) {
6700 if (
Attr.getNumArgs() != 1) {
6707 Expr *ASArgExpr =
Attr.getArgAsExpr(0);
6716 ::new (Ctx) AddressSpaceAttr(Ctx,
Attr,
static_cast<unsigned>(ASIdx));
6728 if (EquivType.
isNull()) {
6732 T = State.getAttributedType(ASAttr,
Type, EquivType);
6734 T = State.getAttributedType(ASAttr,
Type,
Type);
6749 ASIdx =
Attr.asHLSLLangAS();
6752 llvm_unreachable(
"Invalid address space");
6765 TypeProcessingState &State) {
6766 Sema &S = State.getSema();
6770 S.
Diag(
Attr.
getLoc(), diag::warn_overflow_behavior_attribute_disabled)
6777 if (
Attr.getNumArgs() != 1) {
6778 S.
Diag(
Attr.
getLoc(), diag::err_attribute_wrong_number_arguments)
6787 <<
Attr <<
Type.getAsString() << 0;
6794 S.
Diag(
Attr.
getLoc(), diag::err_overflow_behavior_non_integer_type)
6795 <<
Attr <<
Type.getAsString() << 0;
6800 StringRef KindName =
"";
6803 if (
Attr.isArgIdent(0)) {
6804 Ident =
Attr.getArgAsIdent(0)->getIdentifierInfo();
6813 auto *Str = dyn_cast<StringLiteral>(
Attr.getArgAsExpr(0));
6815 KindName = Str->getString();
6824 OverflowBehaviorType::OverflowBehaviorKind Kind;
6825 if (KindName ==
"wrap") {
6826 Kind = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
6827 }
else if (KindName ==
"trap") {
6828 Kind = OverflowBehaviorType::OverflowBehaviorKind::Trap;
6831 << KindName <<
Attr;
6837 const DeclSpec &DS = State.getDeclarator().getDeclSpec();
6841 OverflowBehaviorType::OverflowBehaviorKind SpecifierKind =
6842 DS.
isWrapSpecified() ? OverflowBehaviorType::OverflowBehaviorKind::Wrap
6843 : OverflowBehaviorType::OverflowBehaviorKind::Trap;
6845 if (SpecifierKind != Kind) {
6848 << 1 << SpecifierName << KindName;
6852 S.
Diag(
Attr.
getLoc(), diag::warn_redundant_overflow_behaviors_mixed)
6859 if (
const auto *ExistingOBT =
Type->
getAs<OverflowBehaviorType>()) {
6860 OverflowBehaviorType::OverflowBehaviorKind ExistingKind =
6861 ExistingOBT->getBehaviorKind();
6862 if (ExistingKind != Kind) {
6863 S.
Diag(
Attr.
getLoc(), diag::err_conflicting_overflow_behaviors) << 0;
6864 if (Kind == OverflowBehaviorType::OverflowBehaviorKind::Trap) {
6865 Type = State.getOverflowBehaviorType(Kind,
6866 ExistingOBT->getUnderlyingType());
6871 Type = State.getOverflowBehaviorType(Kind,
Type);
6881 bool NonObjCPointer =
false;
6883 if (!
type->isDependentType() && !
type->isUndeducedType()) {
6891 NonObjCPointer =
true;
6892 }
else if (!
type->isObjCRetainableType()) {
6898 if (state.isProcessingDeclSpec()) {
6906 Sema &S = state.getSema();
6912 if (!
attr.isArgIdent(0)) {
6913 S.
Diag(AttrLoc, diag::err_attribute_argument_type) <<
attr
6921 if (II->
isStr(
"none"))
6923 else if (II->
isStr(
"strong"))
6925 else if (II->
isStr(
"weak"))
6927 else if (II->
isStr(
"autoreleasing"))
6930 S.
Diag(AttrLoc, diag::warn_attribute_type_not_supported) <<
attr << II;
6947 =
type.getQualifiers().getObjCLifetime()) {
6950 S.
Diag(AttrLoc, diag::err_attr_objc_ownership_redundant)
6957 if (previousLifetime != lifetime) {
6960 const Type *prevTy =
nullptr;
6961 while (!prevTy || prevTy != underlyingType.
Ty) {
6962 prevTy = underlyingType.
Ty;
6971 if (NonObjCPointer) {
6972 StringRef name =
attr.getAttrName()->getName();
6981 S.
Diag(AttrLoc, diag::warn_type_attribute_wrong_type) << name
6998 type = state.getAttributedType(
7005 if (!NonObjCPointer)
7022 diagnostic,
type, 0));
7024 S.
Diag(loc, diagnostic);
7033 unsigned diagnostic =
7034 (S.
getLangOpts().ObjCWeakRuntime ? diag::err_arc_weak_disabled
7035 : diag::err_arc_weak_no_runtime);
7038 diagnoseOrDelay(S, AttrLoc, diagnostic,
type);
7050 if (Class->isArcWeakrefUnavailable()) {
7051 S.
Diag(AttrLoc, diag::err_arc_unsupported_weak_class);
7052 S.
Diag(ObjT->getInterfaceDecl()->getLocation(),
7053 diag::note_class_declared);
7068 Sema &S = state.getSema();
7071 if (!
type->isPointerType() &&
7072 !
type->isObjCObjectPointerType() &&
7073 !
type->isBlockPointerType())
7077 S.
Diag(
attr.getLoc(), diag::err_attribute_multiple_objc_gc);
7083 if (!
attr.isArgIdent(0)) {
7084 S.
Diag(
attr.getLoc(), diag::err_attribute_argument_type)
7090 if (
attr.getNumArgs() > 1) {
7091 S.
Diag(
attr.getLoc(), diag::err_attribute_wrong_number_arguments) <<
attr
7098 if (II->
isStr(
"weak"))
7100 else if (II->
isStr(
"strong"))
7103 S.
Diag(
attr.getLoc(), diag::warn_attribute_type_not_supported)
7113 if (
attr.getLoc().isValid())
7114 type = state.getAttributedType(
7131 struct FunctionTypeUnwrapper {
7145 const FunctionType *
Fn;
7146 SmallVector<
unsigned char , 8> Stack;
7148 FunctionTypeUnwrapper(Sema &S, QualType
T) : Original(
T) {
7150 const Type *Ty =
T.getTypePtr();
7160 Stack.push_back(
Array);
7166 Stack.push_back(BlockPointer);
7169 Stack.push_back(MemberPointer);
7175 Stack.push_back(Attributed);
7178 Stack.push_back(MacroQualified);
7186 T = QualType(DTy, 0);
7187 Stack.push_back(Desugar);
7192 bool isFunctionType()
const {
return (Fn !=
nullptr); }
7193 const FunctionType *get()
const {
return Fn; }
7195 QualType wrap(Sema &S,
const FunctionType *
New) {
7197 if (
New == get())
return Original;
7200 return wrap(S.
Context, Original, 0);
7204 QualType wrap(ASTContext &
C, QualType Old,
unsigned I) {
7205 if (I == Stack.size())
7210 SplitQualType SplitOld = Old.
split();
7214 return wrap(
C, SplitOld.
Ty, I);
7215 return C.getQualifiedType(wrap(
C, SplitOld.
Ty, I), SplitOld.
Quals);
7218 QualType wrap(ASTContext &
C,
const Type *Old,
unsigned I) {
7219 if (I == Stack.size())
return QualType(Fn, 0);
7221 switch (
static_cast<WrapKind
>(Stack[I++])) {
7232 return C.getParenType(
New);
7235 case MacroQualified:
7239 if (
const auto *CAT = dyn_cast<ConstantArrayType>(Old)) {
7240 QualType
New = wrap(
C, CAT->getElementType(), I);
7241 return C.getConstantArrayType(
New, CAT->getSize(), CAT->getSizeExpr(),
7242 CAT->getSizeModifier(),
7243 CAT->getIndexTypeCVRQualifiers());
7246 if (
const auto *VAT = dyn_cast<VariableArrayType>(Old)) {
7247 QualType
New = wrap(
C, VAT->getElementType(), I);
7248 return C.getVariableArrayType(
New, VAT->getSizeExpr(),
7249 VAT->getSizeModifier(),
7250 VAT->getIndexTypeCVRQualifiers());
7254 QualType
New = wrap(
C, IAT->getElementType(), I);
7255 return C.getIncompleteArrayType(
New, IAT->getSizeModifier(),
7256 IAT->getIndexTypeCVRQualifiers());
7261 return C.getPointerType(
New);
7264 case BlockPointer: {
7266 return C.getBlockPointerType(
New);
7269 case MemberPointer: {
7282 return C.getRValueReferenceType(
New);
7286 llvm_unreachable(
"unknown wrapping kind");
7293 Sema &S = State.getSema();
7297 default: llvm_unreachable(
"Unknown attribute kind");
7298 case ParsedAttr::AT_Ptr32:
7301 case ParsedAttr::AT_Ptr64:
7304 case ParsedAttr::AT_SPtr:
7307 case ParsedAttr::AT_UPtr:
7312 std::bitset<attr::LastAttr> Attrs;
7315 if (
const TypedefType *TT = dyn_cast<TypedefType>(Desugared)) {
7316 Desugared = TT->desugar();
7319 const AttributedType *AT = dyn_cast<AttributedType>(Desugared);
7322 Attrs[AT->getAttrKind()] =
true;
7323 Desugared = AT->getModifiedType();
7329 if (Attrs[NewAttrKind]) {
7330 S.
Diag(PAttr.
getLoc(), diag::warn_duplicate_attribute_exact) << PAttr;
7333 Attrs[NewAttrKind] =
true;
7337 if (Attrs[attr::Ptr32] && Attrs[attr::Ptr64]) {
7338 S.
Diag(PAttr.
getLoc(), diag::err_attributes_are_not_compatible)
7340 <<
"'__ptr64'" << 0;
7342 }
else if (Attrs[attr::SPtr] && Attrs[attr::UPtr]) {
7343 S.
Diag(PAttr.
getLoc(), diag::err_attributes_are_not_compatible)
7355 S.
Diag(PAttr.
getLoc(), diag::err_attribute_no_member_pointers) << PAttr;
7357 S.
Diag(PAttr.
getLoc(), diag::err_attribute_pointers_only) << PAttr << 0;
7365 if (PtrWidth == 32) {
7366 if (Attrs[attr::Ptr64])
7368 else if (Attrs[attr::UPtr])
7370 }
else if (PtrWidth == 64 && Attrs[attr::Ptr32]) {
7390 assert(PAttr.
getKind() == ParsedAttr::AT_WebAssemblyFuncref);
7392 Sema &S = State.getSema();
7395 std::bitset<attr::LastAttr> Attrs;
7397 const auto *AT = dyn_cast<AttributedType>(QT);
7399 Attrs[AT->getAttrKind()] =
true;
7400 AT = dyn_cast<AttributedType>(AT->getModifiedType());
7405 if (Attrs[NewAttrKind]) {
7406 S.
Diag(PAttr.
getLoc(), diag::warn_duplicate_attribute_exact) << PAttr;
7412 const auto *Ptr = dyn_cast<PointerType>(Desugared);
7413 if (!Ptr || !Ptr->getPointeeType()->isFunctionType()) {
7414 S.
Diag(PAttr.
getLoc(), diag::err_attribute_webassembly_funcref);
7426 QT = State.getAttributedType(A, QT,
Equivalent);
7435 Sema &S = State.getSema();
7436 auto &D = State.getDeclarator();
7442 if (State.isProcessingDeclSpec()) {
7443 if (!(D.isPrototypeContext() ||
7447 if (
auto *chunk = D.getInnermostNonParenChunk()) {
7470 auto chunkIdx = State.getCurrentChunkIndex();
7471 if (chunkIdx >= 1 &&
7474 D.getTypeObject(chunkIdx - 1).getAttrs());
7479 auto *A = ::new (S.
Context) SwiftAttrAttr(S.
Context, PAttr, Str);
7480 QT = State.getAttributedType(A, QT, QT);
7487 auto Attributed = dyn_cast<AttributedType>(
Type.getTypePtr());
7492 if (Attributed->getImmediateNullability())
7493 return Attributed->getModifiedType();
7497 Ctx, Attributed->getModifiedType());
7498 assert(Modified.
getTypePtr() != Attributed->getModifiedType().getTypePtr());
7500 Attributed->getEquivalentType(),
7501 Attributed->getAttr());
7507 case ParsedAttr::AT_TypeNonNull:
7510 case ParsedAttr::AT_TypeNullable:
7513 case ParsedAttr::AT_TypeNullableResult:
7516 case ParsedAttr::AT_TypeNullUnspecified:
7520 llvm_unreachable(
"not a nullability attribute kind");
7527 bool IsContextSensitive,
bool AllowOnArrayType,
bool OverrideExisting) {
7528 bool Implicit = (State ==
nullptr);
7534 while (
auto *Attributed = dyn_cast<AttributedType>(Desugared.
getTypePtr())) {
7536 if (
auto ExistingNullability = Attributed->getImmediateNullability()) {
7538 if (Nullability == *ExistingNullability) {
7542 S.
Diag(NullabilityLoc, diag::warn_nullability_duplicate)
7549 if (!OverrideExisting) {
7551 S.
Diag(NullabilityLoc, diag::err_nullability_conflicting)
7561 Desugared = Attributed->getModifiedType();
7569 if (Nullability != *ExistingNullability && !
Implicit) {
7570 S.
Diag(NullabilityLoc, diag::err_nullability_conflicting)
7578 if (
auto typedefNullability =
7579 AttributedType::stripOuterNullability(underlyingType)) {
7580 if (*typedefNullability == *ExistingNullability) {
7593 !(AllowOnArrayType && Desugared->
isArrayType())) {
7595 S.
Diag(NullabilityLoc, diag::err_nullability_nonpointer)
7603 if (IsContextSensitive) {
7614 S.
Diag(NullabilityLoc, diag::err_nullability_cs_multilevel)
7616 S.
Diag(NullabilityLoc, diag::note_nullability_type_specifier)
7628 QT = State->getAttributedType(A, QT, QT);
7637 bool AllowOnArrayType) {
7643 Nullability, NullabilityLoc,
7644 IsContextSensitive, AllowOnArrayType,
7651 bool AllowArrayTypes,
7652 bool OverrideExisting) {
7654 *
this,
nullptr,
nullptr,
Type, Nullability, DiagLoc,
7655 false, AllowArrayTypes, OverrideExisting);
7663 llvm::APInt MaxSizeForAddrSpace =
7664 llvm::APInt::getMaxValue(
Context.getTargetInfo().getPointerWidth(AS));
7665 std::optional<CharUnits> TSizeInChars =
Context.getTypeSizeInCharsIfKnown(
T);
7666 if (TSizeInChars &&
static_cast<uint64_t
>(TSizeInChars->getQuantity()) >
7667 MaxSizeForAddrSpace.getZExtValue()) {
7669 <<
T << MaxSizeForAddrSpace;
7680 Sema &S = state.getSema();
7684 type = state.getAttributedType(
7697 S.
Diag(
attr.getLoc(), diag::err_objc_kindof_nonobject)
7706 objType->getBaseType(), objType->getTypeArgsAsWritten(),
7707 objType->getProtocols(),
7708 objType->isObjCUnqualifiedId() ?
false :
true);
7713 if (
auto nullability =
type->getNullability()) {
7716 assert(
attr.getAttributeSpellingListIndex() == 0 &&
7717 "multiple spellings for __kindof?");
7720 equivType = state.getAttributedType(A, equivType, equivType);
7725 type = state.getAttributedType(
7738 Declarator &declarator = state.getDeclarator();
7741 auto moveToChunk = [&](
DeclaratorChunk &chunk,
bool inFunction) ->
bool {
7754 PK_MemberFunctionPointer,
7759 : inFunction? PK_MemberFunctionPointer : PK_MemberPointer;
7761 auto diag = state.getSema().Diag(
attr.getLoc(),
7762 diag::warn_nullability_declspec)
7764 attr.isContextSensitiveKeywordAttribute())
7766 <<
static_cast<unsigned>(pointerKind);
7772 state.getSema().getPreprocessor().getLocForEndOfToken(
7774 " " +
attr.getAttrName()->getName().str() +
" ");
7784 for (
unsigned i = state.getCurrentChunkIndex(); i != 0; --i) {
7786 switch (chunk.
Kind) {
7790 return moveToChunk(chunk,
false);
7802 return moveToChunk(*dest,
true);
7818 assert(!
Attr.isInvalid());
7821 llvm_unreachable(
"not a calling convention attribute");
7822 case ParsedAttr::AT_CDecl:
7824 case ParsedAttr::AT_FastCall:
7826 case ParsedAttr::AT_StdCall:
7828 case ParsedAttr::AT_ThisCall:
7830 case ParsedAttr::AT_RegCall:
7832 case ParsedAttr::AT_Pascal:
7834 case ParsedAttr::AT_SwiftCall:
7836 case ParsedAttr::AT_SwiftAsyncCall:
7838 case ParsedAttr::AT_VectorCall:
7840 case ParsedAttr::AT_AArch64VectorPcs:
7842 case ParsedAttr::AT_AArch64SVEPcs:
7844 case ParsedAttr::AT_ArmStreaming:
7846 case ParsedAttr::AT_Pcs: {
7851 if (
Attr.isArgExpr(0))
7854 Str =
Attr.getArgAsIdent(0)->getIdentifierInfo()->getName();
7855 PcsAttr::PCSType
Type;
7856 if (!PcsAttr::ConvertStrToPCSType(Str,
Type))
7857 llvm_unreachable(
"already validated the attribute");
7858 return ::new (Ctx) PcsAttr(Ctx,
Attr,
Type);
7860 case ParsedAttr::AT_IntelOclBicc:
7862 case ParsedAttr::AT_MSABI:
7864 case ParsedAttr::AT_SysVABI:
7866 case ParsedAttr::AT_PreserveMost:
7868 case ParsedAttr::AT_PreserveAll:
7870 case ParsedAttr::AT_M68kRTD:
7872 case ParsedAttr::AT_PreserveNone:
7874 case ParsedAttr::AT_RISCVVectorCC:
7876 case ParsedAttr::AT_RISCVVLSCC: {
7879 unsigned ABIVLen = 128;
7880 if (
Attr.getNumArgs()) {
7881 std::optional<llvm::APSInt> MaybeABIVLen =
7882 Attr.getArgAsExpr(0)->getIntegerConstantExpr(Ctx);
7884 llvm_unreachable(
"Invalid RISC-V ABI VLEN");
7885 ABIVLen = MaybeABIVLen->getZExtValue();
7888 return ::new (Ctx) RISCVVLSCCAttr(Ctx,
Attr, ABIVLen);
7891 llvm_unreachable(
"unexpected attribute kind!");
7894std::optional<FunctionEffectMode>
7899 std::optional<llvm::APSInt> ConditionValue =
7901 if (!ConditionValue) {
7907 return std::nullopt;
7916 FunctionTypeUnwrapper &Unwrapped) {
7918 if (!Unwrapped.isFunctionType())
7921 Sema &S = TPState.getSema();
7925 if (FPT ==
nullptr) {
7926 S.
Diag(PAttr.
getLoc(), diag::err_func_with_effects_no_prototype)
7933 bool IsNonBlocking = PAttr.
getKind() == ParsedAttr::AT_NonBlocking ||
7934 PAttr.
getKind() == ParsedAttr::AT_Blocking;
7937 Expr *CondExpr =
nullptr;
7939 if (PAttr.
getKind() == ParsedAttr::AT_NonBlocking ||
7940 PAttr.
getKind() == ParsedAttr::AT_NonAllocating) {
7949 std::optional<FunctionEffectMode> MaybeMode =
7955 NewMode = *MaybeMode;
7990 assert(
Success &&
"effect conflicts should have been diagnosed above");
7994 FPT->getParamTypes(), EPI);
8003 auto OtherAttr = llvm::find_if(
8004 state.getCurrentAttributes(),
8005 [OtherKind](
const ParsedAttr &A) { return A.getKind() == OtherKind; });
8006 if (OtherAttr == state.getCurrentAttributes().end() || OtherAttr->isInvalid())
8009 Sema &S = state.getSema();
8011 << *OtherAttr <<
Attr
8012 << (OtherAttr->isRegularKeywordAttribute() ||
8014 S.
Diag(OtherAttr->getLoc(), diag::note_conflicting_attribute);
8022 if (!
Attr.getNumArgs()) {
8028 for (
unsigned I = 0; I <
Attr.getNumArgs(); ++I) {
8029 StringRef StateName;
8034 if (StateName !=
"sme_za_state") {
8035 S.
Diag(LiteralLoc, diag::err_unknown_arm_state) << StateName;
8042 S.
Diag(
Attr.
getLoc(), diag::err_conflicting_attributes_arm_agnostic);
8057 if (!
Attr.getNumArgs()) {
8063 for (
unsigned I = 0; I <
Attr.getNumArgs(); ++I) {
8064 StringRef StateName;
8071 if (StateName ==
"za") {
8074 }
else if (StateName ==
"zt0") {
8078 S.
Diag(LiteralLoc, diag::err_unknown_arm_state) << StateName;
8084 S.
Diag(LiteralLoc, diag::err_conflicting_attributes_arm_agnostic);
8093 S.
Diag(LiteralLoc, diag::err_conflicting_attributes_arm_state)
8109 Sema &S = state.getSema();
8111 FunctionTypeUnwrapper unwrapped(S,
type);
8113 if (
attr.getKind() == ParsedAttr::AT_NoReturn) {
8118 if (!unwrapped.isFunctionType())
8127 if (
attr.getKind() == ParsedAttr::AT_CFIUncheckedCallee) {
8129 if (!unwrapped.isFunctionType())
8132 if (!unwrapped.get()->isFunctionProtoType()) {
8133 S.
Diag(
attr.getLoc(), diag::warn_attribute_wrong_decl_type)
8134 <<
attr <<
attr.isRegularKeywordAttribute()
8142 FPT->getReturnType(), FPT->getParamTypes(),
8143 FPT->getExtProtoInfo().withCFIUncheckedCallee(
true));
8148 if (
attr.getKind() == ParsedAttr::AT_CmseNSCall) {
8150 if (!unwrapped.isFunctionType())
8155 S.
Diag(
attr.getLoc(), diag::warn_attribute_ignored) <<
attr;
8162 unwrapped.get()->getExtInfo().withCmseNSCall(
true);
8169 if (
attr.getKind() == ParsedAttr::AT_NSReturnsRetained) {
8170 if (
attr.getNumArgs())
return true;
8173 if (!unwrapped.isFunctionType())
8178 attr.getLoc(), unwrapped.get()->getReturnType()))
8183 if (state.getSema().getLangOpts().ObjCAutoRefCount) {
8185 = unwrapped.get()->getExtInfo().withProducesResult(
true);
8188 type = state.getAttributedType(
8194 if (
attr.getKind() == ParsedAttr::AT_AnyX86NoCallerSavedRegisters) {
8199 if (!unwrapped.isFunctionType())
8203 unwrapped.get()->getExtInfo().withNoCallerSavedRegs(
true);
8208 if (
attr.getKind() == ParsedAttr::AT_AnyX86NoCfCheck) {
8210 S.
Diag(
attr.getLoc(), diag::warn_nocf_check_attribute_ignored);
8220 if (!unwrapped.isFunctionType())
8224 unwrapped.get()->getExtInfo().withNoCfCheck(
true);
8229 if (
attr.getKind() == ParsedAttr::AT_Regparm) {
8235 if (!unwrapped.isFunctionType())
8242 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8244 <<
attr.isRegularKeywordAttribute();
8250 unwrapped.get()->getExtInfo().withRegParm(value);
8255 if (
attr.getKind() == ParsedAttr::AT_CFISalt) {
8256 if (
attr.getNumArgs() != 1)
8264 if (!unwrapped.isFunctionType())
8269 S.
Diag(
attr.getLoc(), diag::err_attribute_wrong_decl_type)
8270 <<
attr <<
attr.isRegularKeywordAttribute()
8280 FnTy->getParamTypes(), EPI);
8285 if (
attr.getKind() == ParsedAttr::AT_ArmStreaming ||
8286 attr.getKind() == ParsedAttr::AT_ArmStreamingCompatible ||
8287 attr.getKind() == ParsedAttr::AT_ArmPreserves ||
8288 attr.getKind() == ParsedAttr::AT_ArmIn ||
8289 attr.getKind() == ParsedAttr::AT_ArmOut ||
8290 attr.getKind() == ParsedAttr::AT_ArmInOut ||
8291 attr.getKind() == ParsedAttr::AT_ArmAgnostic) {
8295 if (
attr.getKind() == ParsedAttr::AT_ArmStreaming ||
8296 attr.getKind() == ParsedAttr::AT_ArmStreamingCompatible)
8300 if (!unwrapped.isFunctionType())
8307 S.
Diag(
attr.getLoc(), diag::warn_attribute_wrong_decl_type)
8308 <<
attr <<
attr.isRegularKeywordAttribute()
8315 switch (
attr.getKind()) {
8316 case ParsedAttr::AT_ArmStreaming:
8318 ParsedAttr::AT_ArmStreamingCompatible))
8322 case ParsedAttr::AT_ArmStreamingCompatible:
8327 case ParsedAttr::AT_ArmPreserves:
8331 case ParsedAttr::AT_ArmIn:
8335 case ParsedAttr::AT_ArmOut:
8339 case ParsedAttr::AT_ArmInOut:
8343 case ParsedAttr::AT_ArmAgnostic:
8348 llvm_unreachable(
"Unsupported attribute");
8352 FnTy->getParamTypes(), EPI);
8357 if (
attr.getKind() == ParsedAttr::AT_NoThrow) {
8359 if (!unwrapped.isFunctionType())
8372 if (Proto->hasExceptionSpec()) {
8373 switch (Proto->getExceptionSpecType()) {
8375 llvm_unreachable(
"This doesn't have an exception spec!");
8393 S.
Diag(
attr.getLoc(), diag::warn_nothrow_attribute_ignored);
8399 type = unwrapped.wrap(
8408 if (
attr.getKind() == ParsedAttr::AT_NonBlocking ||
8409 attr.getKind() == ParsedAttr::AT_NonAllocating ||
8410 attr.getKind() == ParsedAttr::AT_Blocking ||
8411 attr.getKind() == ParsedAttr::AT_Allocating) {
8416 if (!unwrapped.isFunctionType())
return false;
8431 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8434 <<
attr.isRegularKeywordAttribute();
8453 return S.
Diag(
attr.getLoc(), diag::warn_cconv_unsupported)
8458 return S.
Diag(
attr.getLoc(), diag::err_cconv_varargs)
8465 S.
Diag(
attr.getLoc(), diag::err_attributes_are_not_compatible)
8467 <<
attr.isRegularKeywordAttribute();
8479 auto EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
8488 const AttributedType *AT;
8492 while ((AT =
T->getAs<AttributedType>()) &&
8494 if (AT->isCallingConv())
8496 T = AT->getModifiedType();
8503 FunctionTypeUnwrapper Unwrapped(*
this,
T);
8509 Context.getDefaultCallingConvention(IsVariadic, HasThisPointer);
8516 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() && IsCtorOrDtor) {
8520 Diag(Loc, diag::warn_cconv_unsupported)
8529 Context.getDefaultCallingConvention(IsVariadic, !HasThisPointer);
8531 if (CurCC != DefaultCC)
8539 QualType Wrapped = Unwrapped.wrap(*
this, FT);
8540 T =
Context.getAdjustedType(
T, Wrapped);
8553 if (
Attr.getNumArgs() != 1) {
8560 Expr *SizeExpr =
Attr.getArgAsExpr(0);
8572 Expr *SizeExpr =
Attr.getArgAsExpr(0);
8587 bool IsPolyUnsigned = Triple.getArch() == llvm::Triple::aarch64 ||
8588 Triple.getArch() == llvm::Triple::aarch64_32 ||
8589 Triple.getArch() == llvm::Triple::aarch64_be;
8591 if (IsPolyUnsigned) {
8593 return BTy->
getKind() == BuiltinType::UChar ||
8594 BTy->
getKind() == BuiltinType::UShort ||
8595 BTy->
getKind() == BuiltinType::ULong ||
8596 BTy->
getKind() == BuiltinType::ULongLong;
8599 return BTy->
getKind() == BuiltinType::SChar ||
8600 BTy->
getKind() == BuiltinType::Short ||
8601 BTy->
getKind() == BuiltinType::LongLong;
8607 if ((Triple.isArch64Bit() || Triple.getArch() == llvm::Triple::aarch64_32) &&
8608 BTy->
getKind() == BuiltinType::Double)
8611 return BTy->
getKind() == BuiltinType::SChar ||
8612 BTy->
getKind() == BuiltinType::UChar ||
8613 BTy->
getKind() == BuiltinType::Short ||
8614 BTy->
getKind() == BuiltinType::UShort ||
8615 BTy->
getKind() == BuiltinType::Int ||
8616 BTy->
getKind() == BuiltinType::UInt ||
8617 BTy->
getKind() == BuiltinType::Long ||
8618 BTy->
getKind() == BuiltinType::ULong ||
8619 BTy->
getKind() == BuiltinType::LongLong ||
8620 BTy->
getKind() == BuiltinType::ULongLong ||
8621 BTy->
getKind() == BuiltinType::Float ||
8622 BTy->
getKind() == BuiltinType::Half ||
8623 BTy->
getKind() == BuiltinType::BFloat16 ||
8624 BTy->
getKind() == BuiltinType::MFloat8;
8629 const auto *AttrExpr =
Attr.getArgAsExpr(0);
8630 if (!AttrExpr->isTypeDependent()) {
8631 if (std::optional<llvm::APSInt> Res =
8632 AttrExpr->getIntegerConstantExpr(S.
Context)) {
8674 llvm::APSInt numEltsInt(32);
8680 S.
Diag(
Attr.
getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
8687 unsigned numElts =
static_cast<unsigned>(numEltsInt.getZExtValue());
8688 unsigned vecSize = typeSize * numElts;
8689 if (vecSize != 64 && vecSize != 128) {
8690 S.
Diag(
Attr.
getLoc(), diag::err_attribute_bad_neon_vector_size) << CurType;
8702 assert((
Attr.getNumArgs() > 0 &&
Attr.getNumArgs() <= 3) &&
8703 "__ptrauth qualifier takes between 1 and 3 arguments");
8704 Expr *KeyArg =
Attr.getArgAsExpr(0);
8705 Expr *IsAddressDiscriminatedArg =
8706 Attr.getNumArgs() >= 2 ?
Attr.getArgAsExpr(1) :
nullptr;
8707 Expr *ExtraDiscriminatorArg =
8708 Attr.getNumArgs() >= 3 ?
Attr.getArgAsExpr(2) :
nullptr;
8717 bool IsInvalid =
false;
8718 unsigned IsAddressDiscriminated, ExtraDiscriminator;
8721 IsAddressDiscriminated);
8730 if (!
T->isSignableType(Ctx) && !
T->isDependentType()) {
8731 S.
Diag(
Attr.
getLoc(), diag::err_ptrauth_qualifier_invalid_target) <<
T;
8736 if (
T.getPointerAuth()) {
8748 assert((!IsAddressDiscriminatedArg || IsAddressDiscriminated <= 1) &&
8749 "address discriminator arg should be either 0 or 1");
8751 Key, IsAddressDiscriminated, ExtraDiscriminator,
8773 S.
Diag(
Attr.
getLoc(), diag::err_attribute_arm_feature_sve_bits_unsupported)
8780 llvm::APSInt SveVectorSizeInBits(32);
8784 unsigned VecSize =
static_cast<unsigned>(SveVectorSizeInBits.getZExtValue());
8807 if (BT->getKind() == BuiltinType::SveBool) {
8812 VecSize /= TypeSize;
8819 const VectorType *VT = dyn_cast<VectorType>(CurType);
8822 diag::err_attribute_arm_mve_polymorphism);
8829 State.getSema().Context,
Attr),
8841 <<
Attr <<
"'zve32x'";
8848 if (!VScale || !VScale->first || VScale->first != VScale->second) {
8849 S.
Diag(
Attr.
getLoc(), diag::err_attribute_riscv_rvv_bits_unsupported)
8856 llvm::APSInt RVVVectorSizeInBits(32);
8868 unsigned VecSize =
static_cast<unsigned>(RVVVectorSizeInBits.getZExtValue());
8872 unsigned MinElts = Info.
EC.getKnownMinValue();
8875 unsigned ExpectedSize = VScale->first * MinElts;
8883 unsigned SubByteLanes = 0;
8886 if (VecSize == 1 || VecSize == 2 || VecSize == 4)
8887 SubByteLanes = VecSize;
8893 llvm::Log2_32(llvm::RISCV::RVVBitsPerBlock / MinElts), SubByteLanes);
8895 ExpectedSize *= EltSize;
8896 NumElts = VecSize / EltSize;
8902 int(llvm::Log2_32(MinElts * EltSize)) -
8903 int(llvm::Log2_32(llvm::RISCV::RVVBitsPerBlock)));
8907 if (VecSize != ExpectedSize) {
8909 << VecSize << ExpectedSize;
8922 S.
Diag(
Attr.
getLoc(), diag::err_opencl_invalid_access_qualifier);
8928 QualType BaseTy = TypedefTy->desugar();
8930 std::string PrevAccessQual;
8932 if (TypedefTy->getDecl()->hasAttr<OpenCLAccessAttr>()) {
8933 OpenCLAccessAttr *
Attr =
8934 TypedefTy->getDecl()->getAttr<OpenCLAccessAttr>();
8937 PrevAccessQual =
"read_only";
8941 switch (ImgType->getKind()) {
8942 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8943 case BuiltinType::Id: \
8944 PrevAccessQual = #Access; \
8946 #include "clang/Basic/OpenCLImageTypes.def"
8948 llvm_unreachable(
"Unable to find corresponding image type.");
8951 llvm_unreachable(
"unexpected type");
8954 if (PrevAccessQual == AttrName.ltrim(
"_")) {
8960 S.
Diag(
Attr.
getLoc(), diag::err_opencl_multiple_access_qualifiers);
8963 S.
Diag(TypedefTy->getDecl()->getBeginLoc(),
8964 diag::note_opencl_typedef_access_qualifier) << PrevAccessQual;
8966 if (
Attr.getSemanticSpelling() == OpenCLAccessAttr::Keyword_write_only) {
8981 Expr *RowsExpr =
Attr.getArgAsExpr(0);
8982 Expr *ColsExpr =
Attr.getArgAsExpr(1);
8990 Sema &S = State.getSema();
8993 S.
Diag(PA.
getLoc(), diag::err_attribute_too_few_arguments) << PA << 1;
9005 for (
unsigned Idx = 1; Idx < PA.
getNumArgs(); Idx++) {
9011 auto *AnnotateTypeAttr =
9012 AnnotateTypeAttr::Create(S.
Context, Str, Args.data(), Args.size(), PA);
9013 CurType = State.getAttributedType(AnnotateTypeAttr, CurType, CurType);
9019 if (State.getDeclarator().isDeclarationOfFunction()) {
9020 CurType = State.getAttributedType(
9025 State.getSema().Diag(
Attr.
getLoc(), diag::err_attribute_wrong_decl_type)
9032 if (State.getDeclarator().isDeclarationOfFunction()) {
9033 auto *
Attr = State.getSema().ParseLifetimeCaptureByAttr(PA,
"this");
9035 CurType = State.getAttributedType(
Attr, CurType, CurType);
9047 if (
Attr.getSemanticSpelling() == HLSLParamModifierAttr::Keyword_inout ||
9048 Attr.getSemanticSpelling() == HLSLParamModifierAttr::Keyword_out) {
9049 State.setParsedHLSLParamMod(
true);
9082 state.setParsedNoDeref(
false);
9098 if (
attr.isInvalid())
9101 if (
attr.isStandardAttributeSyntax() ||
attr.isRegularKeywordAttribute()) {
9106 if (
attr.isGNUScope()) {
9107 assert(
attr.isStandardAttributeSyntax());
9108 bool IsTypeAttr =
attr.isTypeAttr();
9110 state.getSema().Diag(
attr.getLoc(),
9112 ? diag::warn_gcc_ignores_type_attr
9113 : diag::warn_cxx11_gnu_attribute_on_type)
9119 !
attr.isTypeAttr()) {
9130 if (
attr.isTypeAttr() &&
9131 state.getSema().checkCommonAttributeFeatures(
type,
attr)) {
9138 switch (
attr.getKind()) {
9141 if ((
attr.isStandardAttributeSyntax() ||
9142 attr.isRegularKeywordAttribute()) &&
9144 state.getSema().Diag(
attr.getLoc(), diag::err_attribute_not_type_attr)
9145 <<
attr <<
attr.isRegularKeywordAttribute();
9146 attr.setUsedAsTypeAttr();
9151 if (
attr.isStandardAttributeSyntax()) {
9152 state.getSema().DiagnoseUnknownAttribute(
attr);
9162 case ParsedAttr::AT_BTFTypeTag:
9164 attr.setUsedAsTypeAttr();
9167 case ParsedAttr::AT_MayAlias:
9170 attr.setUsedAsTypeAttr();
9172 case ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace:
9173 case ParsedAttr::AT_OpenCLGlobalHostAddressSpace:
9174 state.getSema().Diag(
attr.getLoc(), diag::warn_deprecated_attribute)
9177 case ParsedAttr::AT_OpenCLPrivateAddressSpace:
9178 case ParsedAttr::AT_OpenCLGlobalAddressSpace:
9179 case ParsedAttr::AT_OpenCLLocalAddressSpace:
9180 case ParsedAttr::AT_OpenCLConstantAddressSpace:
9181 case ParsedAttr::AT_OpenCLGenericAddressSpace:
9182 case ParsedAttr::AT_AddressSpace:
9183 case ParsedAttr::AT_SYCLPrivateAddressSpace:
9184 case ParsedAttr::AT_SYCLGlobalAddressSpace:
9185 case ParsedAttr::AT_SYCLLocalAddressSpace:
9186 case ParsedAttr::AT_SYCLConstantAddressSpace:
9187 case ParsedAttr::AT_SYCLGenericAddressSpace:
9189 attr.setUsedAsTypeAttr();
9191 case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
9194 if (state.getSema().getLangOpts().getHLSLVersion() <
9196 state.getSema().Diag(
attr.getLoc(), diag::warn_hlsl_groupshared_202x);
9203 attr.setUsedAsTypeAttr();
9205 case ParsedAttr::AT_HLSLRowMajor:
9206 case ParsedAttr::AT_HLSLColumnMajor:
9208 state.getSema().HLSL().buildMatrixLayoutTypeAttr(
type,
attr)) {
9210 attr.getKind() == ParsedAttr::AT_HLSLRowMajor
9214 state.getSema().Context.getMatrixTypeWithLayout(
type, Layout);
9217 attr.setUsedAsTypeAttr();
9222 attr.setUsedAsTypeAttr();
9224 case ParsedAttr::AT_VectorSize:
9226 attr.setUsedAsTypeAttr();
9228 case ParsedAttr::AT_ExtVectorType:
9230 attr.setUsedAsTypeAttr();
9232 case ParsedAttr::AT_NeonVectorType:
9234 attr.setUsedAsTypeAttr();
9236 case ParsedAttr::AT_NeonPolyVectorType:
9239 attr.setUsedAsTypeAttr();
9241 case ParsedAttr::AT_ArmSveVectorBits:
9243 attr.setUsedAsTypeAttr();
9245 case ParsedAttr::AT_ArmMveStrictPolymorphism: {
9247 attr.setUsedAsTypeAttr();
9250 case ParsedAttr::AT_RISCVRVVVectorBits:
9252 attr.setUsedAsTypeAttr();
9254 case ParsedAttr::AT_OpenCLAccess:
9256 attr.setUsedAsTypeAttr();
9258 case ParsedAttr::AT_PointerAuth:
9261 attr.setUsedAsTypeAttr();
9263 case ParsedAttr::AT_LifetimeBound:
9267 case ParsedAttr::AT_LifetimeCaptureBy:
9271 case ParsedAttr::AT_OverflowBehavior:
9273 attr.setUsedAsTypeAttr();
9276 case ParsedAttr::AT_NoDeref: {
9281 if (
attr.isStandardAttributeSyntax()) {
9282 state.getSema().Diag(
attr.getLoc(), diag::warn_attribute_ignored)
9289 attr.setUsedAsTypeAttr();
9290 state.setParsedNoDeref(
true);
9294 case ParsedAttr::AT_MatrixType:
9296 attr.setUsedAsTypeAttr();
9299 case ParsedAttr::AT_WebAssemblyFuncref: {
9301 attr.setUsedAsTypeAttr();
9305 case ParsedAttr::AT_HLSLParamModifier: {
9307 if (attrs.
hasAttribute(ParsedAttr::AT_HLSLGroupSharedAddressSpace)) {
9308 state.getSema().Diag(
attr.getLoc(), diag::err_hlsl_attr_incompatible)
9309 <<
attr <<
"'groupshared'";
9313 attr.setUsedAsTypeAttr();
9317 case ParsedAttr::AT_SwiftAttr: {
9324 attr.setUsedAsTypeAttr();
9332 if (
type->canHaveNullability() ||
type->isDependentType() ||
9333 type->isArrayType() ||
9337 endIndex = state.getCurrentChunkIndex();
9339 endIndex = state.getDeclarator().getNumTypeObjects();
9340 bool allowOnArrayType =
9341 state.getDeclarator().isPrototypeContext() &&
9344 allowOnArrayType)) {
9348 attr.setUsedAsTypeAttr();
9352 case ParsedAttr::AT_ObjCKindOf:
9360 state.getSema().Diag(
attr.getLoc(),
9361 diag::err_objc_kindof_wrong_position)
9364 state.getDeclarator().getDeclSpec().getBeginLoc(),
9374 case ParsedAttr::AT_NoThrow:
9377 if (!state.getSema().getLangOpts().CPlusPlus)
9382 attr.setUsedAsTypeAttr();
9386 if (
attr.isStandardAttributeSyntax() ||
9387 attr.isRegularKeywordAttribute()) {
9404 case ParsedAttr::AT_AcquireHandle: {
9405 if (!
type->isFunctionType())
9408 if (
attr.getNumArgs() != 1) {
9409 state.getSema().Diag(
attr.getLoc(),
9410 diag::err_attribute_wrong_number_arguments)
9416 StringRef HandleType;
9417 if (!state.getSema().checkStringLiteralArgumentAttr(
attr, 0, HandleType))
9419 type = state.getAttributedType(
9420 AcquireHandleAttr::Create(state.getSema().Context, HandleType,
attr),
9422 attr.setUsedAsTypeAttr();
9425 case ParsedAttr::AT_AnnotateType: {
9427 attr.setUsedAsTypeAttr();
9430 case ParsedAttr::AT_HLSLResourceClass:
9431 case ParsedAttr::AT_HLSLResourceDimension:
9432 case ParsedAttr::AT_HLSLIsROV:
9433 case ParsedAttr::AT_HLSLRawBuffer:
9434 case ParsedAttr::AT_HLSLIsArray:
9435 case ParsedAttr::AT_HLSLIsMultiSampled:
9436 case ParsedAttr::AT_HLSLContainedType: {
9441 state.getSema().HLSL().handleResourceTypeAttr(
type,
attr))
9442 attr.setUsedAsTypeAttr();
9450 !
type.getQualifiers().hasObjCLifetime() &&
9451 !
type.getQualifiers().hasObjCGCAttr() &&
9452 attr.getKind() != ParsedAttr::AT_ObjCGC &&
9453 attr.getKind() != ParsedAttr::AT_ObjCOwnership) {
9455 type = state.getSema().Context.getMacroQualifiedType(
type, MacroII);
9456 state.setExpansionLocForMacroQualifiedType(
9458 attr.getMacroExpansionLoc());
9465 if (
VarDecl *Var = dyn_cast<VarDecl>(DRE->getDecl())) {
9467 auto *Def = Var->getDefinition();
9473 Def = Var->getDefinition();
9480 if (Var->getPointOfInstantiation().isInvalid() && Def) {
9481 assert(Var->getTemplateSpecializationKind() ==
9483 "explicit instantiation with no point of instantiation");
9484 Var->setTemplateSpecializationKind(
9485 Var->getTemplateSpecializationKind(), PointOfInstantiation);
9505 if (
const auto CastE = dyn_cast<ExplicitCastExpr>(E)) {
9506 QualType DestType = CastE->getTypeAsWritten();
9507 if (
const auto *IAT =
Context.getAsIncompleteArrayType(DestType)) {
9512 IAT->getElementType(),
9549 if (RequireCompleteTypeImpl(Loc,
T, Kind, &Diagnoser))
9551 if (
auto *TD =
T->getAsTagDecl(); TD && !TD->isCompleteDefinitionRequired()) {
9552 TD->setCompleteDefinitionRequired();
9553 Consumer.HandleTagDeclRequiredDefinition(TD);
9586 auto DefinitionIsAcceptable = [&](
NamedDecl *D) {
9606 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
9607 return RD->isThisDeclarationADefinition();
9608 if (
auto *ED = dyn_cast<EnumDecl>(D))
9609 return ED->isThisDeclarationADefinition();
9610 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9611 return FD->isThisDeclarationADefinition();
9612 if (
auto *VD = dyn_cast<VarDecl>(D))
9614 llvm_unreachable(
"unexpected decl type");
9616 auto FoundAcceptableDefinition = [&](
NamedDecl *D) {
9618 return DefinitionIsAcceptable(D);
9626 return DefinitionIsAcceptable(D);
9628 for (
auto *RD : D->
redecls()) {
9630 if (!IsDefinition(ND))
9632 if (DefinitionIsAcceptable(ND)) {
9641 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
9642 if (
auto *Pattern = RD->getTemplateInstantiationPattern())
9644 D = RD->getDefinition();
9645 }
else if (
auto *ED = dyn_cast<EnumDecl>(D)) {
9646 if (
auto *Pattern = ED->getTemplateInstantiationPattern())
9648 if (OnlyNeedComplete && (ED->isFixed() ||
getLangOpts().MSVCCompat)) {
9654 *Suggested =
nullptr;
9655 for (
auto *Redecl : ED->redecls()) {
9658 if (Redecl->isThisDeclarationADefinition() ||
9659 (Redecl->isCanonicalDecl() && !*Suggested))
9660 *Suggested = Redecl;
9665 D = ED->getDefinition();
9666 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
9667 if (
auto *Pattern = FD->getTemplateInstantiationPattern())
9669 D = FD->getDefinition();
9670 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
9671 if (
auto *Pattern = VD->getTemplateInstantiationPattern())
9673 D = VD->getDefinition();
9676 assert(D &&
"missing definition for pattern of instantiated definition");
9680 if (FoundAcceptableDefinition(D))
9685 if (
auto *Source =
Context.getExternalSource()) {
9686 Source->CompleteRedeclChain(D);
9687 return FoundAcceptableDefinition(D);
9703 bool OnlyNeedComplete) {
9720 bool OnlyNeedComplete) {
9728 if (!RD->
hasAttr<MSInheritanceAttr>()) {
9730 bool BestCase =
false;
9750 RD->
addAttr(MSInheritanceAttr::CreateImplicit(
9751 S.
getASTContext(), BestCase, Loc, MSInheritanceAttr::Spelling(IM)));
9757 CompleteTypeKind Kind,
9758 TypeDiagnoser *Diagnoser) {
9767 if (
const auto *MPTy = dyn_cast<MemberPointerType>(
T.getCanonicalType())) {
9768 if (CXXRecordDecl *RD = MPTy->getMostRecentCXXRecordDecl();
9769 RD && !RD->isDependentType()) {
9771 if (
getLangOpts().CompleteMemberPointers && !RD->isBeingDefined() &&
9777 if (
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
9784 NamedDecl *Def =
nullptr;
9796 NamedDecl *Suggested =
nullptr;
9802 if (Diagnoser && Suggested)
9805 return !TreatAsComplete;
9810 TagDecl *
Tag = dyn_cast_or_null<TagDecl>(Def);
9811 ObjCInterfaceDecl *IFace = dyn_cast_or_null<ObjCInterfaceDecl>(Def);
9823 if (
auto *Source =
Context.getExternalSource()) {
9824 if (Tag &&
Tag->hasExternalLexicalStorage())
9825 Source->CompleteType(Tag);
9827 Source->CompleteType(IFace);
9831 return RequireCompleteTypeImpl(Loc,
T, Kind, Diagnoser);
9838 if (
auto *RD = dyn_cast_or_null<CXXRecordDecl>(Tag)) {
9839 bool Instantiated =
false;
9840 bool Diagnosed =
false;
9841 if (RD->isDependentContext()) {
9845 }
else if (
auto *ClassTemplateSpec =
9846 dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
9847 if (ClassTemplateSpec->getSpecializationKind() ==
TSK_Undeclared) {
9851 Diagnoser, ClassTemplateSpec->hasStrictPackMatch());
9853 Instantiated =
true;
9856 CXXRecordDecl *Pattern = RD->getInstantiatedFromMemberClass();
9857 if (!RD->isBeingDefined() && Pattern) {
9858 MemberSpecializationInfo *MSI = RD->getMemberSpecializationInfo();
9859 assert(MSI &&
"Missing member specialization information?");
9869 Instantiated =
true;
9877 if (Diagnoser && Diagnosed)
9883 return RequireCompleteTypeImpl(Loc,
T, Kind, Diagnoser);
9893 Diagnoser->diagnose(*
this, Loc,
T);
9897 if (Tag && !
Tag->isInvalidDecl() && !
Tag->getLocation().isInvalid())
9898 Diag(
Tag->getLocation(),
Tag->isBeingDefined()
9899 ? diag::note_type_being_defined
9900 : diag::note_forward_declaration)
9901 <<
Context.getCanonicalTagType(Tag);
9934 default: llvm_unreachable(
"Invalid tag kind for literal type diagnostic!");
9940 assert(!
T->isDependentType() &&
"type should not be dependent");
9949 if (
T->isVariableArrayType())
9965 Diag(RD->getLocation(), diag::note_non_literal_lambda);
9974 Diag(RD->getLocation(), diag::note_non_literal_virtual_base)
9976 for (
const auto &I : RD->vbases())
9977 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
9978 << I.getSourceRange();
9979 }
else if (!RD->isAggregate() && !RD->hasConstexprNonCopyMoveConstructor() &&
9980 !RD->hasTrivialDefaultConstructor()) {
9981 Diag(RD->getLocation(), diag::note_non_literal_no_constexpr_ctors) << RD;
9982 }
else if (RD->hasNonLiteralTypeFieldsOrBases()) {
9983 for (
const auto &I : RD->bases()) {
9984 if (!I.getType()->isLiteralType(
Context)) {
9985 Diag(I.getBeginLoc(), diag::note_non_literal_base_class)
9986 << RD << I.getType() << I.getSourceRange();
9990 for (
const auto *I : RD->fields()) {
9991 if (!I->getType()->isLiteralType(
Context) ||
9992 I->getType().isVolatileQualified()) {
9993 Diag(I->getLocation(), diag::note_non_literal_field)
9994 << RD << I << I->getType()
9995 << I->getType().isVolatileQualified();
10000 : !RD->hasTrivialDestructor()) {
10005 assert(Dtor &&
"class has literal fields and bases but no dtor?");
10010 Diag(Dtor->getLocation(), diag::note_non_literal_non_constexpr_dtor)
10013 Diag(Dtor->getLocation(), Dtor->isUserProvided()
10014 ? diag::note_non_literal_user_provided_dtor
10015 : diag::note_non_literal_nontrivial_dtor)
10017 if (!Dtor->isUserProvided())
10041 if (
const TagType *TT =
T->getAs<TagType>())
10044 return Context.getTypeOfExprType(E, Kind);
10062 auto Reject = [&]() ->
bool {
10065 if (!CATy->getCountExpr())
10066 Context.completeCountAttributedType(CATy, Arg, {});
10083 if (!CATy->getCountExpr())
10084 Context.completeCountAttributedType(CATy, Arg, Decls);
10099 return Context.getCountAttributedType(WrappedTy, CountExpr, CountInBytes,
10109 if (
auto *ImplCastExpr = dyn_cast<ImplicitCastExpr>(E))
10110 IDExpr = ImplCastExpr->getSubExpr();
10112 if (
auto *PackExpr = dyn_cast<PackIndexingExpr>(E)) {
10114 IDExpr = PackExpr->getPackIdExpression();
10116 IDExpr = PackExpr->getSelectedExpr();
10132 if (
const auto *SNTTPE = dyn_cast<SubstNonTypeTemplateParmExpr>(IDExpr))
10133 IDExpr = SNTTPE->getReplacement();
10141 if (
const auto *DRE = dyn_cast<DeclRefExpr>(IDExpr)) {
10146 if (
const auto *ME = dyn_cast<MemberExpr>(IDExpr)) {
10147 if (
const auto *VD = ME->getMemberDecl())
10149 return VD->getType();
10150 }
else if (
const auto *IR = dyn_cast<ObjCIvarRefExpr>(IDExpr)) {
10151 return IR->getDecl()->getType();
10152 }
else if (
const auto *PR = dyn_cast<ObjCPropertyRefExpr>(IDExpr)) {
10153 if (PR->isExplicitProperty())
10154 return PR->getExplicitProperty()->getType();
10155 }
else if (
const auto *PE = dyn_cast<PredefinedExpr>(IDExpr)) {
10156 return PE->getType();
10167 if (
auto *DRE = dyn_cast<DeclRefExpr>(IDExpr->
IgnoreParens())) {
10168 if (
auto *Var = dyn_cast<VarDecl>(DRE->getDecl())) {
10171 return Context.getLValueReferenceType(
T);
10176 return Context.getReferenceQualifiedType(E);
10188 Diag(E->
getExprLoc(), diag::warn_side_effects_unevaluated_context);
10200 Diag(Loc, diag::err_expected_name_of_pack) << Pattern;
10204 if (!
Type.isNull())
10205 DiagCompat(Loc, diag_compat::pack_indexing);
10215 llvm::APSInt
Value;
10222 IndexExpr = Res.
get();
10223 uint64_t
V =
Value.getZExtValue();
10224 if (FullySubstituted &&
V >= Expansions.size()) {
10226 <<
V << Pattern << Expansions.size();
10229 Index =
static_cast<unsigned>(
V);
10232 return Context.getPackIndexingType(Pattern, IndexExpr, FullySubstituted,
10233 Expansions, Index);
10238 assert(BaseType->isEnumeralType());
10239 EnumDecl *ED = BaseType->castAs<EnumType>()->getDecl();
10244 if (Underlying.
isNull()) {
10246 assert(!Underlying.
isNull());
10254 if (!BaseType->isEnumeralType()) {
10255 Diag(Loc, diag::err_only_enums_have_underlying_types);
10262 if (BaseType->isIncompleteType(&FwdDecl)) {
10263 Diag(Loc, diag::err_underlying_type_of_incomplete_enum) << BaseType;
10264 Diag(FwdDecl->
getLocation(), diag::note_forward_declaration) << FwdDecl;
10272 QualType Pointer = BaseType.isReferenceable() || BaseType->isVoidType()
10281 if (!BaseType->isAnyPointerType())
10290 return Context.getDecayedType(Underlying);
10299 Split.Quals.removeCVRQualifiers();
10300 return Context.getQualifiedType(Split);
10307 BaseType.isReferenceable()
10309 UKind == UnaryTransformType::AddLvalueReference,
10317 if (UKind == UnaryTransformType::RemoveAllExtents)
10318 return Context.getBaseElementType(BaseType);
10320 if (
const auto *AT =
Context.getAsArrayType(BaseType))
10321 return AT->getElementType();
10329 QualType T = BaseType.getNonReferenceType();
10330 if (UKind == UTTKind::RemoveCVRef &&
10331 (
T.isConstQualified() ||
T.isVolatileQualified())) {
10336 T =
Context.getQualifiedType(Unqual, Quals);
10343 if ((BaseType->isReferenceType() && UKind != UTTKind::RemoveRestrict) ||
10344 BaseType->isFunctionType())
10350 if (UKind == UTTKind::RemoveConst || UKind == UTTKind::RemoveCV)
10352 if (UKind == UTTKind::RemoveVolatile || UKind == UTTKind::RemoveCV)
10354 if (UKind == UTTKind::RemoveRestrict)
10357 return Context.getQualifiedType(Unqual, Quals);
10363 if (BaseType->isEnumeralType()) {
10365 if (
auto *
BitInt = dyn_cast<BitIntType>(Underlying)) {
10366 unsigned int Bits =
BitInt->getNumBits();
10370 S.
Diag(Loc, diag::err_make_signed_integral_only)
10371 << IsMakeSigned <<
true << BaseType << 1 << Underlying;
10375 S.
Diag(Loc, diag::err_make_signed_integral_only)
10376 << IsMakeSigned <<
false << BaseType << 1
10383 std::array<CanQualType *, 6> AllSignedIntegers = {
10387 AllSignedIntegers.data(), AllSignedIntegers.size() - Int128Unsupported);
10388 std::array<CanQualType *, 6> AllUnsignedIntegers = {
10393 AllUnsignedIntegers.size() -
10394 Int128Unsupported);
10396 IsMakeSigned ? &AvailableSignedIntegers : &AvailableUnsignedIntegers;
10400 llvm::find_if(*Consider, [&S, BaseSize](
const CanQual<Type> *
T) {
10404 assert(
Result != Consider->end());
10405 return QualType((*Result)->getTypePtr(), 0);
10410 bool IsMakeSigned = UKind == UnaryTransformType::MakeSigned;
10411 if ((!BaseType->isIntegerType() && !BaseType->isEnumeralType()) ||
10412 BaseType->isBooleanType() ||
10413 (BaseType->isBitIntType() &&
10415 Diag(Loc, diag::err_make_signed_integral_only)
10416 << IsMakeSigned << BaseType->isBitIntType() << BaseType << 0;
10420 bool IsNonIntIntegral =
10421 BaseType->
isChar16Type() || BaseType->isChar32Type() ||
10422 BaseType->isWideCharType() || BaseType->isEnumeralType();
10427 : IsMakeSigned ?
Context.getCorrespondingSignedType(BaseType)
10428 :
Context.getCorrespondingUnsignedType(BaseType);
10429 if (Underlying.
isNull())
10436 if (BaseType->isDependentType())
10437 return Context.getUnaryTransformType(BaseType, BaseType, UKind);
10440 case UnaryTransformType::EnumUnderlyingType: {
10444 case UnaryTransformType::AddPointer: {
10448 case UnaryTransformType::RemovePointer: {
10452 case UnaryTransformType::Decay: {
10456 case UnaryTransformType::AddLvalueReference:
10457 case UnaryTransformType::AddRvalueReference: {
10461 case UnaryTransformType::RemoveAllExtents:
10462 case UnaryTransformType::RemoveExtent: {
10466 case UnaryTransformType::RemoveCVRef:
10467 case UnaryTransformType::RemoveReference: {
10471 case UnaryTransformType::RemoveConst:
10472 case UnaryTransformType::RemoveCV:
10473 case UnaryTransformType::RemoveRestrict:
10474 case UnaryTransformType::RemoveVolatile: {
10478 case UnaryTransformType::MakeSigned:
10479 case UnaryTransformType::MakeUnsigned: {
10497 int DisallowedKind = -1;
10498 if (
T->isArrayType())
10499 DisallowedKind = 1;
10500 else if (
T->isFunctionType())
10501 DisallowedKind = 2;
10502 else if (
T->isReferenceType())
10503 DisallowedKind = 3;
10504 else if (
T->isAtomicType())
10505 DisallowedKind = 4;
10506 else if (
T.hasQualifiers())
10507 DisallowedKind = 5;
10508 else if (
T->isSizelessType())
10509 DisallowedKind = 6;
10512 DisallowedKind = 7;
10513 else if (
T->isBitIntType())
10514 DisallowedKind = 8;
10517 DisallowedKind = 9;
10518 else if (
T->isOverflowBehaviorType())
10520 DisallowedKind = 10;
10522 if (DisallowedKind != -1) {
10523 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 constexpr uint64_t MaxVectorSizeInBits
static QualType deduceOpenCLPointeeAddrSpace(Sema &S, QualType PointeeType)
static bool checkOpenCLPipePacketType(Sema &S, QualType T, SourceLocation Loc)
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 constexpr uint64_t MaxVectorElements
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)
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 void fillDependentAddressSpaceTypeLoc(DependentAddressSpaceTypeLoc DASTL, ArrayRef< const ParsedAttributesView * > AttrLists)
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 getAutoType(DeducedKind DK, QualType DeducedAsType, AutoTypeKeyword Keyword, TemplateName TypeConstraintConcept=TemplateName(), ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
CanQualType UnsignedLongTy
CountAttributedType * getIncompleteCountAttributedType(QualType WrappedTy, bool CountInBytes, bool OrNull) const
Return a CountAttributedType whose count expression has not been parsed yet, for use by a late-parsed...
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>.
DeclarationNameInfo getNameForTemplate(TemplateName Name, SourceLocation NameLoc) const
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
TemplateName getNamedConcept() const
SourceLocation getLAngleLoc() const
void setConceptReference(ConceptReference *CR)
NamedDecl * getFoundDecl() const
TemplateArgumentLoc getArgLoc(unsigned i) const
unsigned getNumArgs() 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)
[BoundsSafety] Represents a parent type class for CountAttributedType and similar sugar types that wi...
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
This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateName 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...
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
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
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
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
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()
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
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
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...
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
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.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, bool AllowRelaxedEval=false) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
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.
Represents a member of a struct/union/class.
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
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.
bool ActOnLateParsedTypeAttrArgument(BoundsAttributedType *BATy, FieldDecl *FD, Expr *Arg)
Supply the parsed argument of a late-parsed bounds attribute to the type built for it by ProcessLateP...
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 AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, TemplateName NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
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.
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
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.
QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc)
bool ProcessLateParsedTypeAttr(LateParsedTypeAttrInfo &LA, QualType &QT)
Validate the late-parsed type attribute LA and wrap QT in a CountAttributedType with no count yet,...
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.
bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes, bool OrNull)
Check if applying the specified attribute variant from the "counted by" family of attributes to Field...
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 checkArrayTooLarge(QualType ElementType, const llvm::APSInt &NumElements, SourceLocation Loc, SourceRange Range=SourceRange())
Diagnose an array of NumElements elements of type ElementType that is too large.
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 ValidateBoundsAttrTypeForTypePosition(QualType Ty, AttributeCommonInfo::Kind AttrKind, SourceLocation AttrLoc, SourceRange AttrRange, unsigned PointerNestLevel, BoundsAttrFlags &Flags)
Check a counted_by-family attribute in type position and initialize Flags from AttrKind.
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)
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 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 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 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 size_t getMaxBitIntWidth() const
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.
@ Template
A single template declaration.
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 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.
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
VectorKind getRVVFixedLengthDataVectorKind(int LMulLog2)
Inverse of getRVVFixedLengthDataLMulLog2().
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)
QualType pointeeType(QualType T)
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.
VectorKind getRVVFixedLengthMaskVectorKind(unsigned RatioLog2, unsigned SubByteLanes)
Inverse of getRVVFixedLengthMaskRatioLog2() and getRVVFixedLengthMaskSubByteLanes().
@ 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.
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
@ NeonPoly
is ARM Neon polynomial vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ 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.
The part of a late-parsed type attribute that Sema reads and fills in during type construction.
BoundsAttributedType * TypeToComplete
The type built for this attribute during type construction, still missing the argument that hasn't be...
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.