31#include "llvm/ADT/DenseMap.h"
32#include "llvm/ADT/DenseSet.h"
65 assert(resultClass &&
"unexpected object type!");
70 if (receiverTypeIfCall.
isNull() &&
80 if (receiverTypeIfCall.
isNull())
87 if (!receiverClass)
return false;
90 assert(receiverClass &&
"method not associated with a class!");
104 if (receiverTypeIfCall.
isNull() &&
106 method->
addAttr(UnavailableAttr::CreateImplicit(Context,
"",
107 UnavailableAttr::IR_ARCInitReturnsUnrelated, loc));
112 Diag(loc, diag::err_arc_init_method_unrelated_result_type);
121 if (OldD->
hasAttr<NoEscapeAttr>() && !NewD->
hasAttr<NoEscapeAttr>()) {
122 S.
Diag(NewD->
getLocation(), diag::warn_overriding_method_missing_noescape);
159 CurrentClass = Cat->getClassInterface();
160 else if (
ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(DC))
161 CurrentClass = Impl->getClassInterface();
163 = dyn_cast<ObjCCategoryImplDecl>(DC))
164 CurrentClass = CatImpl->getClassInterface();
169 diag::warn_related_result_type_compatibility_class)
175 diag::warn_related_result_type_compatibility_protocol)
182 diag::note_related_result_type_family)
187 diag::note_related_result_type_overridden);
190 if ((NewMethod->
hasAttr<NSReturnsRetainedAttr>() !=
191 Overridden->
hasAttr<NSReturnsRetainedAttr>())) {
194 ? diag::err_nsreturns_retained_attribute_mismatch
195 : diag::warn_nsreturns_retained_attribute_mismatch)
199 if ((NewMethod->
hasAttr<NSReturnsNotRetainedAttr>() !=
200 Overridden->
hasAttr<NSReturnsNotRetainedAttr>())) {
203 ? diag::err_nsreturns_retained_attribute_mismatch
204 : diag::warn_nsreturns_retained_attribute_mismatch)
213 ni != ne && oi != oe; ++ni, ++oi) {
216 if (newDecl->
hasAttr<NSConsumedAttr>() !=
217 oldDecl->
hasAttr<NSConsumedAttr>()) {
220 ? diag::err_nsconsumed_attribute_mismatch
221 : diag::warn_nsconsumed_attribute_mismatch);
266 method->
addAttr(NSConsumesSelfAttr::CreateImplicit(Context));
270 if (method->
hasAttr<NSReturnsRetainedAttr>())
278 if (method->
hasAttr<NSReturnsRetainedAttr>() ||
279 method->
hasAttr<NSReturnsNotRetainedAttr>() ||
280 method->
hasAttr<NSReturnsAutoreleasedAttr>())
285 method->
addAttr(NSReturnsRetainedAttr::CreateImplicit(Context));
293 bool IsCategory =
false;
294 StringRef RealizedPlatform;
296 nullptr, VersionTuple(),
299 if (isa<ObjCMethodDecl>(ND)) {
302 if (RealizedPlatform.empty())
306 if (RealizedPlatform.ends_with(
"_app_extension"))
308 S.
Diag(ImplLoc, diag::warn_unavailable_def);
313 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND)) {
314 if (!CD->getClassInterface()->isDeprecated())
316 ND = CD->getClassInterface();
321 S.
Diag(ImplLoc, diag::warn_deprecated_def)
322 << (isa<ObjCMethodDecl>(ND)
324 : isa<ObjCCategoryDecl>(ND) || IsCategory ? 2
326 if (isa<ObjCMethodDecl>(ND))
331 << (isa<ObjCCategoryDecl>(ND) ?
"category" :
"class");
364 return !
T.getLocalQualifiers().hasObjCLifetime();
386 diag::err_func_def_incomplete_result))
408 if (!Param->isInvalidDecl() &&
getLangOpts().ObjCAutoRefCount &&
410 Diag(Param->getLocation(), diag::warn_arc_strong_pointer_objc_pointer) <<
413 if (Param->getIdentifier())
456 ImplDeclOfMethodDecl = OID->getImplementation();
457 else if (
ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(ContDeclOfMethodDecl)) {
458 if (CD->IsClassExtension()) {
460 ImplDeclOfMethodDecl = OID->getImplementation();
462 ImplDeclOfMethodDecl = CD->getImplementation();
466 if (!ImplDeclOfMethodDecl || ImplDeclOfMethodDecl != ImplDeclOfMethodDef)
474 IC->getSuperClass() !=
nullptr;
475 }
else if (IC->hasDesignatedInitializers()) {
501 (SuperMethod && SuperMethod->
hasAttr<ObjCRequiresSuperAttr>());
518 ObjCInterfaceValidatorCCC() : CurrentIDecl(nullptr) {}
520 : CurrentIDecl(IDecl) {}
522 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
527 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
528 return std::make_unique<ObjCInterfaceValidatorCCC>(*
this);
540 unsigned NumProtoRefs,
545 for (
unsigned i = 0; i < NumProtoRefs; ++i) {
566 ObjCInterfaceValidatorCCC CCC(IDecl);
571 << SuperName << ClassName);
577 Diag(SuperLoc, diag::err_recursive_superclass)
578 << SuperName << ClassName <<
SourceRange(AtInterfaceLoc, ClassLoc);
582 dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
586 if (SuperClassDecl) {
591 if (PrevDecl && !SuperClassDecl) {
595 dyn_cast_or_null<TypedefNameDecl>(PrevDecl)) {
599 SuperClassDecl = dyn_cast<ObjCInterfaceDecl>(IDecl);
617 if (!SuperClassDecl) {
618 Diag(SuperLoc, diag::err_redefinition_different_kind) << SuperName;
623 if (!isa_and_nonnull<TypedefNameDecl>(PrevDecl)) {
625 Diag(SuperLoc, diag::err_undef_superclass)
626 << SuperName << ClassName <<
SourceRange(AtInterfaceLoc, ClassLoc);
628 SuperLoc, SuperClassType, diag::err_forward_superclass,
631 SuperClassDecl =
nullptr;
636 if (SuperClassType.
isNull()) {
637 assert(!SuperClassDecl &&
"Failed to set SuperClassType?");
643 if (!SuperTypeArgs.empty()) {
646 SuperTypeArgsRange.
getBegin(), SuperTypeArgs,
656 if (!SuperClassTInfo) {
673 if (parsedTypeBound) {
685 diag::err_objc_type_param_bound_missing_pointer)
686 << typeBound << paramName
705 diag::err_objc_type_param_bound_nonobject)
706 << typeBound << paramName;
709 typeBoundInfo =
nullptr;
718 bool diagnosed =
false;
722 rangeToRemove =
attr.getLocalSourceRange();
723 if (
attr.getTypePtr()->getImmediateNullability()) {
725 diag::err_objc_type_param_bound_explicit_nullability)
726 << paramName << typeBound
736 diag::err_objc_type_param_bound_qualified)
737 << paramName << typeBound
747 if (!quals.
empty()) {
757 if (!typeBoundInfo) {
764 varianceLoc, index, paramLoc, paramName,
765 colonLoc, typeBoundInfo);
777 typeParamsIn.size());
783 llvm::SmallDenseMap<IdentifierInfo *, ObjCTypeParamDecl *> knownParams;
784 for (
auto *typeParam : typeParams) {
785 auto known = knownParams.find(typeParam->getIdentifier());
786 if (known != knownParams.end()) {
787 Diag(typeParam->getLocation(), diag::err_objc_type_param_redecl)
788 << typeParam->getIdentifier()
791 typeParam->setInvalidDecl();
793 knownParams.insert(std::make_pair(typeParam->getIdentifier(), typeParam));
806 for (
auto *typeParam : *typeParamList) {
807 if (!typeParam->isInvalidDecl()) {
808 S->RemoveDecl(typeParam);
817 enum class TypeParamListContext {
831 TypeParamListContext newContext) {
833 if (prevTypeParams->
size() != newTypeParams->
size()) {
835 if (newTypeParams->
size() > prevTypeParams->
size()) {
841 S.
Diag(diagLoc, diag::err_objc_type_param_arity_mismatch)
842 <<
static_cast<unsigned>(newContext)
843 << (newTypeParams->
size() > prevTypeParams->
size())
844 << prevTypeParams->
size()
845 << newTypeParams->
size();
851 for (
unsigned i = 0, n = prevTypeParams->
size(); i != n; ++i) {
858 newContext != TypeParamListContext::Definition) {
877 auto diag = S.
Diag(diagLoc,
878 diag::err_objc_type_param_variance_conflict)
879 <<
static_cast<unsigned>(newTypeParam->
getVariance())
881 <<
static_cast<unsigned>(prevTypeParam->
getVariance())
890 StringRef newVarianceStr
897 (newVarianceStr +
" ").str());
924 S.
Diag(newBoundRange.
getBegin(), diag::err_objc_type_param_bound_conflict)
948 if (newContext == TypeParamListContext::ForwardDeclaration ||
949 newContext == TypeParamListContext::Definition) {
957 diag::err_objc_type_param_bound_missing)
960 << (newContext == TypeParamListContext::ForwardDeclaration)
979 Decl *
const *ProtoRefs,
unsigned NumProtoRefs,
982 assert(ClassName &&
"Missing class identifier");
990 if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
991 Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
1018 if (typeParamList) {
1022 TypeParamListContext::Definition)) {
1023 typeParamList =
nullptr;
1026 Diag(ClassLoc, diag::err_objc_parameterized_forward_class_first)
1028 Diag(prevTypeParamList->getLAngleLoc(), diag::note_previous_decl)
1033 for (
auto *typeParam : *prevTypeParamList) {
1039 typeParam->getUnderlyingType())));
1052 ClassName, typeParamList, PrevIDecl, ClassLoc);
1058 SkipBody->
New = IDecl;
1061 Diag(AtInterfaceLoc, diag::err_duplicate_class_def)
1063 Diag(Def->getLocation(), diag::note_previous_definition);
1091 ClassName, ClassLoc,
1092 SuperName, SuperLoc, SuperTypeArgs,
1093 SuperTypeArgsRange);
1101 NumProtoRefs, ProtoLocs);
1103 ProtoLocs, Context);
1126 if (
const TypedefNameDecl *TDecl = dyn_cast_or_null<TypedefNameDecl>(IDecl)) {
1127 QualType T = TDecl->getUnderlyingType();
1130 ProtocolRefs.append(OPT->qual_begin(), OPT->qual_end());
1135 ProtocolLocs.append(OPT->getNumProtocols(), SuperLoc);
1153 Diag(AliasLocation, diag::err_conflicting_aliasing_type) << AliasName;
1162 dyn_cast_or_null<TypedefNameDecl>(CDeclU)) {
1163 QualType T = TDecl->getUnderlyingType();
1166 ClassName = IDecl->getIdentifier();
1175 Diag(ClassLocation, diag::warn_undef_interface) << ClassName;
1197 E = PList.
end(); I !=
E; ++I) {
1199 if (PDecl->getIdentifier() == PName) {
1200 Diag(Ploc, diag::err_protocol_has_circular_dependency);
1201 Diag(PrevLoc, diag::note_previous_definition);
1205 if (!PDecl->hasDefinition())
1209 PDecl->getLocation(), PDecl->getReferencedProtocols()))
1224 assert(ProtocolName &&
"Missing protocol identifier");
1234 ProtocolLoc, AtProtoInterfaceLoc,
1239 SkipBody->
New = PDecl;
1243 Diag(ProtocolLoc, diag::warn_duplicate_protocol_def) << ProtocolName;
1244 Diag(Def->getLocation(), diag::note_previous_definition);
1259 ProtocolName, ProtocolLoc, PrevDecl->
getLocation(), PList);
1264 ProtocolLoc, AtProtoInterfaceLoc,
1279 if (!err && NumProtoRefs ) {
1282 NumProtoRefs, ProtoLocs);
1284 ProtoLocs, Context);
1296 UndefinedProtocol = PDecl;
1302 UndefinedProtocol = PI;
1312 bool ForObjCContainer,
1325 PDiag(diag::err_undeclared_protocol_suggest)
1330 Diag(Pair.second, diag::err_undeclared_protocol) << Pair.first;
1339 if (!ForObjCContainer) {
1348 if (WarnOnDeclarations &&
1350 Diag(Pair.second, diag::warn_undef_protocolref) << Pair.first;
1351 Diag(UndefinedProtocol->
getLocation(), diag::note_protocol_decl_undefined)
1352 << UndefinedProtocol;
1354 Protocols.push_back(PDecl);
1361class ObjCTypeArgOrProtocolValidatorCCC final
1366 ObjCTypeArgOrProtocolValidatorCCC(
ASTContext &context,
1368 : Context(context), LookupKind(lookupKind) { }
1370 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
1384 if (isa<RecordDecl>(typeDecl) && !Context.
getLangOpts().CPlusPlus)
1390 if (
type->isObjCObjectPointerType() ||
1391 type->isBlockPointerType() ||
1392 type->isDependentType() ||
1393 type->isObjCObjectType())
1410 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
1411 return std::make_unique<ObjCTypeArgOrProtocolValidatorCCC>(*
this);
1420 bool SelectProtocolFirst) {
1421 Diag(TypeArgLoc, diag::err_objc_type_args_and_protocols)
1422 << SelectProtocolFirst << TypeArgId << ProtocolId
1433 bool warnOnIncompleteProtocols) {
1437 unsigned numProtocolsResolved = 0;
1438 auto resolvedAsProtocols = [&] {
1439 assert(numProtocolsResolved == identifiers.size() &&
"Unresolved protocols");
1446 bool allAreTypeNames =
false;
1450 baseClass = objcObjectType->getInterface();
1453 if (typeParams->size() == numProtocolsResolved) {
1455 allAreTypeNames =
true;
1462 for (
unsigned i = 0, n = protocols.size(); i != n; ++i) {
1467 if (!warnOnIncompleteProtocols) {
1479 if (warnOnIncompleteProtocols &&
1481 Diag(identifierLocs[i], diag::warn_undef_protocolref)
1490 if (allAreTypeNames) {
1494 if (isa<ObjCInterfaceDecl>(
decl)) {
1496 firstClassNameLoc = identifierLocs[i];
1497 }
else if (!isa<TypeDecl>(
decl)) {
1499 allAreTypeNames =
false;
1502 allAreTypeNames =
false;
1511 if (allAreTypeNames && firstClassNameLoc.
isValid()) {
1514 bool allProtocolsDeclared =
true;
1515 for (
auto *proto : protocols) {
1517 allProtocolsDeclared =
false;
1522 if (allProtocolsDeclared) {
1523 Diag(firstClassNameLoc, diag::warn_objc_redundant_qualified_class_type)
1530 protocolLAngleLoc = lAngleLoc;
1531 protocolRAngleLoc = rAngleLoc;
1532 assert(protocols.size() == identifierLocs.size());
1536 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1538 protocols.push_back(proto);
1540 ++numProtocolsResolved;
1544 if (numProtocolsResolved == identifiers.size())
1545 return resolvedAsProtocols();
1551 typedef llvm::PointerUnion<TypeDecl *, ObjCInterfaceDecl *> TypeOrClassDecl;
1553 unsigned numTypeDeclsResolved = 0;
1554 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1558 typeDecls.push_back(TypeOrClassDecl());
1562 if (
auto typeDecl = dyn_cast<TypeDecl>(
decl)) {
1563 typeDecls.push_back(typeDecl);
1564 ++numTypeDeclsResolved;
1568 if (
auto objcClass = dyn_cast<ObjCInterfaceDecl>(
decl)) {
1569 typeDecls.push_back(objcClass);
1570 ++numTypeDeclsResolved;
1574 typeDecls.push_back(TypeOrClassDecl());
1581 auto resolveTypeReference = [&](TypeOrClassDecl typeDecl,
SourceLocation loc)
1585 const char* prevSpec;
1588 if (
auto *actualTypeDecl = typeDecl.dyn_cast<
TypeDecl *>())
1616 Diag(loc, diag::err_objc_type_arg_missing_star)
1627 auto resolvedAsTypeDecls = [&] {
1631 assert(numTypeDeclsResolved == identifiers.size() &&
"Unresolved type decl");
1633 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1635 TypeResult type = resolveTypeReference(typeDecls[i], identifierLocs[i]);
1636 if (!
type.isUsable()) {
1641 typeArgs.push_back(
type.get());
1644 typeArgsLAngleLoc = lAngleLoc;
1645 typeArgsRAngleLoc = rAngleLoc;
1650 if (numTypeDeclsResolved == identifiers.size())
1651 return resolvedAsTypeDecls();
1657 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1660 if (protocols[i] || typeDecls[i]) {
1666 if (protocols[i] && typeDecls[i])
1689 identifiers[i], identifierLocs[i],
1690 protocols[i] !=
nullptr);
1698 ObjCTypeArgOrProtocolValidatorCCC CCC(Context, lookupKind);
1706 PDiag(diag::err_undeclared_protocol_suggest)
1709 protocols[i] = proto;
1710 ++numProtocolsResolved;
1717 PDiag(diag::err_unknown_typename_suggest)
1720 typeDecls[i] = typeDecl;
1721 ++numTypeDeclsResolved;
1728 PDiag(diag::err_unknown_type_or_class_name_suggest)
1729 << identifiers[i] <<
true);
1731 typeDecls[i] = objcClass;
1732 ++numTypeDeclsResolved;
1738 Diag(identifierLocs[i],
1741 ? diag::err_undeclared_protocol
1742 : diag::err_unknown_typename))
1751 if (numProtocolsResolved == identifiers.size())
1752 return resolvedAsProtocols();
1755 assert(numTypeDeclsResolved == identifiers.size() &&
"Not all types?");
1756 return resolvedAsTypeDecls();
1767 llvm::DenseMap<Selector, const ObjCMethodDecl*> MethodMap;
1768 for (
auto *MD : ID->methods())
1769 MethodMap[MD->getSelector()] = MD;
1771 if (MethodMap.empty())
1773 for (
const auto *Method : CAT->
methods()) {
1774 const ObjCMethodDecl *&PrevMethod = MethodMap[Method->getSelector()];
1778 Diag(Method->getLocation(), diag::err_duplicate_method_decl)
1779 << Method->getDeclName();
1797 IdentPair.second, AtProtocolLoc, PrevDecl);
1808 DeclsInGroup.push_back(PDecl);
1818 Decl *
const *ProtoRefs,
unsigned NumProtoRefs,
1829 diag::err_category_forward_interface,
1830 CategoryName ==
nullptr)) {
1835 AtInterfaceLoc, ClassLoc, CategoryLoc,
1836 CategoryName, IDecl, typeParamList);
1841 Diag(ClassLoc, diag::err_undef_interface) << ClassName;
1847 Diag(ClassLoc, diag::err_class_extension_after_impl) << ClassName;
1849 diag::note_implementation_declared);
1857 Diag(CategoryLoc, diag::warn_dup_category_def)
1858 << ClassName << CategoryName;
1859 Diag(
Previous->getLocation(), diag::note_previous_definition);
1864 if (typeParamList) {
1867 SemaRef, prevTypeParamList, typeParamList,
1868 CategoryName ? TypeParamListContext::Category
1869 : TypeParamListContext::Extension))
1870 typeParamList =
nullptr;
1873 diag::err_objc_parameterized_category_nonclass)
1874 << (CategoryName !=
nullptr)
1878 typeParamList =
nullptr;
1883 ClassLoc, CategoryLoc, CategoryName, IDecl,
1896 NumProtoRefs, ProtoLocs);
1898 ProtoLocs, Context);
1902 NumProtoRefs, Context);
1927 ClassLoc, CatLoc, CatName, IDecl,
1935 ClassLoc, AtCatImplLoc, CatLoc);
1938 Diag(ClassLoc, diag::err_undef_interface) << ClassName;
1942 diag::err_undef_interface)) {
1954 if (IDecl && IDecl->
hasAttr<ObjCRuntimeVisibleAttr>()) {
1955 Diag(ClassLoc, diag::err_objc_runtime_visible_category)
1962 Diag(ClassLoc, diag::err_dup_implementation_category) << ClassName
1965 diag::note_previous_definition);
1991 if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
1992 Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
1994 }
else if ((IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl))) {
1998 diag::warn_undef_interface);
2002 ObjCInterfaceValidatorCCC CCC{};
2011 Corrected,
PDiag(diag::warn_undef_interface_suggest) << ClassName,
2014 Diag(ClassLoc, diag::warn_undef_interface) << ClassName;
2020 if (SuperClassname) {
2025 if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
2026 Diag(SuperClassLoc, diag::err_redefinition_different_kind)
2030 SDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
2034 Diag(SuperClassLoc, diag::err_undef_superclass)
2035 << SuperClassname << ClassName;
2039 Diag(SuperClassLoc, diag::err_conflicting_super_class)
2055 nullptr, ClassLoc,
true);
2078 ClassLoc, AtClassImplLoc, SuperClassLoc);
2091 Diag(ClassLoc, diag::err_dup_implementation_class) << ClassName;
2093 diag::note_previous_definition);
2107 Diag(ClassLoc, diag::err_objc_runtime_visible_subclass)
2120 DeclsInGroup.reserve(Decls.size() + 1);
2122 for (
unsigned i = 0, e = Decls.size(); i != e; ++i) {
2123 Decl *Dcl = Decls[i];
2128 DeclsInGroup.push_back(Dcl);
2131 DeclsInGroup.push_back(ObjCImpDecl);
2139 assert(ImpDecl &&
"missing implementation decl");
2150 for (
unsigned i = 0, e = numIvars; i != e; ++i) {
2167 assert(ivars &&
"missing @implementation ivars");
2171 for (
unsigned i = 0; i < numIvars; i++) {
2176 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
2184 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
2201 for (; numIvars > 0 && IVI != IVE; ++IVI) {
2204 assert (ImplIvar &&
"missing implementation ivar");
2205 assert (ClsIvar &&
"missing class ivar");
2217 diag::err_conflicting_ivar_bitwidth)
2220 diag::note_previous_definition);
2232 Diag(ivars[j]->getLocation(), diag::err_inconsistent_ivar_count);
2233 else if (IVI != IVE)
2234 Diag(IVI->getLocation(), diag::err_inconsistent_ivar_count);
2262 std::string FixItStr;
2263 llvm::raw_string_ostream Out(FixItStr);
2274 S.
Diag(MethodLoc, diag::note_method_declared_at) << method;
2350 (y &
~Decl::OBJC_TQ_CSNullability);
2356 bool IsProtocolMethodDecl,
2357 bool IsOverridingMode,
2359 if (IsProtocolMethodDecl &&
2365 ? diag::warn_conflicting_overriding_ret_type_modifiers
2366 : diag::warn_conflicting_ret_type_modifiers))
2375 if (Warn && IsOverridingMode &&
2383 diag::warn_conflicting_nullability_attr_overriding_ret_types)
2400 IsOverridingMode ? diag::warn_conflicting_overriding_ret_types
2401 : diag::warn_conflicting_ret_types;
2417 IsOverridingMode ? diag::warn_non_covariant_overriding_ret_types
2418 : diag::warn_non_covariant_ret_types;
2427 ? diag::note_previous_declaration
2428 : diag::note_previous_definition)
2438 bool IsProtocolMethodDecl,
2439 bool IsOverridingMode,
2441 if (IsProtocolMethodDecl &&
2445 if (IsOverridingMode)
2447 diag::warn_conflicting_overriding_param_modifiers)
2451 diag::warn_conflicting_param_modifiers)
2463 if (Warn && IsOverridingMode &&
2467 diag::warn_conflicting_nullability_attr_overriding_param_types)
2482 IsOverridingMode ? diag::warn_conflicting_overriding_param_types
2483 : diag::warn_conflicting_param_types;
2499 IsOverridingMode ? diag::warn_non_contravariant_overriding_param_types
2500 : diag::warn_non_contravariant_param_types;
2506 << MethodImpl->
getDeclName() << IfaceTy << ImplTy;
2508 (IsOverridingMode ? diag::note_previous_declaration
2509 : diag::note_previous_definition))
2520 if (implFamily == declFamily)
return false;
2532 unsigned errorID = diag::err_arc_lost_method_convention;
2533 unsigned noteID = diag::note_arc_lost_method_convention;
2536 family = implFamily;
2537 errorID = diag::err_arc_gained_method_convention;
2538 noteID = diag::note_arc_gained_method_convention;
2542 enum FamilySelector {
2543 F_alloc, F_copy, F_mutableCopy = F_copy, F_init, F_new
2545 FamilySelector familySelector = FamilySelector();
2548 case OMF_None: llvm_unreachable(
"logic error, no method convention");
2562 case OMF_init: familySelector = F_init;
break;
2563 case OMF_alloc: familySelector = F_alloc;
break;
2564 case OMF_copy: familySelector = F_copy;
break;
2566 case OMF_new: familySelector = F_new;
break;
2569 enum ReasonSelector { R_NonObjectReturn, R_UnrelatedReturn };
2570 ReasonSelector reasonSelector;
2575 reasonSelector = R_UnrelatedReturn;
2577 reasonSelector = R_NonObjectReturn;
2581 S.
Diag(
decl->getLocation(), noteID) <<
int(familySelector) <<
int(reasonSelector);
2588 bool IsProtocolMethodDecl) {
2594 IsProtocolMethodDecl,
false,
true);
2599 IM != EM && IF != EF; ++IM, ++IF) {
2601 IsProtocolMethodDecl,
false,
true);
2606 diag::warn_conflicting_variadic);
2613 bool IsProtocolMethodDecl) {
2621 IM != EM && IF != EF; ++IM, ++IF) {
2623 IsProtocolMethodDecl,
true,
true);
2628 diag::warn_conflicting_overriding_variadic);
2637 bool IsProtocolMethodDecl) {
2647 if (MethodDecl->
hasAttr<UnavailableAttr>() ||
2648 MethodDecl->
hasAttr<DeprecatedAttr>())
2652 IsProtocolMethodDecl,
false,
false);
2657 IM != EM && IF != EF; ++IM, ++IF) {
2659 *IF, IsProtocolMethodDecl,
false,
false);
2671 diag::warn_category_method_impl_match);
2688 if (PDecl->
hasAttr<ObjCExplicitProtocolImplAttr>())
2690 for (
const auto *PI : PDecl->
protocols())
2716 : dyn_cast<ObjCInterfaceDecl>(CDecl);
2717 assert (IDecl &&
"CheckProtocolMethodDefs - IDecl is null");
2733 if (PDecl->
hasAttr<ObjCExplicitProtocolImplAttr>()) {
2734 if (!ProtocolsExplictImpl) {
2756 if (InsMap.count(fISelector))
2775 if (method->getImplementationControl() !=
2777 !method->isPropertyAccessor() &&
2778 !InsMap.count(method->getSelector()) &&
2780 method->getSelector(),
true ,
2793 method->getSelector(),
true ,
2795 if (
C || MethodInClass->isPropertyAccessor())
2797 unsigned DIAG = diag::warn_unimplemented_protocol_method;
2805 if (method->getImplementationControl() !=
2807 !ClsMap.count(method->getSelector()) &&
2809 method->getSelector(),
false ,
2811 true ,
nullptr ))) {
2819 unsigned DIAG = diag::warn_unimplemented_protocol_method;
2828 ProtocolsExplictImpl);
2838 bool WarnCategoryMethodImpl) {
2842 if (!InsMapSeen.insert(I->getSelector()).second)
2844 if (!I->isPropertyAccessor() &&
2845 !InsMap.count(I->getSelector())) {
2848 diag::warn_undef_method_impl);
2854 "Expected to find the method through lookup as well");
2856 if (ImpMethodDecl) {
2860 if (!WarnCategoryMethodImpl)
2862 isa<ObjCProtocolDecl>(CDecl));
2863 else if (!I->isPropertyAccessor())
2872 if (!ClsMapSeen.insert(I->getSelector()).second)
2874 if (!I->isPropertyAccessor() &&
2875 !ClsMap.count(I->getSelector())) {
2878 diag::warn_undef_method_impl);
2883 "Expected to find the method through lookup as well");
2885 if (ImpMethodDecl) {
2889 if (!WarnCategoryMethodImpl)
2891 isa<ObjCProtocolDecl>(CDecl));
2892 else if (!I->isPropertyAccessor())
2901 for (
auto *PI : PD->protocols())
2903 IMPDecl, PI, IncompleteImpl,
false,
2904 WarnCategoryMethodImpl);
2911 if (!WarnCategoryMethodImpl) {
2912 for (
auto *Cat : I->visible_categories())
2914 IMPDecl, Cat, IncompleteImpl,
2915 ImmediateClass && Cat->IsClassExtension(),
2916 WarnCategoryMethodImpl);
2919 for (
auto *Ext : I->visible_extensions())
2921 IMPDecl, Ext, IncompleteImpl,
false,
2922 WarnCategoryMethodImpl);
2926 for (
auto *PI : I->all_referenced_protocols())
2928 IMPDecl, PI, IncompleteImpl,
false,
2929 WarnCategoryMethodImpl);
2933 if (!WarnCategoryMethodImpl && I->getSuperClass())
2936 I->getSuperClass(), IncompleteImpl,
false);
2967 if (SuperIDecl && SuperIDecl->
lookupMethod(Sel,
false))
2971 if (InsMap.empty() && ClsMap.empty())
2975 bool IncompleteImpl =
false;
2978 IncompleteImpl,
false,
2984 bool IncompleteImpl) {
2989 InsMap.insert(I->getSelector());
2997 const auto *
P = PImpl->getPropertyDecl();
3000 InsMap.insert(
P->getGetterName());
3001 if (!
P->getSetterName().isNull())
3002 InsMap.insert(
P->getSetterName());
3009 bool SynthesizeProperties =
getLangOpts().ObjCDefaultSynthProperties &&
3011 !IDecl->isObjCRequiresPropertyDefs();
3020 ClsMap.insert(I->getSelector());
3027 IncompleteImpl,
true);
3032 dyn_cast<ObjCCategoryImplDecl>(IMPDecl))
3043 for (
auto *PI : I->all_referenced_protocols())
3045 ClsMap, I, ExplicitImplProtocols);
3049 if (!
C->IsClassExtension()) {
3050 for (
auto *
P :
C->protocols())
3052 ClsMap, CDecl, ExplicitImplProtocols);
3057 llvm_unreachable(
"invalid ObjCContainerDecl type.");
3066 for (
unsigned i = 0; i != NumElts; ++i) {
3071 if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
3081 Diag(AtClassLoc, diag::err_redefinition_different_kind) << IdentList[i];
3089 Diag(AtClassLoc, diag::warn_forward_class_redefinition)
3099 = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
3121 if (PrevIDecl && TypeParams) {
3125 SemaRef, PrevTypeParams, TypeParams,
3126 TypeParamListContext::ForwardDeclaration)) {
3127 TypeParams =
nullptr;
3131 Diag(IdentLocs[i], diag::err_objc_parameterized_forward_class)
3134 Diag(Def->getLocation(), diag::note_defined_here)
3137 TypeParams =
nullptr;
3143 PrevIDecl, IdentLocs[i]);
3151 DeclsInGroup.push_back(IDecl);
3159 const Type *left,
const Type *right);
3169 if (left == right)
return true;
3193 if (isa<VectorType>(left))
return isa<VectorType>(right);
3194 if (isa<VectorType>(right))
return false;
3217 return (leftSK == rightSK);
3223 assert(lt && rt && lt != rt);
3225 if (!isa<RecordType>(lt) || !isa<RecordType>(rt))
return false;
3226 RecordDecl *left = cast<RecordType>(lt)->getDecl();
3227 RecordDecl *right = cast<RecordType>(rt)->getDecl();
3233 if ((isa<CXXRecordDecl>(left) && !cast<CXXRecordDecl>(left)->isPOD()) ||
3234 (isa<CXXRecordDecl>(right) && !cast<CXXRecordDecl>(right)->isPOD()))
3249 for (; li != le && ri != re; ++li, ++ri) {
3250 if (!
matchTypes(Context, strategy, li->getType(), ri->getType()))
3253 return (li == le && ri == re);
3275 (left->
hasAttr<NSReturnsRetainedAttr>()
3276 != right->
hasAttr<NSReturnsRetainedAttr>() ||
3277 left->
hasAttr<NSConsumesSelfAttr>()
3278 != right->
hasAttr<NSConsumesSelfAttr>()))
3285 for (; li != le && ri != re; ++li, ++ri) {
3286 assert(ri != right->
param_end() &&
"Param mismatch");
3293 lparm->
hasAttr<NSConsumedAttr>() != rparm->hasAttr<NSConsumedAttr>())
3301 auto *MethodProtocol = dyn_cast<ObjCProtocolDecl>(Method->
getDeclContext());
3302 auto *MethodInListProtocol =
3306 if ((MethodProtocol && !MethodInListProtocol) ||
3307 (!MethodProtocol && MethodInListProtocol))
3310 if (MethodProtocol && MethodInListProtocol)
3316 return MethodInterface == MethodInListInterface;
3325 if (!CD->IsClassExtension() && List->getBits() < 2)
3326 List->setBits(List->getBits() + 1);
3329 if (List->getMethod() ==
nullptr) {
3330 List->setMethod(Method);
3331 List->setNext(
nullptr);
3339 for (; List;
Previous = List, List = List->getNext()) {
3356 if (!SameDeclaration ||
3362 List->setHasMoreThanOneDecl(
true);
3367 !ListWithSameDeclaration && !List->getMethod()->isDeprecated())
3368 ListWithSameDeclaration = List;
3371 !ListWithSameDeclaration &&
3373 ListWithSameDeclaration = List;
3387 List->setHasMoreThanOneDecl(
true);
3394 List->setMethod(Method);
3400 List->setMethod(Method);
3411 if (ListWithSameDeclaration) {
3414 ListWithSameDeclaration->
setMethod(Method);
3415 ListWithSameDeclaration->
setNext(List);
3435void SemaObjC::AddMethodToGlobalPool(
ObjCMethodDecl *Method,
bool impl,
3453 ObjCMethodList &Entry = instance ? Pos->second.first : Pos->second.second;
3490 assert(BoundInterface &&
"unexpected object type!");
3494 auto *MethodProtocol = dyn_cast<ObjCProtocolDecl>(Method->
getDeclContext());
3495 if (MethodProtocol) {
3505 return MethodInterface == BoundInterface ||
3506 MethodInterface->isSuperClassOf(BoundInterface) ||
3507 BoundInterface->isSuperClassOf(MethodInterface);
3509 llvm_unreachable(
"unknown method context");
3516 bool InstanceFirst,
bool CheckTheOther,
const ObjCObjectType *TypeBound) {
3528 if (M->getMethod() && M->getMethod()->isUnconditionallyVisible()) {
3530 Methods.push_back(M->getMethod());
3534 if (!Methods.empty())
3535 return Methods.size() > 1;
3544 if (M->getMethod() && M->getMethod()->isUnconditionallyVisible()) {
3546 Methods.push_back(M->getMethod());
3549 return Methods.size() > 1;
3557 FilteredMethods.push_back(BestMethod);
3559 for (
auto *M : Methods)
3560 if (M != BestMethod && !M->
hasAttr<UnavailableAttr>())
3561 FilteredMethods.push_back(M);
3563 if (FilteredMethods.size() > 1)
3578 bool receiverIdOrClass,
3588 ObjCMethodList &MethList = instance ? Pos->second.first : Pos->second.second;
3591 if (M->getMethod() && M->getMethod()->isUnconditionallyVisible())
3592 return M->getMethod();
3599 bool receiverIdOrClass) {
3601 bool issueDiagnostic =
false, issueError =
false;
3605 bool strictSelectorMatch =
3606 receiverIdOrClass &&
3609 if (strictSelectorMatch) {
3610 for (
unsigned I = 1, N = Methods.size(); I != N; ++I) {
3612 issueDiagnostic =
true;
3621 if (!strictSelectorMatch ||
3622 (issueDiagnostic &&
getLangOpts().ObjCAutoRefCount))
3623 for (
unsigned I = 1, N = Methods.size(); I != N; ++I) {
3627 issueDiagnostic =
true;
3634 if (issueDiagnostic) {
3636 Diag(R.
getBegin(), diag::err_arc_multiple_method_decl) << Sel << R;
3637 else if (strictSelectorMatch)
3638 Diag(R.getBegin(), diag::warn_strict_multiple_method_decl) << Sel << R;
3640 Diag(R.getBegin(), diag::warn_multiple_method_decl) << Sel << R;
3642 Diag(Methods[0]->getBeginLoc(),
3643 issueError ? diag::note_possibility : diag::note_using)
3644 << Methods[0]->getSourceRange();
3645 for (
unsigned I = 1, N = Methods.size(); I != N; ++I) {
3646 Diag(Methods[I]->getBeginLoc(), diag::note_also_found)
3647 << Methods[I]->getSourceRange();
3659 Method = Method->getNext())
3660 if (Method->getMethod() &&
3663 return Method->getMethod();
3666 Method = Method->getNext())
3667 if (Method->getMethod() &&
3670 return Method->getMethod();
3678 const unsigned MaxEditDistance = 1;
3679 unsigned BestEditDistance = MaxEditDistance + 1;
3682 unsigned MinPossibleEditDistance =
abs((
int)MethodName.size() - (
int)Typo.size());
3683 if (MinPossibleEditDistance > 0 &&
3684 Typo.size() / MinPossibleEditDistance < 1)
3686 unsigned EditDistance = Typo.edit_distance(MethodName,
true, MaxEditDistance);
3687 if (EditDistance > MaxEditDistance)
3689 if (EditDistance == BestEditDistance)
3690 BestMethod.push_back(Method);
3691 else if (EditDistance < BestEditDistance) {
3693 BestMethod.push_back(Method);
3712 bool ObjectIsId =
true, ObjectIsClass =
true;
3714 ObjectIsId = ObjectIsClass =
false;
3719 ObjectType =
QualType(ObjCPtr->getInterfaceType(), 0);
3720 ObjectIsId = ObjectIsClass =
false;
3723 ObjectIsClass =
false;
3733 if (M->getMethod() &&
3734 (M->getMethod()->getSelector().getNumArgs() == NumArgs) &&
3735 (M->getMethod()->getSelector() != Sel)) {
3737 Methods.push_back(M->getMethod());
3738 else if (!ObjectIsClass &&
3740 SemaRef, M->getMethod()->getSelector(), ObjectType))
3741 Methods.push_back(M->getMethod());
3745 if (M->getMethod() &&
3746 (M->getMethod()->getSelector().getNumArgs() == NumArgs) &&
3747 (M->getMethod()->getSelector() != Sel)) {
3749 Methods.push_back(M->getMethod());
3750 else if (!ObjectIsId &&
3752 SemaRef, M->getMethod()->getSelector(), ObjectType))
3753 Methods.push_back(M->getMethod());
3758 for (
unsigned i = 0, e = Methods.size(); i < e; i++) {
3762 return (SelectedMethods.size() == 1) ? SelectedMethods[0] :
nullptr;
3772 for (
auto *Ivar : ID->ivars()) {
3773 if (Ivar->isInvalidDecl())
3778 Diag(Ivar->getLocation(), diag::err_duplicate_member) << II;
3780 Ivar->setInvalidDecl();
3790 for (
auto ivar = ID->getClassInterface()->all_declared_ivar_begin();
3791 ivar; ivar = ivar->getNextIvar()) {
3792 if (ivar->isInvalidDecl())
continue;
3795 S.
Diag(ivar->getLocation(), diag::err_arc_weak_disabled);
3797 S.
Diag(ivar->getLocation(), diag::err_arc_weak_no_runtime);
3809 for (
auto ivar = ID->all_declared_ivar_begin(); ivar;
3810 ivar = ivar->getNextIvar()) {
3811 if (ivar->isInvalidDecl())
3817 S.
Diag(ivar->getLocation(), diag::err_flexible_array_arc_retainable);
3818 ivar->setInvalidDecl();
3825 case Decl::ObjCInterface:
3827 case Decl::ObjCProtocol:
3829 case Decl::ObjCCategory:
3833 case Decl::ObjCImplementation:
3835 case Decl::ObjCCategoryImpl:
3847 return (RecordTy && RecordTy->getDecl()->hasFlexibleArrayMember());
3854 if ((IntfDecl = dyn_cast<ObjCInterfaceDecl>(OCD))) {
3855 Ivars = IntfDecl->
ivars();
3856 }
else if (
auto *ImplDecl = dyn_cast<ObjCImplementationDecl>(OCD)) {
3857 IntfDecl = ImplDecl->getClassInterface();
3858 Ivars = ImplDecl->
ivars();
3859 }
else if (
auto *CategoryDecl = dyn_cast<ObjCCategoryDecl>(OCD)) {
3860 if (CategoryDecl->IsClassExtension()) {
3861 IntfDecl = CategoryDecl->getClassInterface();
3862 Ivars = CategoryDecl->
ivars();
3867 if (!isa<ObjCInterfaceDecl>(OCD)) {
3868 for (
auto *ivar : Ivars) {
3870 S.
Diag(ivar->getLocation(), diag::warn_variable_sized_ivar_visibility)
3871 << ivar->getDeclName() << ivar->getType();
3883 if (ivar->isInvalidDecl() || !ivar->getNextIvar())
3886 bool IsInvalidIvar =
false;
3888 S.
Diag(ivar->getLocation(), diag::err_flexible_array_not_at_end)
3889 << ivar->getDeclName() << IvarTy
3891 IsInvalidIvar =
true;
3893 if (RecordTy->getDecl()->hasFlexibleArrayMember()) {
3894 S.
Diag(ivar->getLocation(),
3895 diag::err_objc_variable_sized_type_not_at_end)
3896 << ivar->getDeclName() << IvarTy;
3897 IsInvalidIvar =
true;
3900 if (IsInvalidIvar) {
3901 S.
Diag(ivar->getNextIvar()->getLocation(),
3902 diag::note_next_ivar_declaration)
3903 << ivar->getNextIvar()->getSynthesize();
3904 ivar->setInvalidDecl();
3912 (Ivars.begin() == Ivars.end()) ?
nullptr : *Ivars.begin();
3915 while (SuperClass && SuperClass->
ivar_empty())
3919 std::advance(IvarIter, SuperClass->
ivar_size() - 1);
3923 diag::warn_superclass_variable_sized_type_not_at_end)
3938 const llvm::iterator_range<ObjCProtocolList::iterator> &Protocols) {
3939 for (
auto *PI : Protocols)
3950 for (
auto *MD : PDecl->
methods()) {
3951 if (!MD->isPropertyAccessor()) {
3952 if (
const auto *CMD =
3953 IDecl->getMethod(MD->getSelector(), MD->isInstanceMethod())) {
3954 if (CMD->isDirectMethod())
3955 DirectMembers.push_back(CMD);
3960 if (
const auto *CPD = IDecl->FindPropertyVisibleInPrimaryClass(
3961 PD->getIdentifier(),
3962 PD->isClassProperty()
3965 if (CPD->isDirectProperty())
3966 DirectMembers.push_back(CPD);
3969 if (!DirectMembers.empty()) {
3970 S.
Diag(CDecl->
getLocation(), diag::err_objc_direct_protocol_conformance)
3972 for (
const auto *MD : DirectMembers)
3973 S.
Diag(MD->getLocation(), diag::note_direct_member_here);
3990 assert(AtEnd.
isValid() &&
"Invalid location for '@end'");
3993 Decl *ClassDecl = OCD;
3995 bool isInterfaceDeclKind =
3996 isa<ObjCInterfaceDecl>(ClassDecl) || isa<ObjCCategoryDecl>(ClassDecl)
3997 || isa<ObjCProtocolDecl>(ClassDecl);
3998 bool checkIdenticalMethods = isa<ObjCImplementationDecl>(ClassDecl);
4005 for (
auto *PropImpl : OID->property_impls()) {
4006 if (
auto *Getter = PropImpl->getGetterMethodDecl())
4007 if (Getter->isSynthesizedAccessorStub())
4008 OID->addDecl(Getter);
4009 if (
auto *Setter = PropImpl->getSetterMethodDecl())
4010 if (Setter->isSynthesizedAccessorStub())
4011 OID->addDecl(Setter);
4016 llvm::DenseMap<Selector, const ObjCMethodDecl*> InsMap;
4017 llvm::DenseMap<Selector, const ObjCMethodDecl*> ClsMap;
4019 for (
unsigned i = 0, e = allMethods.size(); i != e; i++ ) {
4021 cast_or_null<ObjCMethodDecl>(allMethods[i]);
4023 if (!Method)
continue;
4029 if ((isInterfaceDeclKind && PrevMethod && !
match)
4030 || (checkIdenticalMethods &&
match)) {
4053 if ((isInterfaceDeclKind && PrevMethod && !
match)
4054 || (checkIdenticalMethods &&
match)) {
4073 if (isa<ObjCInterfaceDecl>(ClassDecl)) {
4080 if (
C->IsClassExtension()) {
4089 if (CDecl->getIdentifier())
4093 for (
auto *I : CDecl->properties())
4095 CDecl->setAtEndRange(AtEnd);
4098 IC->setAtEndRange(AtEnd);
4105 for (
const auto *Ext : IDecl->visible_extensions()) {
4106 for (
const auto *
Property : Ext->instance_properties()) {
4109 = IC->FindPropertyImplDecl(
Property->getIdentifier(),
4111 if (PIDecl->getPropertyImplementation()
4115 for (
const auto *Ext : IDecl->visible_extensions()) {
4117 Ext->getInstanceMethod(
Property->getGetterName()))
4118 GetterMethod->setPropertyAccessor(
true);
4121 = Ext->getInstanceMethod(
Property->getSetterName()))
4122 SetterMethod->setPropertyAccessor(
true);
4130 if (IDecl->hasDesignatedInitializers())
4135 bool HasRootClassAttr = IDecl->hasAttr<ObjCRootClassAttr>();
4136 if (IDecl->getSuperClass() ==
nullptr) {
4139 if (!HasRootClassAttr) {
4142 Diag(DeclLoc, diag::warn_objc_root_class_missing)
4143 << IDecl->getIdentifier();
4151 Diag(SuperClassLoc, diag::note_objc_needs_superclass)
4154 Diag(SuperClassLoc, diag::note_objc_needs_superclass);
4157 }
else if (HasRootClassAttr) {
4159 Diag(IDecl->getLocation(), diag::err_objc_root_class_subclass);
4167 if (IDecl->hasAttr<ObjCSubclassingRestrictedAttr>() &&
4168 Super->hasAttr<ObjCSubclassingRestrictedAttr>()) {
4169 Diag(IC->getLocation(), diag::err_restricted_superclass_mismatch);
4170 Diag(Super->getLocation(), diag::note_class_declared);
4174 if (IDecl->hasAttr<ObjCClassStubAttr>())
4175 Diag(IC->getLocation(), diag::err_implementation_of_class_stub);
4178 while (IDecl->getSuperClass()) {
4180 IDecl = IDecl->getSuperClass();
4186 dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) {
4187 CatImplClass->setAtEndRange(AtEnd);
4193 = IDecl->FindCategoryDeclaration(CatImplClass->getIdentifier())) {
4197 }
else if (
const auto *IntfDecl = dyn_cast<ObjCInterfaceDecl>(ClassDecl)) {
4199 if (!IntfDecl->hasAttr<ObjCSubclassingRestrictedAttr>() &&
4200 Super->hasAttr<ObjCSubclassingRestrictedAttr>()) {
4201 Diag(IntfDecl->getLocation(), diag::err_restricted_superclass_mismatch);
4202 Diag(Super->getLocation(), diag::note_class_declared);
4206 if (IntfDecl->hasAttr<ObjCClassStubAttr>() &&
4207 !IntfDecl->hasAttr<ObjCSubclassingRestrictedAttr>())
4208 Diag(IntfDecl->getLocation(), diag::err_class_stub_subclassing_mismatch);
4211 if (isInterfaceDeclKind) {
4213 for (
unsigned i = 0, e = allTUVars.size(); i != e; i++) {
4216 if (
VarDecl *VDecl = dyn_cast<VarDecl>(*I)) {
4217 if (!VDecl->hasExternalStorage())
4218 Diag(VDecl->getLocation(), diag::err_objc_var_decl_inclass);
4224 for (
unsigned i = 0, e = allTUVars.size(); i != e; i++) {
4227 (*I)->setTopLevelDeclInObjCContainer();
4256 if (ResultObjectType->isObjCIdType() ||
4257 ResultObjectType->isObjCQualifiedIdType())
4262 = ResultObjectType->getInterfaceDecl()) {
4268 if (ResultClass->isSuperClassOf(CurrentClass))
4284class OverrideSearch {
4317 dyn_cast<ObjCCategoryDecl>(container)) {
4318 searchFromContainer(container);
4322 searchFromContainer(container);
4326 typedef decltype(Overridden)::iterator iterator;
4327 iterator begin()
const {
return Overridden.begin(); }
4328 iterator end()
const {
return Overridden.end(); }
4335#define OBJCCONTAINER(type, base) \
4337 searchFrom(cast<type##Decl>(container)); \
4339#define ABSTRACT_DECL(expansion)
4340#define DECL(type, base) \
4342#include "clang/AST/DeclNodes.inc"
4343 llvm_unreachable(
"not an ObjC container!");
4403 for (
const auto *Proto : protocols)
4415 Overridden.insert(meth);
4425 searchFromContainer(container);
4433 const auto *
attr = overridden->
getAttr<ObjCDirectAttr>();
4435 Diag(
attr->getLocation(), diag::note_previous_declaration);
4437 const auto *
attr = method->
getAttr<ObjCDirectAttr>();
4438 Diag(
attr->getLocation(), diag::err_objc_direct_on_override)
4450 auto IsMethodInCurrentClass = [CurrentClass](
const ObjCMethodDecl *M) {
4452 return M->getClassInterface()->getCanonicalDecl() ==
4456 OverrideSearch overrides(
SemaRef, ObjCMethod);
4462 bool hasOverriddenMethodsInBaseOrProtocol =
false;
4464 if (!hasOverriddenMethodsInBaseOrProtocol) {
4465 if (isa<ObjCProtocolDecl>(overridden->getDeclContext()) ||
4466 !IsMethodInCurrentClass(overridden) || overridden->isOverriding()) {
4468 hasOverriddenMethodsInBaseOrProtocol =
true;
4482 unsigned CategCount = List.getBits();
4483 if (CategCount > 0) {
4486 if (CategCount > 1 ||
4487 !isa<ObjCCategoryImplDecl>(overridden->getDeclContext())) {
4488 OverrideSearch overrides(
SemaRef, overridden);
4490 if (isa<ObjCProtocolDecl>(SuperOverridden->getDeclContext()) ||
4491 !IsMethodInCurrentClass(SuperOverridden)) {
4493 hasOverriddenMethodsInBaseOrProtocol =
true;
4494 overridden->setOverriding(
true);
4511 if (ObjCMethod->
isImplicit() && overridden->isImplicit())
4518 isa<ObjCProtocolDecl>(overridden->getDeclContext()));
4520 if (CurrentClass && overridden->
getDeclContext() != CurrentClass &&
4521 isa<ObjCInterfaceDecl>(overridden->getDeclContext()) &&
4526 PrevE = overridden->param_end();
4527 for (; ParamI !=
E && PrevI != PrevE; ++ParamI, ++PrevI) {
4528 assert(PrevI != overridden->param_end() &&
"Param mismatch");
4534 Diag((*ParamI)->getLocation(), diag::ext_typecheck_base_super)
4536 Diag(overridden->getLocation(), diag::note_previous_declaration);
4543 ObjCMethod->
setOverriding(hasOverriddenMethodsInBaseOrProtocol);
4553 bool prevUsesCSKeyword) {
4555 auto nullability =
type->getNullability();
4559 if (nullability.has_value() == prevNullability.has_value()) {
4565 if (*nullability == *prevNullability)
4569 S.
Diag(loc, diag::err_nullability_conflicting)
4592 if (prevMethod->
hasAttr<ObjCRequiresSuperAttr>() &&
4593 !method->
hasAttr<ObjCRequiresSuperAttr>()) {
4596 ObjCRequiresSuperAttr::CreateImplicit(S.
Context,
4613 unsigned numPrevParams = prevMethod->
param_size();
4614 for (
unsigned i = 0, n = std::min(numParams, numPrevParams); i != n; ++i) {
4634 llvm::Triple::x86 &&
4635 "x86-specific check invoked for a different target");
4639 if (
P->getType()->isVectorType()) {
4640 Loc =
P->getBeginLoc();
4656 VersionTuple AcceptedInVersion;
4657 if (Triple.getOS() == llvm::Triple::IOS)
4658 AcceptedInVersion = VersionTuple(9);
4659 else if (Triple.isMacOSX())
4660 AcceptedInVersion = VersionTuple(10, 11);
4666 SemaRef.
Diag(
Loc, diag::err_objc_method_unsupported_param_ret_type)
4669 << (Triple.isMacOSX() ?
"macOS 10.11" :
"iOS 9");
4674 CD->
hasAttr<ObjCDirectMembersAttr>()) {
4685 bool diagnosed =
false;
4688 if (diagnosed || IMD->isImplicit())
4694 S.
Diag(IMD->getLocation(), diag::note_previous_declaration);
4712 if (
auto *IMD = IDecl->
getMethod(Sel, isInstance))
4715 if (Impl != ImpDecl)
4720 if (
auto *IMD = Cat->getMethod(Sel, isInstance))
4722 else if (
auto CatImpl = Cat->getImplementation())
4723 if (CatImpl != ImpDecl)
4724 if (
auto *IMD = Cat->getMethod(Sel, isInstance))
4737 bool isVariadic,
bool MethodDefinition) {
4741 Diag(MethodLoc, diag::err_missing_method_context);
4748 bool HasRelatedResultType =
false;
4756 QualType bareResultType = resultDeclType;
4761 Diag(MethodLoc, diag::warn_missing_method_return_type)
4766 Context, MethodLoc, EndLoc, Sel, resultDeclType, ReturnTInfo,
4770 MethodDeclKind == tok::objc_optional
4773 HasRelatedResultType);
4777 for (
unsigned i = 0, e = Sel.
getNumArgs(); i != e; ++i) {
4781 if (!ArgInfo[i].
Type) {
4794 if (S->isDeclScope(PrevDecl)) {
4795 Diag(ArgInfo[i].NameLoc,
4796 (MethodDefinition ? diag::warn_method_param_redefinition
4797 : diag::warn_method_param_declaration))
4800 diag::note_previous_declaration);
4810 ArgInfo[i].Name, ArgType, DI,
SC_None);
4823 if (Param->
hasAttr<BlocksAttr>()) {
4830 Params.push_back(Param);
4833 for (
unsigned i = 0, e = CNumArgs; i != e; ++i) {
4834 ParmVarDecl *Param = cast<ParmVarDecl>(CParamInfo[i].Param);
4843 Params.push_back(Param);
4856 if (
ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(ClassDecl)) {
4857 if (MethodType == tok::minus) {
4858 PrevMethod = ImpDecl->getInstanceMethod(Sel);
4859 ImpDecl->addInstanceMethod(ObjCMethod);
4861 PrevMethod = ImpDecl->getClassMethod(Sel);
4862 ImpDecl->addClassMethod(ObjCMethod);
4871 if (
auto *Setter = PropertyImpl->getSetterMethodDecl())
4872 if (Setter->getSelector() == Sel &&
4874 assert(Setter->isSynthesizedAccessorStub() &&
"autosynth stub expected");
4875 PropertyImpl->setSetterMethodDecl(ObjCMethod);
4877 if (
auto *Getter = PropertyImpl->getGetterMethodDecl())
4878 if (Getter->getSelector() == Sel &&
4880 assert(Getter->isSynthesizedAccessorStub() &&
"autosynth stub expected");
4881 PropertyImpl->setGetterMethodDecl(ObjCMethod);
4895 const auto *
attr = CanonicalMD->
getAttr<ObjCDirectAttr>();
4897 ObjCDirectAttr::CreateImplicit(Context,
attr->getLocation()));
4904 if (
auto *IMD = IDecl->lookupMethod(ObjCMethod->
getSelector(),
4924 if (IDecl == IMD->getClassInterface()) {
4925 auto diagContainerMismatch = [&] {
4926 int decl = 0, impl = 0;
4928 if (
auto *Cat = dyn_cast<ObjCCategoryDecl>(IMD->getDeclContext()))
4929 decl = Cat->IsClassExtension() ? 1 : 2;
4931 if (isa<ObjCCategoryImplDecl>(ImpDecl))
4932 impl = 1 + (
decl != 0);
4935 diag::err_objc_direct_impl_decl_mismatch)
4937 Diag(IMD->getLocation(), diag::note_previous_declaration);
4941 const auto *
attr = ObjCMethod->
getAttr<ObjCDirectAttr>();
4943 diagContainerMismatch();
4944 }
else if (!IMD->isDirectMethod()) {
4945 Diag(
attr->getLocation(), diag::err_objc_direct_missing_on_decl);
4946 Diag(IMD->getLocation(), diag::note_previous_declaration);
4948 }
else if (IMD->isDirectMethod()) {
4949 const auto *
attr = IMD->getAttr<ObjCDirectAttr>();
4951 diagContainerMismatch();
4954 ObjCDirectAttr::CreateImplicit(Context,
attr->getLocation()));
4960 if (isa<ObjCCategoryImplDecl>(ImpDecl) && IMD->isOverriding() &&
4973 for (
auto *
C : IDecl->visible_categories())
4974 for (
auto &
P :
C->protocols())
4975 if (
auto *IMD =
P->lookupMethod(ObjCMethod->
getSelector(),
4978 IMD->parameters().size() &&
4979 "Methods have different number of parameters");
4980 auto OI = IMD->param_begin(), OE = IMD->param_end();
4982 for (; OI != OE; ++OI, ++NI)
4987 if (!isa<ObjCProtocolDecl>(ClassDecl)) {
4992 IDecl = cast<ObjCCategoryDecl>(ClassDecl)->getClassInterface();
5000 cast<DeclContext>(ClassDecl)->addDecl(ObjCMethod);
5016 if (!CurrentClass) {
5018 CurrentClass = Cat->getClassInterface();
5019 else if (
ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(ClassDecl))
5020 CurrentClass = Impl->getClassInterface();
5022 = dyn_cast<ObjCCategoryImplDecl>(ClassDecl))
5023 CurrentClass = CatImpl->getClassInterface();
5031 bool ARCError =
false;
5039 bool InferRelatedResultType =
false;
5065 if (InferRelatedResultType &&
5070 if (MethodDefinition &&
5076 if (
const auto *
attr = ObjCMethod->
getAttr<AvailabilityAttr>()) {
5079 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
5081 ObjCMethod->
dropAttr<AvailabilityAttr>();
5101 if (isa<TranslationUnitDecl>(
5105 Diag(
D->
getLocation(), diag::err_objc_decls_may_only_appear_in_global_scope);
5120 Diag(DeclStart, diag::err_undef_interface) << ClassName;
5124 Diag(DeclStart, diag::err_atdef_nonfragile_interface);
5132 for (
unsigned i = 0; i < Ivars.size(); i++) {
5138 ID->getIdentifier(), ID->getType(),
5140 Decls.push_back(FD);
5145 D != Decls.end(); ++
D) {
5166 Diag(IdLoc, diag::err_arg_with_address_space);
5178 Diag(IdLoc, diag::err_illegal_qualifiers_on_catch_parm);
5183 Diag(IdLoc, diag::err_catch_param_not_objc_type);
5186 Diag(IdLoc, diag::err_catch_param_not_objc_type);
5217 if (
DeclSpec::TSCS TSCS =
D.getDeclSpec().getThreadStorageClassSpec())
5218 Diag(
D.getDeclSpec().getThreadStorageClassSpecLoc(),
5219 diag::err_invalid_thread)
5221 D.getMutableDeclSpec().ClearStorageClassSpecs();
5235 D.getIdentifierLoc(),
5240 if (
D.getCXXScopeSpec().isSet()) {
5241 Diag(
D.getIdentifierLoc(), diag::err_qualified_objc_catch_parm)
5242 <<
D.getCXXScopeSpec().getRange();
5248 if (
D.getIdentifier())
5253 if (New->
hasAttr<BlocksAttr>())
5267 Ivars.push_back(Iv);
5277 for (
unsigned I = 0, N = Sels.size(); I != N; ++I)
5288 Selector Sel = SelectorAndLocation.first;
5291 Diag(
Loc, diag::warn_unimplemented_selector) << Sel;
5314 IV->getIdentifier());
5323class UnusedBackingIvarChecker
5330 bool InvokedSelfMethod;
5334 : S(S), Method(Method), IvarD(IvarD), AccessedIvar(
false),
5335 InvokedSelfMethod(
false) {
5340 if (
E->getDecl() == IvarD) {
5341 AccessedIvar =
true;
5350 InvokedSelfMethod =
true;
5359 if (S->hasUnrecoverableErrorOccurred())
5363 unsigned DIAG = diag::warn_unused_property_backing_ivar;
5373 if (CurMethod->isSynthesizedAccessorStub())
5376 UnusedBackingIvarChecker Checker(
SemaRef, CurMethod, IV);
5377 Checker.TraverseStmt(CurMethod->getBody());
5378 if (Checker.AccessedIvar)
5385 if (!IV->
isReferenced() || !Checker.InvokedSelfMethod) {
5406 if (!
T.isConstQualified()) {
5410 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
5412 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
5426 bool DoTypoCorrection) {
5432 if (!IDecl && DoTypoCorrection) {
5457 unsigned kind = -1U;
5459 if (var->hasAttr<BlocksAttr>())
5461 else if (!var->hasLocalStorage())
5463 }
else if (isa<ObjCIvarDecl>(
decl)) {
5465 }
else if (isa<FieldDecl>(
decl)) {
5470 Diag(
decl->getLocation(), diag::err_arc_autoreleasing_var) << kind;
5474 if (!
type->isObjCLifetimeType())
5477 lifetime =
type->getObjCARCImplicitLifetime();
5485 var->getTLSKind()) {
5486 Diag(var->getLocation(), diag::err_arc_thread_ownership)
5509 for (
unsigned i = 0; i < ivars.size(); i++) {
5511 if (Field->isInvalidDecl())
5532 AllToInit.push_back(
Member);
5537 ->getAs<RecordType>()) {
5538 CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
5543 PDiag(diag::err_access_dtor_ivar)
5557 switch (ivarVisibility) {
5559 llvm_unreachable(
"Unknown visitibility kind");
5560 case tok::objc_private:
5562 case tok::objc_public:
5564 case tok::objc_protected:
5566 case tok::objc_package:
5579 Loc =
D.getIdentifierLoc();
5600 Diag(
Loc, diag::err_ivar_reference_type);
5607 TInfo,
T,
Loc, diag::err_typecheck_ivar_variable_size))
5622 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
5626 EnclosingContext = IMPDecl->getClassInterface();
5627 assert(EnclosingContext &&
"Implementation has no class interface!");
5629 EnclosingContext = EnclosingDecl;
5633 Diag(
Loc, diag::err_misplaced_ivar) << CDecl->IsClassExtension();
5637 EnclosingContext = EnclosingDecl;
5643 II,
T, TInfo, ac, BitWidth);
5651 RedeclarationKind::ForVisibleRedeclaration);
5653 !isa<TagDecl>(PrevDecl)) {
5654 Diag(
Loc, diag::err_duplicate_member) << II;
5663 if (
D.isInvalidType())
5670 if (
D.getDeclSpec().isModulePrivateSpecified())
5681 isa<ObjCInterfaceDecl>(EnclosingDecl))
5682 Diag(
Loc, diag::warn_ivars_in_interface);
Defines the clang::ASTContext interface.
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
#define DIAG(ENUM, FLAGS, DEFAULT_MAPPING, DESC, GROUP, SFINAE, NOWERROR, SHOWINSYSHEADER, SHOWINSYSMACRO, DEFERRABLE, CATEGORY)
static QualType getObjectType(APValue::LValueBase B)
Retrieves the "underlying object type" of the given expression, as used by __builtin_object_size.
llvm::MachO::Record Record
static bool IsVariableSizedType(QualType T)
static void DiagnoseVariableSizedIvars(Sema &S, ObjCContainerDecl *OCD)
static bool HasExplicitOwnershipAttr(Sema &S, ParmVarDecl *Param)
HasExplicitOwnershipAttr - returns true when pointer to ObjC pointer has explicit ownership attribute...
static void checkObjCDirectMethodClashes(Sema &S, ObjCInterfaceDecl *IDecl, ObjCMethodDecl *Method, ObjCImplDecl *ImpDecl=nullptr)
static bool CheckMethodOverrideParam(Sema &S, ObjCMethodDecl *MethodImpl, ObjCMethodDecl *MethodDecl, ParmVarDecl *ImplVar, ParmVarDecl *IfaceVar, bool IsProtocolMethodDecl, bool IsOverridingMode, bool Warn)
static SourceRange getTypeRange(TypeSourceInfo *TSI)
std::unique_ptr< ProtocolNameSet > LazyProtocolNameSet
static bool CheckMethodOverrideReturn(Sema &S, ObjCMethodDecl *MethodImpl, ObjCMethodDecl *MethodDecl, bool IsProtocolMethodDecl, bool IsOverridingMode, bool Warn)
static void DiagnoseCategoryDirectMembersProtocolConformance(Sema &S, ObjCProtocolDecl *PDecl, ObjCCategoryDecl *CDecl)
static bool checkTypeParamListConsistency(Sema &S, ObjCTypeParamList *prevTypeParams, ObjCTypeParamList *newTypeParams, TypeParamListContext newContext)
Check consistency between two Objective-C type parameter lists, e.g., between a category/extension an...
static void HelperSelectorsForTypoCorrection(SmallVectorImpl< const ObjCMethodDecl * > &BestMethod, StringRef Typo, const ObjCMethodDecl *Method)
static bool objcModifiersConflict(Decl::ObjCDeclQualifier x, Decl::ObjCDeclQualifier y)
Determine whether two set of Objective-C declaration qualifiers conflict.
static bool shouldWarnUndefinedMethod(const ObjCMethodDecl *M)
static bool FilterMethodsByTypeBound(ObjCMethodDecl *Method, const ObjCObjectType *TypeBound)
Return true if the given method is wthin the type bound.
static void DiagnoseObjCImplementedDeprecations(Sema &S, const NamedDecl *ND, SourceLocation ImplLoc)
static void findProtocolsWithExplicitImpls(const ObjCProtocolDecl *PDecl, ProtocolNameSet &PNS)
static bool matchTypes(ASTContext &Context, SemaObjC::MethodMatchStrategy strategy, QualType leftQT, QualType rightQT)
static void DiagnoseRetainableFlexibleArrayMember(Sema &S, ObjCInterfaceDecl *ID)
Diagnose attempts to use flexible array member with retainable object type.
static void mergeInterfaceMethodToImpl(Sema &S, ObjCMethodDecl *method, ObjCMethodDecl *prevMethod)
Merge information from the declaration of a method in the @interface (or a category/extension) into t...
static bool HelperIsMethodInObjCType(Sema &S, Selector Sel, QualType ObjectType)
static SemaObjC::ResultTypeCompatibilityKind CheckRelatedResultTypeCompatibility(Sema &S, ObjCMethodDecl *Method, ObjCInterfaceDecl *CurrentClass)
Check whether the declared result type of the given Objective-C method declaration is compatible with...
static ObjCIvarDecl::AccessControl TranslateIvarVisibility(tok::ObjCKeywordKind ivarVisibility)
TranslateIvarVisibility - Translate visibility from a token ID to an AST enum value.
static void CheckProtocolMethodDefs(Sema &S, ObjCImplDecl *Impl, ObjCProtocolDecl *PDecl, bool &IncompleteImpl, const SemaObjC::SelectorSet &InsMap, const SemaObjC::SelectorSet &ClsMap, ObjCContainerDecl *CDecl, LazyProtocolNameSet &ProtocolsExplictImpl)
CheckProtocolMethodDefs - This routine checks unimplemented methods Declared in protocol,...
static void WarnUndefinedMethod(Sema &S, ObjCImplDecl *Impl, ObjCMethodDecl *method, bool &IncompleteImpl, unsigned DiagID, NamedDecl *NeededFor=nullptr)
static bool NestedProtocolHasNoDefinition(ObjCProtocolDecl *PDecl, ObjCProtocolDecl *&UndefinedProtocol)
static bool isObjCTypeSubstitutable(ASTContext &Context, const ObjCObjectPointerType *A, const ObjCObjectPointerType *B, bool rejectId)
Determines if type B can be substituted for type A.
llvm::DenseSet< IdentifierInfo * > ProtocolNameSet
FIXME: Type hierarchies in Objective-C can be deep.
static QualType mergeTypeNullabilityForRedecl(Sema &S, SourceLocation loc, QualType type, bool usesCSKeyword, SourceLocation prevLoc, QualType prevType, bool prevUsesCSKeyword)
Merge type nullability from for a redeclaration of the same entity, producing the updated type of the...
static bool diagnoseNoescape(const ParmVarDecl *NewD, const ParmVarDecl *OldD, Sema &S)
Issue a warning if the parameter of the overridden method is non-escaping but the parameter of the ov...
static bool isAcceptableMethodMismatch(ObjCMethodDecl *chosen, ObjCMethodDecl *other)
Determines if this is an "acceptable" loose mismatch in the global method pool.
static void mergeObjCDirectMembers(Sema &S, Decl *CD, ObjCMethodDecl *Method)
static void DiagnoseWeakIvars(Sema &S, ObjCImplementationDecl *ID)
Diagnose attempts to define ARC-__weak ivars when __weak is disabled.
static void checkObjCMethodX86VectorTypes(Sema &SemaRef, const ObjCMethodDecl *Method)
Verify that the method parameters/return value have types that are supported by the x86 target.
static bool checkMethodFamilyMismatch(Sema &S, ObjCMethodDecl *impl, ObjCMethodDecl *decl)
In ARC, check whether the conventional meanings of the two methods match.
static bool isMethodContextSameForKindofLookup(ObjCMethodDecl *Method, ObjCMethodDecl *MethodInList)
static bool tryMatchRecordTypes(ASTContext &Context, SemaObjC::MethodMatchStrategy strategy, const Type *left, const Type *right)
static Decl::ObjCDeclQualifier CvtQTToAstBitMask(ObjCDeclSpec::ObjCDeclQualifier PQTVal)
CvtQTToAstBitMask - utility routine to produce an AST bitmask for objective-c's type qualifier from t...
static void diagnoseUseOfProtocols(Sema &TheSema, ObjCContainerDecl *CD, ObjCProtocolDecl *const *ProtoRefs, unsigned NumProtoRefs, const SourceLocation *ProtoLocs)
This file declares semantic analysis for Objective-C.
Defines the SourceManager interface.
__DEVICE__ long long abs(long long __n)
virtual void HandleTopLevelDeclInObjCContainer(DeclGroupRef D)
Handle the specified top-level declaration that occurred inside and ObjC container.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType) const
bool AnyObjCImplementation()
Return true if there is at least one @implementation in the TU.
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig, ObjCTypeParamDecl *New) const
bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS, bool ForCompare)
ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an ObjCQualifiedIDType.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
const LangOptions & getLangOpts() const
SelectorTable & Selectors
QualType getObjCInstanceType()
Retrieve the Objective-C "instancetype" type, if already known; otherwise, returns a NULL type;.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl< const ObjCIvarDecl * > &Ivars) const
DeepCollectObjCIvars - This routine first collects all declared, but not synthesized,...
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
const clang::PrintingPolicy & getPrintingPolicy() const
QualType getObjCIdType() const
Represents the Objective-CC id type.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getAdjustedParameterType(QualType T) const
Perform adjustment on the parameter type of a function.
const TargetInfo & getTargetInfo() const
QualType getLifetimeQualifiedType(QualType type, Qualifiers::ObjCLifetime lifetime)
Return a type with the given lifetime qualifier.
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
bool hasSameNullabilityTypeQualifier(QualType SubT, QualType SuperT, bool IsParam) const
void CollectInheritedProtocols(const Decl *CDecl, llvm::SmallPtrSet< ObjCProtocolDecl *, 8 > &Protocols)
CollectInheritedProtocols - Collect all protocols in current class and those inherited by it.
The result of parsing/analyzing an expression, statement etc.
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
Type source information for an attributed type.
static Kind getNullabilityAttrKind(NullabilityKind kind)
Retrieve the attribute kind corresponding to the given nullability kind.
static std::optional< NullabilityKind > stripOuterNullability(QualType &T)
Strip off the top-level nullability annotation on the given type, if it's there.
Represents a C++ base or member initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
bool isObjCContainer() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
Decl::Kind getDeclKind() const
Simple template class for restricting typo correction candidates to ones having a single Decl* of the...
Captures information about "declaration specifiers".
static const TST TST_typename
SourceLocation getStorageClassSpecLoc() const
SCS getStorageClassSpec() const
bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
void SetRangeEnd(SourceLocation Loc)
void SetRangeStart(SourceLocation Loc)
SCS
storage-class-specifier
bool isInlineSpecified() const
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
SourceLocation getInlineSpecLoc() const
Decl - This represents one declaration (or definition), e.g.
SourceLocation getEndLoc() const LLVM_READONLY
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isUnavailable(std::string *Message=nullptr) const
Determine whether this declaration is marked 'unavailable'.
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple(), StringRef *RealizedPlatform=nullptr) const
Determine the availability of the given declaration.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
void setTopLevelDeclInObjCContainer(bool V=true)
bool isReferenced() const
Whether any declaration of this entity was referenced.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
@ OBJC_TQ_CSNullability
The nullability qualifier is set when the nullability of the result or parameter was expressed via a ...
bool isInvalidDecl() const
SourceLocation getLocation() const
bool isDeprecated(std::string *Message=nullptr) const
Determine whether this declaration is marked 'deprecated'.
void setImplicit(bool I=true)
DeclContext * getDeclContext()
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
void setLexicalDeclContext(DeclContext *DC)
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
This represents one expression.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getBitWidthValue(const ASTContext &Ctx) const
Computes the bit width of this field, if this is a bit field.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
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.
One of these records is kept for each identifier that is lexed.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
void AddDecl(NamedDecl *D)
AddDecl - Link the decl to its shadowed decl chain.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
Describes the sequence of initializations required to initialize a given object or reference with a s...
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
Describes an entity that is being initialized.
static InitializedEntity InitializeMember(FieldDecl *Member, const InitializedEntity *Parent=nullptr, bool Implicit=false)
Create the initialization entity for a member subobject.
clang::ObjCRuntime ObjCRuntime
Represents the results of name lookup.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
static ObjCAtDefsFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, QualType T, Expr *BW)
ObjCCategoryDecl - Represents a category declaration.
static ObjCCategoryDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation AtLoc, SourceLocation ClassNameLoc, SourceLocation CategoryNameLoc, const IdentifierInfo *Id, ObjCInterfaceDecl *IDecl, ObjCTypeParamList *typeParamList, SourceLocation IvarLBraceLoc=SourceLocation(), SourceLocation IvarRBraceLoc=SourceLocation())
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
ObjCCategoryImplDecl * getImplementation() const
ObjCInterfaceDecl * getClassInterface()
bool IsClassExtension() const
const ObjCProtocolList & getReferencedProtocols() const
void setImplementation(ObjCCategoryImplDecl *ImplD)
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCCategoryDecl * getCategoryDecl() const
static ObjCCategoryImplDecl * Create(ASTContext &C, DeclContext *DC, const IdentifierInfo *Id, ObjCInterfaceDecl *classInterface, SourceLocation nameLoc, SourceLocation atStartLoc, SourceLocation CategoryNameLoc)
ObjCCompatibleAliasDecl - Represents alias of a class.
static ObjCCompatibleAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, ObjCInterfaceDecl *aliasedClass)
ObjCContainerDecl - Represents a container for method declarations.
ObjCMethodDecl * getMethod(Selector Sel, bool isInstance, bool AllowHidden=false) const
method_range methods() const
SourceRange getAtEndRange() const
instmeth_range instance_methods() const
ObjCIvarDecl * getIvarDecl(IdentifierInfo *Id) const
getIvarDecl - This method looks up an ivar in this ContextDecl.
void setAtEndRange(SourceRange atEnd)
ObjCMethodDecl * getClassMethod(Selector Sel, bool AllowHidden=false) const
prop_range properties() const
classmeth_range class_methods() const
ObjCMethodDecl * getInstanceMethod(Selector Sel, bool AllowHidden=false) const
Captures information about "declaration specifiers" specific to Objective-C.
ObjCDeclQualifier
ObjCDeclQualifier - Qualifier used on types in method declarations.
ObjCDeclQualifier getObjCDeclQualifier() const
propimpl_range property_impls() const
const ObjCInterfaceDecl * getClassInterface() const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
static ObjCImplementationDecl * Create(ASTContext &C, DeclContext *DC, ObjCInterfaceDecl *classInterface, ObjCInterfaceDecl *superDecl, SourceLocation nameLoc, SourceLocation atStartLoc, SourceLocation superLoc=SourceLocation(), SourceLocation IvarLBraceLoc=SourceLocation(), SourceLocation IvarRBraceLoc=SourceLocation())
void setIvarInitializers(ASTContext &C, CXXCtorInitializer **initializers, unsigned numInitializers)
const ObjCInterfaceDecl * getSuperClass() const
Represents an ObjC class declaration.
void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)
mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameters of this class.
ObjCInterfaceDecl * lookupInheritedClass(const IdentifierInfo *ICName)
lookupInheritedClass - This method returns ObjCInterfaceDecl * of the super class whose name is passe...
ivar_iterator ivar_end() const
llvm::iterator_range< specific_decl_iterator< ObjCIvarDecl > > ivar_range
static ObjCInterfaceDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation atLoc, const IdentifierInfo *Id, ObjCTypeParamList *typeParamList, ObjCInterfaceDecl *PrevDecl, SourceLocation ClassLoc=SourceLocation(), bool isInternal=false)
unsigned ivar_size() const
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
bool hasDefinition() const
Determine whether this class has been defined.
all_protocol_range all_referenced_protocols() const
visible_extensions_range visible_extensions() const
bool isImplicitInterfaceDecl() const
isImplicitInterfaceDecl - check that this is an implicitly declared ObjCInterfaceDecl node.
ObjCIvarDecl * all_declared_ivar_begin()
all_declared_ivar_begin - return first ivar declared in this class, its extensions and its implementa...
ObjCCategoryDecl * FindCategoryDeclaration(const IdentifierInfo *CategoryId) const
FindCategoryDeclaration - Finds category declaration in the list of categories for this class and ret...
ivar_iterator ivar_begin() const
void setImplementation(ObjCImplementationDecl *ImplD)
known_categories_range known_categories() const
void setSuperClass(TypeSourceInfo *superClass)
const ObjCProtocolList & getReferencedProtocols() const
ObjCMethodDecl * lookupMethod(Selector Sel, bool isInstance, bool shallowCategoryLookup=false, bool followSuper=true, const ObjCCategoryDecl *C=nullptr) const
lookupMethod - This method returns an instance/class method by looking in the class,...
ObjCImplementationDecl * getImplementation() const
void setEndOfDefinitionLoc(SourceLocation LE)
void startDefinition()
Starts the definition of this Objective-C class, taking it from a forward declaration (@class) to a d...
visible_categories_range visible_categories() const
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCInterfaceDecl * getSuperClass() const
ObjCInterfaceDecl * getDefinition()
Retrieve the definition of this class, or NULL if this class has been forward-declared (with @class) ...
void startDuplicateDefinitionForComparison()
Starts the definition without sharing it with other redeclarations.
bool isSuperClassOf(const ObjCInterfaceDecl *I) const
isSuperClassOf - Return true if this class is the specified class or is a super class of the specifie...
Interfaces are the core concept in Objective-C for object oriented design.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarDecl * getNextIvar()
static ObjCIvarDecl * Create(ASTContext &C, ObjCContainerDecl *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, AccessControl ac, Expr *BW=nullptr, bool synthesized=false)
ObjCIvarRefExpr - A reference to an ObjC instance variable.
ObjCList - This is a simple template class used to hold various lists of decls etc,...
void set(T *const *InList, unsigned Elts, ASTContext &Ctx)
An expression that sends a message to the given Objective-C object or class.
@ Instance
The receiver is an object instance.
ObjCMethodDecl - Represents an instance or class method declaration.
bool isDesignatedInitializerForTheInterface(const ObjCMethodDecl **InitMethod=nullptr) const
Returns true if the method selector resolves to a designated initializer in the class's interface.
ImplicitParamDecl * getSelfDecl() const
void setObjCDeclQualifier(ObjCDeclQualifier QV)
void setDefined(bool isDefined)
ObjCDeclQualifier getObjCDeclQualifier() const
ArrayRef< ParmVarDecl * > parameters() const
unsigned param_size() const
bool isPropertyAccessor() const
static ObjCMethodDecl * Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, TypeSourceInfo *ReturnTInfo, DeclContext *contextDecl, bool isInstance=true, bool isVariadic=false, bool isPropertyAccessor=false, bool isSynthesizedAccessorStub=false, bool isImplicitlyDeclared=false, bool isDefined=false, ObjCImplementationControl impControl=ObjCImplementationControl::None, bool HasRelatedResultType=false)
const ObjCPropertyDecl * findPropertyDecl(bool CheckOverrides=true) const
Returns the property associated with this method's selector.
param_const_iterator param_end() const
param_const_iterator param_begin() const
ObjCMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setAsRedeclaration(const ObjCMethodDecl *PrevMethod)
void setRelatedResultType(bool RRT=true)
Note whether this method has a related result type.
bool isSynthesizedAccessorStub() const
SourceLocation getSelectorLoc(unsigned Index) const
SourceRange getReturnTypeSourceRange() const
void setOverriding(bool IsOver)
const ParmVarDecl *const * param_const_iterator
bool hasRelatedResultType() const
Determine whether this method has a result type that is related to the message receiver's type.
SourceLocation getBeginLoc() const LLVM_READONLY
void setMethodParams(ASTContext &C, ArrayRef< ParmVarDecl * > Params, ArrayRef< SourceLocation > SelLocs=std::nullopt)
Sets the method's parameters and selector source locations.
bool isDirectMethod() const
True if the method is tagged as objc_direct.
Selector getSelector() const
ImplicitParamDecl * getCmdDecl() const
bool isInstanceMethod() const
void setReturnType(QualType T)
ObjCMethodFamily getMethodFamily() const
Determines the family of this method.
void createImplicitParams(ASTContext &Context, const ObjCInterfaceDecl *ID)
createImplicitParams - Used to lazily create the self and cmd implicit parameters.
QualType getReturnType() const
ParmVarDecl *const * param_iterator
ObjCImplementationControl getImplementationControl() const
bool isClassMethod() const
ObjCInterfaceDecl * getClassInterface()
Wraps an ObjCPointerType with source location information.
void setStarLoc(SourceLocation Loc)
Represents a pointer to an Objective C object.
bool isObjCQualifiedIdType() const
True if this is equivalent to 'id.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
Represents a class type in Objective C.
ObjCInterfaceDecl * getInterface() const
Gets the interface declaration for this object type, if the base type really is an interface.
Represents one property declaration in an Objective-C interface.
ObjCIvarDecl * getPropertyIvarDecl() const
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Represents an Objective-C protocol declaration.
void startDuplicateDefinitionForComparison()
Starts the definition without sharing it with other redeclarations.
bool hasDefinition() const
Determine whether this protocol has a definition.
bool isThisDeclarationADefinition() const
Determine whether this particular declaration is also the definition.
static ObjCProtocolDecl * Create(ASTContext &C, DeclContext *DC, IdentifierInfo *Id, SourceLocation nameLoc, SourceLocation atStartLoc, ObjCProtocolDecl *PrevDecl)
const ObjCProtocolList & getReferencedProtocols() const
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
ObjCProtocolDecl * getDefinition()
Retrieve the definition of this protocol, if any.
void startDefinition()
Starts the definition of this Objective-C protocol.
protocol_range protocols() const
A list of Objective-C protocols, along with the source locations at which they were referenced.
The basic abstraction for the target Objective-C runtime.
bool isNeXTFamily() const
Is this runtime basically of the NeXT family of runtimes?
bool isNonFragile() const
Does this runtime follow the set of implied behaviors for a "non-fragile" ABI?
bool isFragile() const
The inverse of isNonFragile(): does this runtime follow the set of implied behaviors for a "fragile" ...
Represents the declaration of an Objective-C type parameter.
static ObjCTypeParamDecl * Create(ASTContext &ctx, DeclContext *dc, ObjCTypeParamVariance variance, SourceLocation varianceLoc, unsigned index, SourceLocation nameLoc, IdentifierInfo *name, SourceLocation colonLoc, TypeSourceInfo *boundInfo)
bool hasExplicitBound() const
Whether this type parameter has an explicitly-written type bound, e.g., "T : NSView".
ObjCTypeParamVariance getVariance() const
Determine the variance of this type parameter.
void setVariance(ObjCTypeParamVariance variance)
Set the variance of this type parameter.
SourceLocation getVarianceLoc() const
Retrieve the location of the variance keyword.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
SourceRange getSourceRange() const
unsigned size() const
Determine the number of type parameters in this list.
ObjCTypeParamDecl * back() const
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
SourceLocation getLAngleLoc() const
Represents a parameter to a function.
void setObjCDeclQualifier(ObjCDeclQualifier QTVal)
ObjCDeclQualifier getObjCDeclQualifier() const
void setObjCMethodScopeInfo(unsigned parameterIndex)
static const ParsedAttributesView & none()
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
The collection of all-type qualifiers we support.
void removeCVRQualifiers(unsigned mask)
@ 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.
std::string getAsString() const
Represents a struct/union/class.
field_iterator field_end() const
field_iterator field_begin() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
Base for LValueReferenceType and RValueReferenceType.
Scope - A scope is a transient data structure that is used while parsing the program.
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Smart pointer class that efficiently represents Objective-C method names.
StringRef getNameForSlot(unsigned argIndex) const
Retrieve the name at a given position in the selector.
std::string getAsString() const
Derive the full selector name (e.g.
ObjCMethodFamily getMethodFamily() const
Derive the conventional family of this method.
bool isUnarySelector() const
unsigned getNumArgs() const
A generic diagnostic builder for errors which may or may not be deferred.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
std::pair< iterator, bool > insert(std::pair< Selector, Lists > &&Val)
iterator find(Selector Sel)
llvm::DenseMap< Selector, Lists >::iterator iterator
std::pair< ObjCMethodList, ObjCMethodList > Lists
Decl * ActOnIvar(Scope *S, SourceLocation DeclStart, Declarator &D, Expr *BitWidth, tok::ObjCKeywordKind visibility)
ActOnIvar - Each ivar field of an objective-c class is passed into this in order to create an IvarDec...
void ActOnStartOfObjCMethodDef(Scope *S, Decl *D)
ActOnStartOfObjCMethodDef - This routine sets up parameters; invisible and user declared,...
void ActOnSuperClassOfClassInterface(Scope *S, SourceLocation AtInterfaceLoc, ObjCInterfaceDecl *IDecl, IdentifierInfo *ClassName, SourceLocation ClassLoc, IdentifierInfo *SuperName, SourceLocation SuperLoc, ArrayRef< ParsedType > SuperTypeArgs, SourceRange SuperTypeArgsRange)
VarDecl * BuildObjCExceptionDecl(TypeSourceInfo *TInfo, QualType ExceptionType, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, bool Invalid=false)
Build a type-check a new Objective-C exception variable declaration.
void DiagnoseUnusedBackingIvarInAccessor(Scope *S, const ObjCImplementationDecl *ImplD)
DiagnoseUnusedBackingIvarInAccessor - Issue an 'unused' warning if ivar which backs the property is n...
void SetIvarInitializers(ObjCImplementationDecl *ObjCImplementation)
SetIvarInitializers - This routine builds initialization ASTs for the Objective-C implementation whos...
void WarnExactTypedMethods(ObjCMethodDecl *Method, ObjCMethodDecl *MethodDecl, bool IsProtocolMethodDecl)
WarnExactTypedMethods - This routine issues a warning if method implementation declaration matches ex...
const ObjCMethodDecl * SelectorsForTypoCorrection(Selector Sel, QualType ObjectType=QualType())
void ProcessPropertyDecl(ObjCPropertyDecl *property)
Process the specified property declaration and create decls for the setters and getters as needed.
TypeResult actOnObjCTypeArgsAndProtocolQualifiers(Scope *S, SourceLocation Loc, ParsedType BaseType, SourceLocation TypeArgsLAngleLoc, ArrayRef< ParsedType > TypeArgs, SourceLocation TypeArgsRAngleLoc, SourceLocation ProtocolLAngleLoc, ArrayRef< Decl * > Protocols, ArrayRef< SourceLocation > ProtocolLocs, SourceLocation ProtocolRAngleLoc)
Build a specialized and/or protocol-qualified Objective-C type.
void addMethodToGlobalList(ObjCMethodList *List, ObjCMethodDecl *Method)
Add the given method to the list of globally-known methods.
ObjCInterfaceDecl * ActOnStartClassInterface(Scope *S, SourceLocation AtInterfaceLoc, IdentifierInfo *ClassName, SourceLocation ClassLoc, ObjCTypeParamList *typeParamList, IdentifierInfo *SuperName, SourceLocation SuperLoc, ArrayRef< ParsedType > SuperTypeArgs, SourceRange SuperTypeArgsRange, Decl *const *ProtoRefs, unsigned NumProtoRefs, const SourceLocation *ProtoLocs, SourceLocation EndProtoLoc, const ParsedAttributesView &AttrList, SkipBodyInfo *SkipBody)
void diagnoseNullResettableSynthesizedSetters(const ObjCImplDecl *impDecl)
Diagnose any null-resettable synthesized setters.
void updateOutOfDateSelector(Selector Sel)
void popObjCTypeParamList(Scope *S, ObjCTypeParamList *typeParamList)
ObjCImplementationDecl * ActOnStartClassImplementation(SourceLocation AtClassImplLoc, const IdentifierInfo *ClassName, SourceLocation ClassLoc, const IdentifierInfo *SuperClassname, SourceLocation SuperClassLoc, const ParsedAttributesView &AttrList)
bool AreMultipleMethodsInGlobalPool(Selector Sel, ObjCMethodDecl *BestMethod, SourceRange R, bool receiverIdOrClass, SmallVectorImpl< ObjCMethodDecl * > &Methods)
Decl * ActOnObjCExceptionDecl(Scope *S, Declarator &D)
bool CheckObjCDeclScope(Decl *D)
Checks that the Objective-C declaration is declared in the global scope.
DeclResult actOnObjCTypeParam(Scope *S, ObjCTypeParamVariance variance, SourceLocation varianceLoc, unsigned index, IdentifierInfo *paramName, SourceLocation paramLoc, SourceLocation colonLoc, ParsedType typeBound)
ObjCIvarDecl * GetIvarBackingPropertyAccessor(const ObjCMethodDecl *Method, const ObjCPropertyDecl *&PDecl) const
GetIvarBackingPropertyAccessor - If method is a property setter/getter and it property has a backing ...
bool CheckARCMethodDecl(ObjCMethodDecl *method)
Check a method declaration for compatibility with the Objective-C ARC conventions.
ObjCContainerKind getObjCContainerKind() const
ObjCInterfaceDecl * getObjCInterfaceDecl(const IdentifierInfo *&Id, SourceLocation IdLoc, bool TypoCorrection=false)
Look for an Objective-C class in the translation unit.
ObjCMethodDecl * LookupMethodInObjectType(Selector Sel, QualType Ty, bool IsInstance)
LookupMethodInType - Look up a method in an ObjCObjectType.
DeclGroupPtrTy ActOnFinishObjCImplementation(Decl *ObjCImpDecl, ArrayRef< Decl * > Decls)
ObjCContainerDecl * getObjCDeclContext() const
void WarnConflictingTypedMethods(ObjCMethodDecl *Method, ObjCMethodDecl *MethodDecl, bool IsProtocolMethodDecl)
bool MatchTwoMethodDeclarations(const ObjCMethodDecl *Method, const ObjCMethodDecl *PrevMethod, MethodMatchStrategy strategy=MMS_strict)
MatchTwoMethodDeclarations - Checks if two methods' type match and returns true, or false,...
Decl * ActOnMethodDeclaration(Scope *S, SourceLocation BeginLoc, SourceLocation EndLoc, tok::TokenKind MethodType, ObjCDeclSpec &ReturnQT, ParsedType ReturnType, ArrayRef< SourceLocation > SelectorLocs, Selector Sel, ObjCArgInfo *ArgInfo, DeclaratorChunk::ParamInfo *CParamInfo, unsigned CNumArgs, const ParsedAttributesView &AttrList, tok::ObjCKeywordKind MethodImplKind, bool isVariadic, bool MethodDefinition)
void MatchAllMethodDeclarations(const SelectorSet &InsMap, const SelectorSet &ClsMap, SelectorSet &InsMapSeen, SelectorSet &ClsMapSeen, ObjCImplDecl *IMPDecl, ObjCContainerDecl *IDecl, bool &IncompleteImpl, bool ImmediateClass, bool WarnCategoryMethodImpl=false)
MatchAllMethodDeclarations - Check methods declaraed in interface or or protocol against those declar...
llvm::MapVector< Selector, SourceLocation > ReferencedSelectors
Method selectors used in a @selector expression.
void DiagnoseOwningPropertyGetterSynthesis(const ObjCImplementationDecl *D)
void ActOnObjCContainerFinishDefinition()
Decl * ActOnCompatibilityAlias(SourceLocation AtCompatibilityAliasLoc, IdentifierInfo *AliasName, SourceLocation AliasLocation, IdentifierInfo *ClassName, SourceLocation ClassLocation)
ActOnCompatibilityAlias - this action is called after complete parsing of a @compatibility_alias decl...
void DiagnoseDuplicateIvars(ObjCInterfaceDecl *ID, ObjCInterfaceDecl *SID)
DiagnoseDuplicateIvars - Check for duplicate ivars in the entire class at the start of @implementatio...
bool checkInitMethod(ObjCMethodDecl *method, QualType receiverTypeIfCall)
Check whether the given method, which must be in the 'init' family, is a valid member of that family.
void CheckConflictingOverridingMethod(ObjCMethodDecl *Method, ObjCMethodDecl *Overridden, bool IsProtocolMethodDecl)
ObjCTypeParamList * actOnObjCTypeParamList(Scope *S, SourceLocation lAngleLoc, ArrayRef< Decl * > typeParams, SourceLocation rAngleLoc)
ObjCCategoryDecl * ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc, const IdentifierInfo *ClassName, SourceLocation ClassLoc, ObjCTypeParamList *typeParamList, const IdentifierInfo *CategoryName, SourceLocation CategoryLoc, Decl *const *ProtoRefs, unsigned NumProtoRefs, const SourceLocation *ProtoLocs, SourceLocation EndProtoLoc, const ParsedAttributesView &AttrList)
void actOnObjCTypeArgsOrProtocolQualifiers(Scope *S, ParsedType baseType, SourceLocation lAngleLoc, ArrayRef< IdentifierInfo * > identifiers, ArrayRef< SourceLocation > identifierLocs, SourceLocation rAngleLoc, SourceLocation &typeArgsLAngleLoc, SmallVectorImpl< ParsedType > &typeArgs, SourceLocation &typeArgsRAngleLoc, SourceLocation &protocolLAngleLoc, SmallVectorImpl< Decl * > &protocols, SourceLocation &protocolRAngleLoc, bool warnOnIncompleteProtocols)
Given a list of identifiers (and their locations), resolve the names to either Objective-C protocol q...
bool CheckForwardProtocolDeclarationForCircularDependency(IdentifierInfo *PName, SourceLocation &PLoc, SourceLocation PrevLoc, const ObjCList< ObjCProtocolDecl > &PList)
void DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl *IMPDecl, ObjCContainerDecl *CDecl, bool SynthesizeProperties)
DiagnoseUnimplementedProperties - This routine warns on those properties which must be implemented by...
void AtomicPropertySetterGetterRules(ObjCImplDecl *IMPDecl, ObjCInterfaceDecl *IDecl)
AtomicPropertySetterGetterRules - This routine enforces the rule (via warning) when atomic property h...
void DiagnoseClassExtensionDupMethods(ObjCCategoryDecl *CAT, ObjCInterfaceDecl *ID)
DiagnoseClassExtensionDupMethods - Check for duplicate declaration of a class method in its extension...
ObjCCategoryImplDecl * ActOnStartCategoryImplementation(SourceLocation AtCatImplLoc, const IdentifierInfo *ClassName, SourceLocation ClassLoc, const IdentifierInfo *CatName, SourceLocation CatLoc, const ParsedAttributesView &AttrList)
ActOnStartCategoryImplementation - Perform semantic checks on the category implementation declaration...
bool inferObjCARCLifetime(ValueDecl *decl)
void CheckObjCMethodOverride(ObjCMethodDecl *NewMethod, const ObjCMethodDecl *Overridden)
Check whether the given new method is a valid override of the given overridden method,...
void ActOnTypedefedProtocols(SmallVectorImpl< Decl * > &ProtocolRefs, SmallVectorImpl< SourceLocation > &ProtocolLocs, IdentifierInfo *SuperName, SourceLocation SuperLoc)
ActOnTypedefedProtocols - this action finds protocol list as part of the typedef'ed use for a qualifi...
void DiagnoseMissingDesignatedInitOverrides(const ObjCImplementationDecl *ImplD, const ObjCInterfaceDecl *IFD)
void CollectIvarsToConstructOrDestruct(ObjCInterfaceDecl *OI, SmallVectorImpl< ObjCIvarDecl * > &Ivars)
CollectIvarsToConstructOrDestruct - Collect those ivars which require initialization.
DeclGroupPtrTy ActOnForwardProtocolDeclaration(SourceLocation AtProtoclLoc, ArrayRef< IdentifierLocPair > IdentList, const ParsedAttributesView &attrList)
ActOnForwardProtocolDeclaration - Handle @protocol foo;.
ObjCProtocolDecl * LookupProtocol(IdentifierInfo *II, SourceLocation IdLoc, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Find the protocol with the given name, if any.
QualType AdjustParameterTypeForObjCAutoRefCount(QualType T, SourceLocation NameLoc, TypeSourceInfo *TSInfo)
GlobalMethodPool MethodPool
Method Pool - allows efficient lookup when typechecking messages to "id".
ObjCProtocolDecl * ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc, IdentifierInfo *ProtocolName, SourceLocation ProtocolLoc, Decl *const *ProtoRefNames, unsigned NumProtoRefs, const SourceLocation *ProtoLocs, SourceLocation EndProtoLoc, const ParsedAttributesView &AttrList, SkipBodyInfo *SkipBody)
Decl * ActOnAtEnd(Scope *S, SourceRange AtEnd, ArrayRef< Decl * > allMethods=std::nullopt, ArrayRef< DeclGroupPtrTy > allTUVars=std::nullopt)
ResultTypeCompatibilityKind
Describes the compatibility of a result type with its method.
void DiagnoseMultipleMethodInGlobalPool(SmallVectorImpl< ObjCMethodDecl * > &Methods, Selector Sel, SourceRange R, bool receiverIdOrClass)
DeclGroupPtrTy ActOnForwardClassDeclaration(SourceLocation Loc, IdentifierInfo **IdentList, SourceLocation *IdentLocs, ArrayRef< ObjCTypeParamList * > TypeParamLists, unsigned NumElts)
void ReadMethodPool(Selector Sel)
Read the contents of the method pool for a given selector from external storage.
void ActOnDefs(Scope *S, Decl *TagD, SourceLocation DeclStart, const IdentifierInfo *ClassName, SmallVectorImpl< Decl * > &Decls)
Called whenever @defs(ClassName) is encountered in the source.
void AddFactoryMethodToGlobalPool(ObjCMethodDecl *Method, bool impl=false)
AddFactoryMethodToGlobalPool - Same as above, but for factory methods.
void DiagnoseTypeArgsAndProtocols(IdentifierInfo *ProtocolId, SourceLocation ProtocolLoc, IdentifierInfo *TypeArgId, SourceLocation TypeArgLoc, bool SelectProtocolFirst=false)
bool CollectMultipleMethodsInGlobalPool(Selector Sel, SmallVectorImpl< ObjCMethodDecl * > &Methods, bool InstanceFirst, bool CheckTheOther, const ObjCObjectType *TypeBound=nullptr)
We first select the type of the method: Instance or Factory, then collect all methods with that type.
void CheckObjCMethodDirectOverrides(ObjCMethodDecl *method, ObjCMethodDecl *overridden)
void DiagnoseUseOfUnimplementedSelectors()
void CheckCategoryVsClassMethodMatches(ObjCCategoryImplDecl *CatIMP)
CheckCategoryVsClassMethodMatches - Checks that methods implemented in category matches with those im...
void ImplMethodsVsClassMethods(Scope *S, ObjCImplDecl *IMPDecl, ObjCContainerDecl *IDecl, bool IncompleteImpl=false)
ImplMethodsVsClassMethods - This is main routine to warn if any method remains unimplemented in the c...
void CheckObjCMethodOverrides(ObjCMethodDecl *ObjCMethod, ObjCInterfaceDecl *CurrentClass, ResultTypeCompatibilityKind RTC)
void CheckImplementationIvars(ObjCImplementationDecl *ImpDecl, ObjCIvarDecl **Fields, unsigned nIvars, SourceLocation Loc)
CheckImplementationIvars - This routine checks if the instance variables listed in the implelementati...
ObjCMethodDecl * LookupImplementedMethodInGlobalPool(Selector Sel)
LookupImplementedMethodInGlobalPool - Returns the method which has an implementation.
void AddInstanceMethodToGlobalPool(ObjCMethodDecl *Method, bool impl=false)
AddInstanceMethodToGlobalPool - All instance methods in a translation unit are added to a global pool...
void AddAnyMethodToGlobalPool(Decl *D)
AddAnyMethodToGlobalPool - Add any method, instance or factory to global pool.
@ OCK_CategoryImplementation
bool isSelfExpr(Expr *RExpr)
Private Helper predicate to check for 'self'.
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
void ActOnObjCContainerStartDefinition(ObjCContainerDecl *IDecl)
void FindProtocolDeclaration(bool WarnOnDeclarations, bool ForObjCContainer, ArrayRef< IdentifierLocPair > ProtocolId, SmallVectorImpl< Decl * > &Protocols)
FindProtocolDeclaration - This routine looks up protocols and issues an error if they are not declare...
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
Sema - This implements semantic analysis and AST building for C.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
LookupNameKind
Describes the kind of name lookup to perform.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupObjCProtocolName
Look up the name of an Objective-C protocol.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
@ LookupAnyName
Look up any declaration with any name.
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
class clang::Sema::DelayedDiagnostics DelayedDiagnostics
ExprResult VerifyBitField(SourceLocation FieldLoc, const IdentifierInfo *FieldName, QualType FieldTy, bool IsMsStruct, Expr *BitWidth)
VerifyBitField - verifies that a bit field expression is an ICE and has the correct width,...
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ASTContext & getASTContext() const
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
void PushFunctionScope()
Enter a new function scope.
bool CheckFunctionReturnType(QualType T, SourceLocation Loc)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() const
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
bool tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo, QualType &T, SourceLocation Loc, unsigned FailedFoldDiagID)
Attempt to fold a variable-sized type to a constant-sized type, returning true if we were successful.
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
DeclContext * getCurLexicalContext() const
sema::FunctionScopeInfo * getCurFunction() const
DeclGroupPtrTy BuildDeclaratorGroup(MutableArrayRef< Decl * > Group)
BuildDeclaratorGroup - convert a list of declarations into a declaration group, performing any necess...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
void applyFunctionAttributesBeforeParsingBody(Decl *FD)
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
SourceManager & getSourceManager() const
TypeResult ActOnTypeName(Declarator &D)
ExternalSemaSource * getExternalSource() const
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
RedeclarationKind forRedeclarationInCurContext() const
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AMK_Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
DiagnosticsEngine & Diags
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
llvm::BumpPtrAllocator BumpAlloc
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old)
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
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)
IdentifierResolver IdResolver
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
SourceLocation getBeginLoc() const LLVM_READONLY
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
StringRef getPlatformName() const
Retrieve the name of the platform as it is used in the availability attribute.
VersionTuple getPlatformMinVersion() const
Retrieve the minimum desired version of the platform, to which the program should be compiled.
Represents a declaration of a type.
SourceLocation getBeginLoc() const LLVM_READONLY
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.
TypeLoc findExplicitQualifierLoc() const
Find a type with the location of an explicit type qualifier.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
SourceLocation getEndLoc() const
Get the end source location.
SourceLocation getBeginLoc() const
Get the begin source location.
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.
The base class of the type hierarchy.
bool isIncompleteArrayType() 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
const ObjCObjectPointerType * getAsObjCInterfacePointerType() const
bool isScalarType() const
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
bool containsErrors() const
Whether this type is an error type.
bool isObjCIdType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isObjCObjectType() const
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const
Return the implicit lifetime for this type, which must not be dependent.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
bool isObjCIndependentClassType() const
Base class for declarations which introduce a typedef-name.
TypeSourceInfo * getTypeSourceInfo() const
QualType getUnderlyingType() const
Simple class containing the result of Sema::CorrectTypo.
DeclClass * getCorrectionDeclAs() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
void setExceptionVariable(bool EV)
static DelayedDiagnostic makeForbiddenType(SourceLocation loc, unsigned diagnostic, QualType type, unsigned argument)
bool ObjCIsDesignatedInit
True when this is a method marked as a designated initializer.
bool ObjCShouldCallSuper
A flag that is set when parsing a method that must call super's implementation, such as -dealloc,...
bool ObjCWarnForNoInitDelegation
This starts true for a secondary initializer method and will be set to false if there is an invocatio...
bool ObjCIsSecondaryInit
True when this is an initializer method not marked as a designated initializer within a class that ha...
bool ObjCWarnForNoDesignatedInitChain
This starts true for a method marked as designated initializer and will be set to false if there is a...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
SmallVector< BoundNodes, 1 > match(MatcherT Matcher, const NodeT &Node, ASTContext &Context)
Returns the results of matching Matcher on Node.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
ObjCKeywordKind
Provides a namespace for Objective-C keywords which start with an '@'.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
ThreadStorageClassSpecifier
Thread storage-class-specifier.
ObjCMethodFamily
A family of Objective-C methods.
@ OMF_None
No particular method family.
@ Property
The type of a property.
Selector GetNullarySelector(StringRef name, ASTContext &Ctx)
Utility function for constructing a nullary selector.
@ Class
The "class" keyword.
AvailabilityResult
Captures the result of checking the availability of a declaration.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
ObjCTypeParamVariance
Describes the variance of a given generic parameter.
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
std::pair< IdentifierInfo *, SourceLocation > IdentifierLocPair
A simple pair of identifier info and location.
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Visibility
Describes the different kinds of visibility that a declaration may have.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
ParamInfo - An array of paraminfo objects is allocated whenever a function declarator is parsed.
static DeclaratorChunk getPointer(unsigned TypeQuals, SourceLocation Loc, SourceLocation ConstQualLoc, SourceLocation VolatileQualLoc, SourceLocation RestrictQualLoc, SourceLocation AtomicQualLoc, SourceLocation UnalignedQualLoc)
Return a DeclaratorChunk for a pointer.
a linked list of methods with the same selector name but different signatures.
ObjCMethodDecl * getMethod() const
void setMethod(ObjCMethodDecl *M)
void setNext(ObjCMethodList *L)
bool hasMoreThanOneDecl() const
ObjCMethodList * getNext() const
ParsedAttributesView ArgAttrs
ArgAttrs - Attribute list for this argument.