30#include "llvm/ADT/DenseMap.h"
31#include "llvm/ADT/DenseSet.h"
64 assert(resultClass &&
"unexpected object type!");
69 if (receiverTypeIfCall.
isNull() &&
79 if (receiverTypeIfCall.
isNull())
86 if (!receiverClass)
return false;
89 assert(receiverClass &&
"method not associated with a class!");
103 if (receiverTypeIfCall.
isNull() &&
105 method->
addAttr(UnavailableAttr::CreateImplicit(Context,
"",
106 UnavailableAttr::IR_ARCInitReturnsUnrelated, loc));
111 Diag(loc, diag::err_arc_init_method_unrelated_result_type);
120 if (OldD->
hasAttr<NoEscapeAttr>() && !NewD->
hasAttr<NoEscapeAttr>()) {
121 S.
Diag(NewD->
getLocation(), diag::warn_overriding_method_missing_noescape);
158 CurrentClass = Cat->getClassInterface();
159 else if (
ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(DC))
160 CurrentClass = Impl->getClassInterface();
162 = dyn_cast<ObjCCategoryImplDecl>(DC))
163 CurrentClass = CatImpl->getClassInterface();
168 diag::warn_related_result_type_compatibility_class)
174 diag::warn_related_result_type_compatibility_protocol)
181 diag::note_related_result_type_family)
186 diag::note_related_result_type_overridden);
189 if ((NewMethod->
hasAttr<NSReturnsRetainedAttr>() !=
190 Overridden->
hasAttr<NSReturnsRetainedAttr>())) {
193 ? diag::err_nsreturns_retained_attribute_mismatch
194 : diag::warn_nsreturns_retained_attribute_mismatch)
198 if ((NewMethod->
hasAttr<NSReturnsNotRetainedAttr>() !=
199 Overridden->
hasAttr<NSReturnsNotRetainedAttr>())) {
202 ? diag::err_nsreturns_retained_attribute_mismatch
203 : diag::warn_nsreturns_retained_attribute_mismatch)
212 ni != ne && oi != oe; ++ni, ++oi) {
215 if (newDecl->
hasAttr<NSConsumedAttr>() !=
216 oldDecl->
hasAttr<NSConsumedAttr>()) {
219 ? diag::err_nsconsumed_attribute_mismatch
220 : diag::warn_nsconsumed_attribute_mismatch);
265 method->
addAttr(NSConsumesSelfAttr::CreateImplicit(Context));
269 if (method->
hasAttr<NSReturnsRetainedAttr>())
277 if (method->
hasAttr<NSReturnsRetainedAttr>() ||
278 method->
hasAttr<NSReturnsNotRetainedAttr>() ||
279 method->
hasAttr<NSReturnsAutoreleasedAttr>())
284 method->
addAttr(NSReturnsRetainedAttr::CreateImplicit(Context));
292 bool IsCategory =
false;
293 StringRef RealizedPlatform;
295 nullptr, VersionTuple(),
298 if (isa<ObjCMethodDecl>(ND)) {
301 if (RealizedPlatform.empty())
305 if (RealizedPlatform.ends_with(
"_app_extension"))
307 S.
Diag(ImplLoc, diag::warn_unavailable_def);
312 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND)) {
313 if (!CD->getClassInterface()->isDeprecated())
315 ND = CD->getClassInterface();
320 S.
Diag(ImplLoc, diag::warn_deprecated_def)
321 << (isa<ObjCMethodDecl>(ND)
323 : isa<ObjCCategoryDecl>(ND) || IsCategory ? 2
325 if (isa<ObjCMethodDecl>(ND))
330 << (isa<ObjCCategoryDecl>(ND) ?
"category" :
"class");
363 return !
T.getLocalQualifiers().hasObjCLifetime();
385 diag::err_func_def_incomplete_result))
407 if (!Param->isInvalidDecl() &&
getLangOpts().ObjCAutoRefCount &&
409 Diag(Param->getLocation(), diag::warn_arc_strong_pointer_objc_pointer) <<
412 if (Param->getIdentifier())
455 ImplDeclOfMethodDecl = OID->getImplementation();
456 else if (
ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(ContDeclOfMethodDecl)) {
457 if (CD->IsClassExtension()) {
459 ImplDeclOfMethodDecl = OID->getImplementation();
461 ImplDeclOfMethodDecl = CD->getImplementation();
465 if (!ImplDeclOfMethodDecl || ImplDeclOfMethodDecl != ImplDeclOfMethodDef)
473 IC->getSuperClass() !=
nullptr;
474 }
else if (IC->hasDesignatedInitializers()) {
500 (SuperMethod && SuperMethod->
hasAttr<ObjCRequiresSuperAttr>());
517 ObjCInterfaceValidatorCCC() : CurrentIDecl(nullptr) {}
519 : CurrentIDecl(IDecl) {}
521 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
526 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
527 return std::make_unique<ObjCInterfaceValidatorCCC>(*
this);
539 unsigned NumProtoRefs,
544 for (
unsigned i = 0; i < NumProtoRefs; ++i) {
565 ObjCInterfaceValidatorCCC CCC(IDecl);
570 << SuperName << ClassName);
576 Diag(SuperLoc, diag::err_recursive_superclass)
577 << SuperName << ClassName <<
SourceRange(AtInterfaceLoc, ClassLoc);
581 dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
585 if (SuperClassDecl) {
590 if (PrevDecl && !SuperClassDecl) {
594 dyn_cast_or_null<TypedefNameDecl>(PrevDecl)) {
598 SuperClassDecl = dyn_cast<ObjCInterfaceDecl>(IDecl);
616 if (!SuperClassDecl) {
617 Diag(SuperLoc, diag::err_redefinition_different_kind) << SuperName;
622 if (!isa_and_nonnull<TypedefNameDecl>(PrevDecl)) {
624 Diag(SuperLoc, diag::err_undef_superclass)
625 << SuperName << ClassName <<
SourceRange(AtInterfaceLoc, ClassLoc);
627 SuperLoc, SuperClassType, diag::err_forward_superclass,
630 SuperClassDecl =
nullptr;
635 if (SuperClassType.
isNull()) {
636 assert(!SuperClassDecl &&
"Failed to set SuperClassType?");
642 if (!SuperTypeArgs.empty()) {
645 SuperTypeArgsRange.
getBegin(), SuperTypeArgs,
655 if (!SuperClassTInfo) {
672 if (parsedTypeBound) {
684 diag::err_objc_type_param_bound_missing_pointer)
685 << typeBound << paramName
704 diag::err_objc_type_param_bound_nonobject)
705 << typeBound << paramName;
708 typeBoundInfo =
nullptr;
717 bool diagnosed =
false;
721 rangeToRemove =
attr.getLocalSourceRange();
722 if (
attr.getTypePtr()->getImmediateNullability()) {
724 diag::err_objc_type_param_bound_explicit_nullability)
725 << paramName << typeBound
735 diag::err_objc_type_param_bound_qualified)
736 << paramName << typeBound
746 if (!quals.
empty()) {
756 if (!typeBoundInfo) {
763 varianceLoc, index, paramLoc, paramName,
764 colonLoc, typeBoundInfo);
776 typeParamsIn.size());
782 llvm::SmallDenseMap<IdentifierInfo *, ObjCTypeParamDecl *> knownParams;
783 for (
auto *typeParam : typeParams) {
784 auto known = knownParams.find(typeParam->getIdentifier());
785 if (known != knownParams.end()) {
786 Diag(typeParam->getLocation(), diag::err_objc_type_param_redecl)
787 << typeParam->getIdentifier()
790 typeParam->setInvalidDecl();
792 knownParams.insert(std::make_pair(typeParam->getIdentifier(), typeParam));
805 for (
auto *typeParam : *typeParamList) {
806 if (!typeParam->isInvalidDecl()) {
807 S->RemoveDecl(typeParam);
816 enum class TypeParamListContext {
830 TypeParamListContext newContext) {
832 if (prevTypeParams->
size() != newTypeParams->
size()) {
834 if (newTypeParams->
size() > prevTypeParams->
size()) {
840 S.
Diag(diagLoc, diag::err_objc_type_param_arity_mismatch)
841 <<
static_cast<unsigned>(newContext)
842 << (newTypeParams->
size() > prevTypeParams->
size())
843 << prevTypeParams->
size()
844 << newTypeParams->
size();
850 for (
unsigned i = 0, n = prevTypeParams->
size(); i != n; ++i) {
857 newContext != TypeParamListContext::Definition) {
876 auto diag = S.
Diag(diagLoc,
877 diag::err_objc_type_param_variance_conflict)
878 <<
static_cast<unsigned>(newTypeParam->
getVariance())
880 <<
static_cast<unsigned>(prevTypeParam->
getVariance())
889 StringRef newVarianceStr
896 (newVarianceStr +
" ").str());
923 S.
Diag(newBoundRange.
getBegin(), diag::err_objc_type_param_bound_conflict)
947 if (newContext == TypeParamListContext::ForwardDeclaration ||
948 newContext == TypeParamListContext::Definition) {
956 diag::err_objc_type_param_bound_missing)
959 << (newContext == TypeParamListContext::ForwardDeclaration)
978 Decl *
const *ProtoRefs,
unsigned NumProtoRefs,
981 assert(ClassName &&
"Missing class identifier");
989 if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
990 Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
1017 if (typeParamList) {
1021 TypeParamListContext::Definition)) {
1022 typeParamList =
nullptr;
1025 Diag(ClassLoc, diag::err_objc_parameterized_forward_class_first)
1027 Diag(prevTypeParamList->getLAngleLoc(), diag::note_previous_decl)
1032 for (
auto *typeParam : *prevTypeParamList) {
1038 typeParam->getUnderlyingType())));
1051 ClassName, typeParamList, PrevIDecl, ClassLoc);
1057 SkipBody->
New = IDecl;
1060 Diag(AtInterfaceLoc, diag::err_duplicate_class_def)
1062 Diag(Def->getLocation(), diag::note_previous_definition);
1090 ClassName, ClassLoc,
1091 SuperName, SuperLoc, SuperTypeArgs,
1092 SuperTypeArgsRange);
1100 NumProtoRefs, ProtoLocs);
1102 ProtoLocs, Context);
1125 if (
const TypedefNameDecl *TDecl = dyn_cast_or_null<TypedefNameDecl>(IDecl)) {
1126 QualType T = TDecl->getUnderlyingType();
1129 ProtocolRefs.append(OPT->qual_begin(), OPT->qual_end());
1134 ProtocolLocs.append(OPT->getNumProtocols(), SuperLoc);
1152 Diag(AliasLocation, diag::err_conflicting_aliasing_type) << AliasName;
1161 dyn_cast_or_null<TypedefNameDecl>(CDeclU)) {
1162 QualType T = TDecl->getUnderlyingType();
1165 ClassName = IDecl->getIdentifier();
1174 Diag(ClassLocation, diag::warn_undef_interface) << ClassName;
1196 E = PList.
end(); I !=
E; ++I) {
1198 if (PDecl->getIdentifier() == PName) {
1199 Diag(Ploc, diag::err_protocol_has_circular_dependency);
1200 Diag(PrevLoc, diag::note_previous_definition);
1204 if (!PDecl->hasDefinition())
1208 PDecl->getLocation(), PDecl->getReferencedProtocols()))
1223 assert(ProtocolName &&
"Missing protocol identifier");
1233 ProtocolLoc, AtProtoInterfaceLoc,
1238 SkipBody->
New = PDecl;
1242 Diag(ProtocolLoc, diag::warn_duplicate_protocol_def) << ProtocolName;
1243 Diag(Def->getLocation(), diag::note_previous_definition);
1258 ProtocolName, ProtocolLoc, PrevDecl->
getLocation(), PList);
1263 ProtocolLoc, AtProtoInterfaceLoc,
1278 if (!err && NumProtoRefs ) {
1281 NumProtoRefs, ProtoLocs);
1283 ProtoLocs, Context);
1295 UndefinedProtocol = PDecl;
1301 UndefinedProtocol = PI;
1311 bool ForObjCContainer,
1324 PDiag(diag::err_undeclared_protocol_suggest)
1329 Diag(Pair.second, diag::err_undeclared_protocol) << Pair.first;
1338 if (!ForObjCContainer) {
1347 if (WarnOnDeclarations &&
1349 Diag(Pair.second, diag::warn_undef_protocolref) << Pair.first;
1350 Diag(UndefinedProtocol->
getLocation(), diag::note_protocol_decl_undefined)
1351 << UndefinedProtocol;
1353 Protocols.push_back(PDecl);
1360class ObjCTypeArgOrProtocolValidatorCCC final
1365 ObjCTypeArgOrProtocolValidatorCCC(
ASTContext &context,
1367 : Context(context), LookupKind(lookupKind) { }
1369 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
1383 if (isa<RecordDecl>(typeDecl) && !Context.
getLangOpts().CPlusPlus)
1389 if (
type->isObjCObjectPointerType() ||
1390 type->isBlockPointerType() ||
1391 type->isDependentType() ||
1392 type->isObjCObjectType())
1409 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
1410 return std::make_unique<ObjCTypeArgOrProtocolValidatorCCC>(*
this);
1419 bool SelectProtocolFirst) {
1420 Diag(TypeArgLoc, diag::err_objc_type_args_and_protocols)
1421 << SelectProtocolFirst << TypeArgId << ProtocolId
1432 bool warnOnIncompleteProtocols) {
1436 unsigned numProtocolsResolved = 0;
1437 auto resolvedAsProtocols = [&] {
1438 assert(numProtocolsResolved == identifiers.size() &&
"Unresolved protocols");
1445 bool allAreTypeNames =
false;
1449 baseClass = objcObjectType->getInterface();
1452 if (typeParams->size() == numProtocolsResolved) {
1454 allAreTypeNames =
true;
1461 for (
unsigned i = 0, n = protocols.size(); i != n; ++i) {
1466 if (!warnOnIncompleteProtocols) {
1478 if (warnOnIncompleteProtocols &&
1480 Diag(identifierLocs[i], diag::warn_undef_protocolref)
1489 if (allAreTypeNames) {
1493 if (isa<ObjCInterfaceDecl>(
decl)) {
1495 firstClassNameLoc = identifierLocs[i];
1496 }
else if (!isa<TypeDecl>(
decl)) {
1498 allAreTypeNames =
false;
1501 allAreTypeNames =
false;
1510 if (allAreTypeNames && firstClassNameLoc.
isValid()) {
1513 bool allProtocolsDeclared =
true;
1514 for (
auto *proto : protocols) {
1516 allProtocolsDeclared =
false;
1521 if (allProtocolsDeclared) {
1522 Diag(firstClassNameLoc, diag::warn_objc_redundant_qualified_class_type)
1529 protocolLAngleLoc = lAngleLoc;
1530 protocolRAngleLoc = rAngleLoc;
1531 assert(protocols.size() == identifierLocs.size());
1535 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1537 protocols.push_back(proto);
1539 ++numProtocolsResolved;
1543 if (numProtocolsResolved == identifiers.size())
1544 return resolvedAsProtocols();
1550 typedef llvm::PointerUnion<TypeDecl *, ObjCInterfaceDecl *> TypeOrClassDecl;
1552 unsigned numTypeDeclsResolved = 0;
1553 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1557 typeDecls.push_back(TypeOrClassDecl());
1561 if (
auto typeDecl = dyn_cast<TypeDecl>(
decl)) {
1562 typeDecls.push_back(typeDecl);
1563 ++numTypeDeclsResolved;
1567 if (
auto objcClass = dyn_cast<ObjCInterfaceDecl>(
decl)) {
1568 typeDecls.push_back(objcClass);
1569 ++numTypeDeclsResolved;
1573 typeDecls.push_back(TypeOrClassDecl());
1580 auto resolveTypeReference = [&](TypeOrClassDecl typeDecl,
SourceLocation loc)
1584 const char* prevSpec;
1587 if (
auto *actualTypeDecl = typeDecl.dyn_cast<
TypeDecl *>())
1615 Diag(loc, diag::err_objc_type_arg_missing_star)
1626 auto resolvedAsTypeDecls = [&] {
1630 assert(numTypeDeclsResolved == identifiers.size() &&
"Unresolved type decl");
1632 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1634 TypeResult type = resolveTypeReference(typeDecls[i], identifierLocs[i]);
1635 if (!
type.isUsable()) {
1640 typeArgs.push_back(
type.get());
1643 typeArgsLAngleLoc = lAngleLoc;
1644 typeArgsRAngleLoc = rAngleLoc;
1649 if (numTypeDeclsResolved == identifiers.size())
1650 return resolvedAsTypeDecls();
1656 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1659 if (protocols[i] || typeDecls[i]) {
1665 if (protocols[i] && typeDecls[i])
1688 identifiers[i], identifierLocs[i],
1689 protocols[i] !=
nullptr);
1697 ObjCTypeArgOrProtocolValidatorCCC CCC(Context, lookupKind);
1705 PDiag(diag::err_undeclared_protocol_suggest)
1708 protocols[i] = proto;
1709 ++numProtocolsResolved;
1716 PDiag(diag::err_unknown_typename_suggest)
1719 typeDecls[i] = typeDecl;
1720 ++numTypeDeclsResolved;
1727 PDiag(diag::err_unknown_type_or_class_name_suggest)
1728 << identifiers[i] <<
true);
1730 typeDecls[i] = objcClass;
1731 ++numTypeDeclsResolved;
1737 Diag(identifierLocs[i],
1740 ? diag::err_undeclared_protocol
1741 : diag::err_unknown_typename))
1750 if (numProtocolsResolved == identifiers.size())
1751 return resolvedAsProtocols();
1754 assert(numTypeDeclsResolved == identifiers.size() &&
"Not all types?");
1755 return resolvedAsTypeDecls();
1766 llvm::DenseMap<Selector, const ObjCMethodDecl*> MethodMap;
1767 for (
auto *MD : ID->methods())
1768 MethodMap[MD->getSelector()] = MD;
1770 if (MethodMap.empty())
1772 for (
const auto *Method : CAT->
methods()) {
1773 const ObjCMethodDecl *&PrevMethod = MethodMap[Method->getSelector()];
1777 Diag(Method->getLocation(), diag::err_duplicate_method_decl)
1778 << Method->getDeclName();
1796 IdentPair.second, AtProtocolLoc, PrevDecl);
1807 DeclsInGroup.push_back(PDecl);
1817 Decl *
const *ProtoRefs,
unsigned NumProtoRefs,
1828 diag::err_category_forward_interface,
1829 CategoryName ==
nullptr)) {
1834 AtInterfaceLoc, ClassLoc, CategoryLoc,
1835 CategoryName, IDecl, typeParamList);
1840 Diag(ClassLoc, diag::err_undef_interface) << ClassName;
1846 Diag(ClassLoc, diag::err_class_extension_after_impl) << ClassName;
1848 diag::note_implementation_declared);
1856 Diag(CategoryLoc, diag::warn_dup_category_def)
1857 << ClassName << CategoryName;
1858 Diag(
Previous->getLocation(), diag::note_previous_definition);
1863 if (typeParamList) {
1866 SemaRef, prevTypeParamList, typeParamList,
1867 CategoryName ? TypeParamListContext::Category
1868 : TypeParamListContext::Extension))
1869 typeParamList =
nullptr;
1872 diag::err_objc_parameterized_category_nonclass)
1873 << (CategoryName !=
nullptr)
1877 typeParamList =
nullptr;
1882 ClassLoc, CategoryLoc, CategoryName, IDecl,
1895 NumProtoRefs, ProtoLocs);
1897 ProtoLocs, Context);
1901 NumProtoRefs, Context);
1926 ClassLoc, CatLoc, CatName, IDecl,
1934 ClassLoc, AtCatImplLoc, CatLoc);
1937 Diag(ClassLoc, diag::err_undef_interface) << ClassName;
1941 diag::err_undef_interface)) {
1953 if (IDecl && IDecl->
hasAttr<ObjCRuntimeVisibleAttr>()) {
1954 Diag(ClassLoc, diag::err_objc_runtime_visible_category)
1961 Diag(ClassLoc, diag::err_dup_implementation_category) << ClassName
1964 diag::note_previous_definition);
1990 if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
1991 Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
1993 }
else if ((IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl))) {
1997 diag::warn_undef_interface);
2001 ObjCInterfaceValidatorCCC CCC{};
2010 Corrected,
PDiag(diag::warn_undef_interface_suggest) << ClassName,
2013 Diag(ClassLoc, diag::warn_undef_interface) << ClassName;
2019 if (SuperClassname) {
2024 if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
2025 Diag(SuperClassLoc, diag::err_redefinition_different_kind)
2029 SDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
2033 Diag(SuperClassLoc, diag::err_undef_superclass)
2034 << SuperClassname << ClassName;
2038 Diag(SuperClassLoc, diag::err_conflicting_super_class)
2054 nullptr, ClassLoc,
true);
2077 ClassLoc, AtClassImplLoc, SuperClassLoc);
2090 Diag(ClassLoc, diag::err_dup_implementation_class) << ClassName;
2092 diag::note_previous_definition);
2106 Diag(ClassLoc, diag::err_objc_runtime_visible_subclass)
2119 DeclsInGroup.reserve(Decls.size() + 1);
2121 for (
unsigned i = 0, e = Decls.size(); i != e; ++i) {
2122 Decl *Dcl = Decls[i];
2127 DeclsInGroup.push_back(Dcl);
2130 DeclsInGroup.push_back(ObjCImpDecl);
2138 assert(ImpDecl &&
"missing implementation decl");
2149 for (
unsigned i = 0, e = numIvars; i != e; ++i) {
2166 assert(ivars &&
"missing @implementation ivars");
2170 for (
unsigned i = 0; i < numIvars; i++) {
2175 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
2183 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
2200 for (; numIvars > 0 && IVI != IVE; ++IVI) {
2203 assert (ImplIvar &&
"missing implementation ivar");
2204 assert (ClsIvar &&
"missing class ivar");
2216 diag::err_conflicting_ivar_bitwidth)
2219 diag::note_previous_definition);
2231 Diag(ivars[j]->getLocation(), diag::err_inconsistent_ivar_count);
2232 else if (IVI != IVE)
2233 Diag(IVI->getLocation(), diag::err_inconsistent_ivar_count);
2261 std::string FixItStr;
2262 llvm::raw_string_ostream Out(FixItStr);
2273 S.
Diag(MethodLoc, diag::note_method_declared_at) << method;
2349 (y &
~Decl::OBJC_TQ_CSNullability);
2355 bool IsProtocolMethodDecl,
2356 bool IsOverridingMode,
2358 if (IsProtocolMethodDecl &&
2364 ? diag::warn_conflicting_overriding_ret_type_modifiers
2365 : diag::warn_conflicting_ret_type_modifiers))
2374 if (Warn && IsOverridingMode &&
2382 diag::warn_conflicting_nullability_attr_overriding_ret_types)
2399 IsOverridingMode ? diag::warn_conflicting_overriding_ret_types
2400 : diag::warn_conflicting_ret_types;
2416 IsOverridingMode ? diag::warn_non_covariant_overriding_ret_types
2417 : diag::warn_non_covariant_ret_types;
2426 ? diag::note_previous_declaration
2427 : diag::note_previous_definition)
2437 bool IsProtocolMethodDecl,
2438 bool IsOverridingMode,
2440 if (IsProtocolMethodDecl &&
2444 if (IsOverridingMode)
2446 diag::warn_conflicting_overriding_param_modifiers)
2450 diag::warn_conflicting_param_modifiers)
2462 if (Warn && IsOverridingMode &&
2466 diag::warn_conflicting_nullability_attr_overriding_param_types)
2481 IsOverridingMode ? diag::warn_conflicting_overriding_param_types
2482 : diag::warn_conflicting_param_types;
2498 IsOverridingMode ? diag::warn_non_contravariant_overriding_param_types
2499 : diag::warn_non_contravariant_param_types;
2505 << MethodImpl->
getDeclName() << IfaceTy << ImplTy;
2507 (IsOverridingMode ? diag::note_previous_declaration
2508 : diag::note_previous_definition))
2519 if (implFamily == declFamily)
return false;
2531 unsigned errorID = diag::err_arc_lost_method_convention;
2532 unsigned noteID = diag::note_arc_lost_method_convention;
2535 family = implFamily;
2536 errorID = diag::err_arc_gained_method_convention;
2537 noteID = diag::note_arc_gained_method_convention;
2541 enum FamilySelector {
2542 F_alloc, F_copy, F_mutableCopy = F_copy, F_init, F_new
2544 FamilySelector familySelector = FamilySelector();
2547 case OMF_None: llvm_unreachable(
"logic error, no method convention");
2561 case OMF_init: familySelector = F_init;
break;
2562 case OMF_alloc: familySelector = F_alloc;
break;
2563 case OMF_copy: familySelector = F_copy;
break;
2565 case OMF_new: familySelector = F_new;
break;
2568 enum ReasonSelector { R_NonObjectReturn, R_UnrelatedReturn };
2569 ReasonSelector reasonSelector;
2574 reasonSelector = R_UnrelatedReturn;
2576 reasonSelector = R_NonObjectReturn;
2580 S.
Diag(
decl->getLocation(), noteID) <<
int(familySelector) <<
int(reasonSelector);
2587 bool IsProtocolMethodDecl) {
2593 IsProtocolMethodDecl,
false,
true);
2598 IM != EM && IF != EF; ++IM, ++IF) {
2600 IsProtocolMethodDecl,
false,
true);
2605 diag::warn_conflicting_variadic);
2612 bool IsProtocolMethodDecl) {
2620 IM != EM && IF != EF; ++IM, ++IF) {
2622 IsProtocolMethodDecl,
true,
true);
2627 diag::warn_conflicting_overriding_variadic);
2636 bool IsProtocolMethodDecl) {
2646 if (MethodDecl->
hasAttr<UnavailableAttr>() ||
2647 MethodDecl->
hasAttr<DeprecatedAttr>())
2651 IsProtocolMethodDecl,
false,
false);
2656 IM != EM && IF != EF; ++IM, ++IF) {
2658 *IF, IsProtocolMethodDecl,
false,
false);
2670 diag::warn_category_method_impl_match);
2687 if (PDecl->
hasAttr<ObjCExplicitProtocolImplAttr>())
2689 for (
const auto *PI : PDecl->
protocols())
2715 : dyn_cast<ObjCInterfaceDecl>(CDecl);
2716 assert (IDecl &&
"CheckProtocolMethodDefs - IDecl is null");
2732 if (PDecl->
hasAttr<ObjCExplicitProtocolImplAttr>()) {
2733 if (!ProtocolsExplictImpl) {
2755 if (InsMap.count(fISelector))
2774 if (method->getImplementationControl() !=
2776 !method->isPropertyAccessor() &&
2777 !InsMap.count(method->getSelector()) &&
2779 method->getSelector(),
true ,
2792 method->getSelector(),
true ,
2794 if (
C || MethodInClass->isPropertyAccessor())
2796 unsigned DIAG = diag::warn_unimplemented_protocol_method;
2804 if (method->getImplementationControl() !=
2806 !ClsMap.count(method->getSelector()) &&
2808 method->getSelector(),
false ,
2810 true ,
nullptr ))) {
2818 unsigned DIAG = diag::warn_unimplemented_protocol_method;
2827 ProtocolsExplictImpl);
2837 bool WarnCategoryMethodImpl) {
2841 if (!InsMapSeen.insert(I->getSelector()).second)
2843 if (!I->isPropertyAccessor() &&
2844 !InsMap.count(I->getSelector())) {
2847 diag::warn_undef_method_impl);
2853 "Expected to find the method through lookup as well");
2855 if (ImpMethodDecl) {
2859 if (!WarnCategoryMethodImpl)
2861 isa<ObjCProtocolDecl>(CDecl));
2862 else if (!I->isPropertyAccessor())
2871 if (!ClsMapSeen.insert(I->getSelector()).second)
2873 if (!I->isPropertyAccessor() &&
2874 !ClsMap.count(I->getSelector())) {
2877 diag::warn_undef_method_impl);
2882 "Expected to find the method through lookup as well");
2884 if (ImpMethodDecl) {
2888 if (!WarnCategoryMethodImpl)
2890 isa<ObjCProtocolDecl>(CDecl));
2891 else if (!I->isPropertyAccessor())
2900 for (
auto *PI : PD->protocols())
2902 IMPDecl, PI, IncompleteImpl,
false,
2903 WarnCategoryMethodImpl);
2910 if (!WarnCategoryMethodImpl) {
2911 for (
auto *Cat : I->visible_categories())
2913 IMPDecl, Cat, IncompleteImpl,
2914 ImmediateClass && Cat->IsClassExtension(),
2915 WarnCategoryMethodImpl);
2918 for (
auto *Ext : I->visible_extensions())
2920 IMPDecl, Ext, IncompleteImpl,
false,
2921 WarnCategoryMethodImpl);
2925 for (
auto *PI : I->all_referenced_protocols())
2927 IMPDecl, PI, IncompleteImpl,
false,
2928 WarnCategoryMethodImpl);
2932 if (!WarnCategoryMethodImpl && I->getSuperClass())
2935 I->getSuperClass(), IncompleteImpl,
false);
2966 if (SuperIDecl && SuperIDecl->
lookupMethod(Sel,
false))
2970 if (InsMap.empty() && ClsMap.empty())
2974 bool IncompleteImpl =
false;
2977 IncompleteImpl,
false,
2983 bool IncompleteImpl) {
2988 InsMap.insert(I->getSelector());
2996 const auto *
P = PImpl->getPropertyDecl();
2999 InsMap.insert(
P->getGetterName());
3000 if (!
P->getSetterName().isNull())
3001 InsMap.insert(
P->getSetterName());
3008 bool SynthesizeProperties =
getLangOpts().ObjCDefaultSynthProperties &&
3010 !IDecl->isObjCRequiresPropertyDefs();
3019 ClsMap.insert(I->getSelector());
3026 IncompleteImpl,
true);
3031 dyn_cast<ObjCCategoryImplDecl>(IMPDecl))
3042 for (
auto *PI : I->all_referenced_protocols())
3044 ClsMap, I, ExplicitImplProtocols);
3048 if (!
C->IsClassExtension()) {
3049 for (
auto *
P :
C->protocols())
3051 ClsMap, CDecl, ExplicitImplProtocols);
3056 llvm_unreachable(
"invalid ObjCContainerDecl type.");
3065 for (
unsigned i = 0; i != NumElts; ++i) {
3070 if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
3080 Diag(AtClassLoc, diag::err_redefinition_different_kind) << IdentList[i];
3088 Diag(AtClassLoc, diag::warn_forward_class_redefinition)
3098 = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
3120 if (PrevIDecl && TypeParams) {
3124 SemaRef, PrevTypeParams, TypeParams,
3125 TypeParamListContext::ForwardDeclaration)) {
3126 TypeParams =
nullptr;
3130 Diag(IdentLocs[i], diag::err_objc_parameterized_forward_class)
3133 Diag(Def->getLocation(), diag::note_defined_here)
3136 TypeParams =
nullptr;
3142 PrevIDecl, IdentLocs[i]);
3150 DeclsInGroup.push_back(IDecl);
3158 const Type *left,
const Type *right);
3168 if (left == right)
return true;
3192 if (isa<VectorType>(left))
return isa<VectorType>(right);
3193 if (isa<VectorType>(right))
return false;
3216 return (leftSK == rightSK);
3222 assert(lt && rt && lt != rt);
3224 if (!isa<RecordType>(lt) || !isa<RecordType>(rt))
return false;
3225 RecordDecl *left = cast<RecordType>(lt)->getDecl();
3226 RecordDecl *right = cast<RecordType>(rt)->getDecl();
3232 if ((isa<CXXRecordDecl>(left) && !cast<CXXRecordDecl>(left)->isPOD()) ||
3233 (isa<CXXRecordDecl>(right) && !cast<CXXRecordDecl>(right)->isPOD()))
3248 for (; li != le && ri != re; ++li, ++ri) {
3249 if (!
matchTypes(Context, strategy, li->getType(), ri->getType()))
3252 return (li == le && ri == re);
3274 (left->
hasAttr<NSReturnsRetainedAttr>()
3275 != right->
hasAttr<NSReturnsRetainedAttr>() ||
3276 left->
hasAttr<NSConsumesSelfAttr>()
3277 != right->
hasAttr<NSConsumesSelfAttr>()))
3284 for (; li != le && ri != re; ++li, ++ri) {
3285 assert(ri != right->
param_end() &&
"Param mismatch");
3292 lparm->
hasAttr<NSConsumedAttr>() != rparm->hasAttr<NSConsumedAttr>())
3300 auto *MethodProtocol = dyn_cast<ObjCProtocolDecl>(Method->
getDeclContext());
3301 auto *MethodInListProtocol =
3305 if ((MethodProtocol && !MethodInListProtocol) ||
3306 (!MethodProtocol && MethodInListProtocol))
3309 if (MethodProtocol && MethodInListProtocol)
3315 return MethodInterface == MethodInListInterface;
3324 if (!CD->IsClassExtension() && List->getBits() < 2)
3325 List->setBits(List->getBits() + 1);
3328 if (List->getMethod() ==
nullptr) {
3329 List->setMethod(Method);
3330 List->setNext(
nullptr);
3338 for (; List;
Previous = List, List = List->getNext()) {
3355 if (!SameDeclaration ||
3361 List->setHasMoreThanOneDecl(
true);
3366 !ListWithSameDeclaration && !List->getMethod()->isDeprecated())
3367 ListWithSameDeclaration = List;
3370 !ListWithSameDeclaration &&
3372 ListWithSameDeclaration = List;
3386 List->setHasMoreThanOneDecl(
true);
3393 List->setMethod(Method);
3399 List->setMethod(Method);
3410 if (ListWithSameDeclaration) {
3413 ListWithSameDeclaration->
setMethod(Method);
3414 ListWithSameDeclaration->
setNext(List);
3434void SemaObjC::AddMethodToGlobalPool(
ObjCMethodDecl *Method,
bool impl,
3484 assert(BoundInterface &&
"unexpected object type!");
3488 auto *MethodProtocol = dyn_cast<ObjCProtocolDecl>(Method->
getDeclContext());
3489 if (MethodProtocol) {
3499 return MethodInterface == BoundInterface ||
3500 MethodInterface->isSuperClassOf(BoundInterface) ||
3501 BoundInterface->isSuperClassOf(MethodInterface);
3503 llvm_unreachable(
"unknown method context");
3510 bool InstanceFirst,
bool CheckTheOther,
const ObjCObjectType *TypeBound) {
3514 GlobalMethodPool::iterator Pos =
MethodPool.find(Sel);
3522 if (M->getMethod() && M->getMethod()->isUnconditionallyVisible()) {
3524 Methods.push_back(M->getMethod());
3528 if (!Methods.empty())
3529 return Methods.size() > 1;
3538 if (M->getMethod() && M->getMethod()->isUnconditionallyVisible()) {
3540 Methods.push_back(M->getMethod());
3543 return Methods.size() > 1;
3551 FilteredMethods.push_back(BestMethod);
3553 for (
auto *M : Methods)
3554 if (M != BestMethod && !M->
hasAttr<UnavailableAttr>())
3555 FilteredMethods.push_back(M);
3557 if (FilteredMethods.size() > 1)
3561 GlobalMethodPool::iterator Pos =
MethodPool.find(Sel);
3572 bool receiverIdOrClass,
3577 GlobalMethodPool::iterator Pos =
MethodPool.find(Sel);
3582 ObjCMethodList &MethList = instance ? Pos->second.first : Pos->second.second;
3585 if (M->getMethod() && M->getMethod()->isUnconditionallyVisible())
3586 return M->getMethod();
3593 bool receiverIdOrClass) {
3595 bool issueDiagnostic =
false, issueError =
false;
3599 bool strictSelectorMatch =
3600 receiverIdOrClass &&
3603 if (strictSelectorMatch) {
3604 for (
unsigned I = 1, N = Methods.size(); I != N; ++I) {
3606 issueDiagnostic =
true;
3615 if (!strictSelectorMatch ||
3616 (issueDiagnostic &&
getLangOpts().ObjCAutoRefCount))
3617 for (
unsigned I = 1, N = Methods.size(); I != N; ++I) {
3621 issueDiagnostic =
true;
3628 if (issueDiagnostic) {
3630 Diag(R.
getBegin(), diag::err_arc_multiple_method_decl) << Sel << R;
3631 else if (strictSelectorMatch)
3632 Diag(R.getBegin(), diag::warn_strict_multiple_method_decl) << Sel << R;
3634 Diag(R.getBegin(), diag::warn_multiple_method_decl) << Sel << R;
3636 Diag(Methods[0]->getBeginLoc(),
3637 issueError ? diag::note_possibility : diag::note_using)
3638 << Methods[0]->getSourceRange();
3639 for (
unsigned I = 1, N = Methods.size(); I != N; ++I) {
3640 Diag(Methods[I]->getBeginLoc(), diag::note_also_found)
3641 << Methods[I]->getSourceRange();
3647 GlobalMethodPool::iterator Pos =
MethodPool.find(Sel);
3651 auto &Methods = Pos->second;
3653 Method = Method->getNext())
3654 if (Method->getMethod() &&
3657 return Method->getMethod();
3660 Method = Method->getNext())
3661 if (Method->getMethod() &&
3664 return Method->getMethod();
3672 const unsigned MaxEditDistance = 1;
3673 unsigned BestEditDistance = MaxEditDistance + 1;
3676 unsigned MinPossibleEditDistance =
abs((
int)MethodName.size() - (
int)Typo.size());
3677 if (MinPossibleEditDistance > 0 &&
3678 Typo.size() / MinPossibleEditDistance < 1)
3680 unsigned EditDistance = Typo.edit_distance(MethodName,
true, MaxEditDistance);
3681 if (EditDistance > MaxEditDistance)
3683 if (EditDistance == BestEditDistance)
3684 BestMethod.push_back(Method);
3685 else if (EditDistance < BestEditDistance) {
3687 BestMethod.push_back(Method);
3706 bool ObjectIsId =
true, ObjectIsClass =
true;
3708 ObjectIsId = ObjectIsClass =
false;
3713 ObjectType =
QualType(ObjCPtr->getInterfaceType(), 0);
3714 ObjectIsId = ObjectIsClass =
false;
3717 ObjectIsClass =
false;
3723 for (GlobalMethodPool::iterator
b =
MethodPool.begin(),
3727 if (M->getMethod() &&
3728 (M->getMethod()->getSelector().getNumArgs() == NumArgs) &&
3729 (M->getMethod()->getSelector() != Sel)) {
3731 Methods.push_back(M->getMethod());
3732 else if (!ObjectIsClass &&
3734 SemaRef, M->getMethod()->getSelector(), ObjectType))
3735 Methods.push_back(M->getMethod());
3739 if (M->getMethod() &&
3740 (M->getMethod()->getSelector().getNumArgs() == NumArgs) &&
3741 (M->getMethod()->getSelector() != Sel)) {
3743 Methods.push_back(M->getMethod());
3744 else if (!ObjectIsId &&
3746 SemaRef, M->getMethod()->getSelector(), ObjectType))
3747 Methods.push_back(M->getMethod());
3752 for (
unsigned i = 0, e = Methods.size(); i < e; i++) {
3756 return (SelectedMethods.size() == 1) ? SelectedMethods[0] :
nullptr;
3766 for (
auto *Ivar : ID->ivars()) {
3767 if (Ivar->isInvalidDecl())
3772 Diag(Ivar->getLocation(), diag::err_duplicate_member) << II;
3774 Ivar->setInvalidDecl();
3784 for (
auto ivar = ID->getClassInterface()->all_declared_ivar_begin();
3785 ivar; ivar = ivar->getNextIvar()) {
3786 if (ivar->isInvalidDecl())
continue;
3789 S.
Diag(ivar->getLocation(), diag::err_arc_weak_disabled);
3791 S.
Diag(ivar->getLocation(), diag::err_arc_weak_no_runtime);
3803 for (
auto ivar = ID->all_declared_ivar_begin(); ivar;
3804 ivar = ivar->getNextIvar()) {
3805 if (ivar->isInvalidDecl())
3811 S.
Diag(ivar->getLocation(), diag::err_flexible_array_arc_retainable);
3812 ivar->setInvalidDecl();
3819 case Decl::ObjCInterface:
3821 case Decl::ObjCProtocol:
3823 case Decl::ObjCCategory:
3827 case Decl::ObjCImplementation:
3829 case Decl::ObjCCategoryImpl:
3841 return (RecordTy && RecordTy->getDecl()->hasFlexibleArrayMember());
3848 if ((IntfDecl = dyn_cast<ObjCInterfaceDecl>(OCD))) {
3849 Ivars = IntfDecl->
ivars();
3850 }
else if (
auto *ImplDecl = dyn_cast<ObjCImplementationDecl>(OCD)) {
3851 IntfDecl = ImplDecl->getClassInterface();
3852 Ivars = ImplDecl->
ivars();
3853 }
else if (
auto *CategoryDecl = dyn_cast<ObjCCategoryDecl>(OCD)) {
3854 if (CategoryDecl->IsClassExtension()) {
3855 IntfDecl = CategoryDecl->getClassInterface();
3856 Ivars = CategoryDecl->
ivars();
3861 if (!isa<ObjCInterfaceDecl>(OCD)) {
3862 for (
auto *ivar : Ivars) {
3864 S.
Diag(ivar->getLocation(), diag::warn_variable_sized_ivar_visibility)
3865 << ivar->getDeclName() << ivar->getType();
3877 if (ivar->isInvalidDecl() || !ivar->getNextIvar())
3880 bool IsInvalidIvar =
false;
3882 S.
Diag(ivar->getLocation(), diag::err_flexible_array_not_at_end)
3883 << ivar->getDeclName() << IvarTy
3885 IsInvalidIvar =
true;
3887 if (RecordTy->getDecl()->hasFlexibleArrayMember()) {
3888 S.
Diag(ivar->getLocation(),
3889 diag::err_objc_variable_sized_type_not_at_end)
3890 << ivar->getDeclName() << IvarTy;
3891 IsInvalidIvar =
true;
3894 if (IsInvalidIvar) {
3895 S.
Diag(ivar->getNextIvar()->getLocation(),
3896 diag::note_next_ivar_declaration)
3897 << ivar->getNextIvar()->getSynthesize();
3898 ivar->setInvalidDecl();
3906 (Ivars.begin() == Ivars.end()) ?
nullptr : *Ivars.begin();
3909 while (SuperClass && SuperClass->
ivar_empty())
3913 std::advance(IvarIter, SuperClass->
ivar_size() - 1);
3917 diag::warn_superclass_variable_sized_type_not_at_end)
3932 const llvm::iterator_range<ObjCProtocolList::iterator> &Protocols) {
3933 for (
auto *PI : Protocols)
3944 for (
auto *MD : PDecl->
methods()) {
3945 if (!MD->isPropertyAccessor()) {
3946 if (
const auto *CMD =
3947 IDecl->getMethod(MD->getSelector(), MD->isInstanceMethod())) {
3948 if (CMD->isDirectMethod())
3949 DirectMembers.push_back(CMD);
3954 if (
const auto *CPD = IDecl->FindPropertyVisibleInPrimaryClass(
3955 PD->getIdentifier(),
3956 PD->isClassProperty()
3959 if (CPD->isDirectProperty())
3960 DirectMembers.push_back(CPD);
3963 if (!DirectMembers.empty()) {
3964 S.
Diag(CDecl->
getLocation(), diag::err_objc_direct_protocol_conformance)
3966 for (
const auto *MD : DirectMembers)
3967 S.
Diag(MD->getLocation(), diag::note_direct_member_here);
3984 assert(AtEnd.
isValid() &&
"Invalid location for '@end'");
3987 Decl *ClassDecl = OCD;
3989 bool isInterfaceDeclKind =
3990 isa<ObjCInterfaceDecl>(ClassDecl) || isa<ObjCCategoryDecl>(ClassDecl)
3991 || isa<ObjCProtocolDecl>(ClassDecl);
3992 bool checkIdenticalMethods = isa<ObjCImplementationDecl>(ClassDecl);
3999 for (
auto *PropImpl : OID->property_impls()) {
4000 if (
auto *Getter = PropImpl->getGetterMethodDecl())
4001 if (Getter->isSynthesizedAccessorStub())
4002 OID->addDecl(Getter);
4003 if (
auto *Setter = PropImpl->getSetterMethodDecl())
4004 if (Setter->isSynthesizedAccessorStub())
4005 OID->addDecl(Setter);
4010 llvm::DenseMap<Selector, const ObjCMethodDecl*> InsMap;
4011 llvm::DenseMap<Selector, const ObjCMethodDecl*> ClsMap;
4013 for (
unsigned i = 0, e = allMethods.size(); i != e; i++ ) {
4015 cast_or_null<ObjCMethodDecl>(allMethods[i]);
4017 if (!Method)
continue;
4023 if ((isInterfaceDeclKind && PrevMethod && !
match)
4024 || (checkIdenticalMethods &&
match)) {
4047 if ((isInterfaceDeclKind && PrevMethod && !
match)
4048 || (checkIdenticalMethods &&
match)) {
4067 if (isa<ObjCInterfaceDecl>(ClassDecl)) {
4074 if (
C->IsClassExtension()) {
4083 if (CDecl->getIdentifier())
4087 for (
auto *I : CDecl->properties())
4089 CDecl->setAtEndRange(AtEnd);
4092 IC->setAtEndRange(AtEnd);
4099 for (
const auto *Ext : IDecl->visible_extensions()) {
4100 for (
const auto *
Property : Ext->instance_properties()) {
4103 = IC->FindPropertyImplDecl(
Property->getIdentifier(),
4105 if (PIDecl->getPropertyImplementation()
4109 for (
const auto *Ext : IDecl->visible_extensions()) {
4111 Ext->getInstanceMethod(
Property->getGetterName()))
4112 GetterMethod->setPropertyAccessor(
true);
4115 = Ext->getInstanceMethod(
Property->getSetterName()))
4116 SetterMethod->setPropertyAccessor(
true);
4124 if (IDecl->hasDesignatedInitializers())
4129 bool HasRootClassAttr = IDecl->hasAttr<ObjCRootClassAttr>();
4130 if (IDecl->getSuperClass() ==
nullptr) {
4133 if (!HasRootClassAttr) {
4136 Diag(DeclLoc, diag::warn_objc_root_class_missing)
4137 << IDecl->getIdentifier();
4145 Diag(SuperClassLoc, diag::note_objc_needs_superclass)
4148 Diag(SuperClassLoc, diag::note_objc_needs_superclass);
4151 }
else if (HasRootClassAttr) {
4153 Diag(IDecl->getLocation(), diag::err_objc_root_class_subclass);
4161 if (IDecl->hasAttr<ObjCSubclassingRestrictedAttr>() &&
4162 Super->hasAttr<ObjCSubclassingRestrictedAttr>()) {
4163 Diag(IC->getLocation(), diag::err_restricted_superclass_mismatch);
4164 Diag(Super->getLocation(), diag::note_class_declared);
4168 if (IDecl->hasAttr<ObjCClassStubAttr>())
4169 Diag(IC->getLocation(), diag::err_implementation_of_class_stub);
4172 while (IDecl->getSuperClass()) {
4174 IDecl = IDecl->getSuperClass();
4180 dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) {
4181 CatImplClass->setAtEndRange(AtEnd);
4187 = IDecl->FindCategoryDeclaration(CatImplClass->getIdentifier())) {
4191 }
else if (
const auto *IntfDecl = dyn_cast<ObjCInterfaceDecl>(ClassDecl)) {
4193 if (!IntfDecl->hasAttr<ObjCSubclassingRestrictedAttr>() &&
4194 Super->hasAttr<ObjCSubclassingRestrictedAttr>()) {
4195 Diag(IntfDecl->getLocation(), diag::err_restricted_superclass_mismatch);
4196 Diag(Super->getLocation(), diag::note_class_declared);
4200 if (IntfDecl->hasAttr<ObjCClassStubAttr>() &&
4201 !IntfDecl->hasAttr<ObjCSubclassingRestrictedAttr>())
4202 Diag(IntfDecl->getLocation(), diag::err_class_stub_subclassing_mismatch);
4205 if (isInterfaceDeclKind) {
4207 for (
unsigned i = 0, e = allTUVars.size(); i != e; i++) {
4210 if (
VarDecl *VDecl = dyn_cast<VarDecl>(*I)) {
4211 if (!VDecl->hasExternalStorage())
4212 Diag(VDecl->getLocation(), diag::err_objc_var_decl_inclass);
4218 for (
unsigned i = 0, e = allTUVars.size(); i != e; i++) {
4221 (*I)->setTopLevelDeclInObjCContainer();
4250 if (ResultObjectType->isObjCIdType() ||
4251 ResultObjectType->isObjCQualifiedIdType())
4256 = ResultObjectType->getInterfaceDecl()) {
4262 if (ResultClass->isSuperClassOf(CurrentClass))
4278class OverrideSearch {
4290 SemaObjC::GlobalMethodPool::iterator it =
4311 dyn_cast<ObjCCategoryDecl>(container)) {
4312 searchFromContainer(container);
4316 searchFromContainer(container);
4320 typedef decltype(Overridden)::iterator iterator;
4321 iterator begin()
const {
return Overridden.begin(); }
4322 iterator end()
const {
return Overridden.end(); }
4329#define OBJCCONTAINER(type, base) \
4331 searchFrom(cast<type##Decl>(container)); \
4333#define ABSTRACT_DECL(expansion)
4334#define DECL(type, base) \
4336#include "clang/AST/DeclNodes.inc"
4337 llvm_unreachable(
"not an ObjC container!");
4397 for (
const auto *Proto : protocols)
4409 Overridden.insert(meth);
4419 searchFromContainer(container);
4427 const auto *
attr = overridden->
getAttr<ObjCDirectAttr>();
4429 Diag(
attr->getLocation(), diag::note_previous_declaration);
4431 const auto *
attr = method->
getAttr<ObjCDirectAttr>();
4432 Diag(
attr->getLocation(), diag::err_objc_direct_on_override)
4444 auto IsMethodInCurrentClass = [CurrentClass](
const ObjCMethodDecl *M) {
4446 return M->getClassInterface()->getCanonicalDecl() ==
4450 OverrideSearch overrides(
SemaRef, ObjCMethod);
4456 bool hasOverriddenMethodsInBaseOrProtocol =
false;
4458 if (!hasOverriddenMethodsInBaseOrProtocol) {
4459 if (isa<ObjCProtocolDecl>(overridden->getDeclContext()) ||
4460 !IsMethodInCurrentClass(overridden) || overridden->isOverriding()) {
4462 hasOverriddenMethodsInBaseOrProtocol =
true;
4471 GlobalMethodPool::iterator It =
4476 unsigned CategCount = List.getBits();
4477 if (CategCount > 0) {
4480 if (CategCount > 1 ||
4481 !isa<ObjCCategoryImplDecl>(overridden->getDeclContext())) {
4482 OverrideSearch overrides(
SemaRef, overridden);
4484 if (isa<ObjCProtocolDecl>(SuperOverridden->getDeclContext()) ||
4485 !IsMethodInCurrentClass(SuperOverridden)) {
4487 hasOverriddenMethodsInBaseOrProtocol =
true;
4488 overridden->setOverriding(
true);
4505 if (ObjCMethod->
isImplicit() && overridden->isImplicit())
4512 isa<ObjCProtocolDecl>(overridden->getDeclContext()));
4514 if (CurrentClass && overridden->
getDeclContext() != CurrentClass &&
4515 isa<ObjCInterfaceDecl>(overridden->getDeclContext()) &&
4520 PrevE = overridden->param_end();
4521 for (; ParamI !=
E && PrevI != PrevE; ++ParamI, ++PrevI) {
4522 assert(PrevI != overridden->param_end() &&
"Param mismatch");
4528 Diag((*ParamI)->getLocation(), diag::ext_typecheck_base_super)
4530 Diag(overridden->getLocation(), diag::note_previous_declaration);
4537 ObjCMethod->
setOverriding(hasOverriddenMethodsInBaseOrProtocol);
4547 bool prevUsesCSKeyword) {
4549 auto nullability =
type->getNullability();
4553 if (nullability.has_value() == prevNullability.has_value()) {
4559 if (*nullability == *prevNullability)
4563 S.
Diag(loc, diag::err_nullability_conflicting)
4584 if (prevMethod->
hasAttr<ObjCRequiresSuperAttr>() &&
4585 !method->
hasAttr<ObjCRequiresSuperAttr>()) {
4588 ObjCRequiresSuperAttr::CreateImplicit(S.
Context,
4605 unsigned numPrevParams = prevMethod->
param_size();
4606 for (
unsigned i = 0, n = std::min(numParams, numPrevParams); i != n; ++i) {
4626 llvm::Triple::x86 &&
4627 "x86-specific check invoked for a different target");
4631 if (
P->getType()->isVectorType()) {
4632 Loc =
P->getBeginLoc();
4648 VersionTuple AcceptedInVersion;
4649 if (Triple.getOS() == llvm::Triple::IOS)
4650 AcceptedInVersion = VersionTuple(9);
4651 else if (Triple.isMacOSX())
4652 AcceptedInVersion = VersionTuple(10, 11);
4658 SemaRef.
Diag(
Loc, diag::err_objc_method_unsupported_param_ret_type)
4661 << (Triple.isMacOSX() ?
"macOS 10.11" :
"iOS 9");
4666 CD->
hasAttr<ObjCDirectMembersAttr>()) {
4677 bool diagnosed =
false;
4680 if (diagnosed || IMD->isImplicit())
4686 S.
Diag(IMD->getLocation(), diag::note_previous_declaration);
4704 if (
auto *IMD = IDecl->
getMethod(Sel, isInstance))
4707 if (Impl != ImpDecl)
4712 if (
auto *IMD = Cat->getMethod(Sel, isInstance))
4714 else if (
auto CatImpl = Cat->getImplementation())
4715 if (CatImpl != ImpDecl)
4716 if (
auto *IMD = Cat->getMethod(Sel, isInstance))
4723 bool MethodDefinition) {
4728 if (!ArgInfo.
Type) {
4740 if (S->isDeclScope(PrevDecl)) {
4742 (MethodDefinition ? diag::warn_method_param_redefinition
4743 : diag::warn_method_param_declaration))
4764 if (Param->
hasAttr<BlocksAttr>()) {
4783 bool isVariadic,
bool MethodDefinition) {
4787 Diag(MethodLoc, diag::err_missing_method_context);
4794 bool HasRelatedResultType =
false;
4802 QualType bareResultType = resultDeclType;
4807 Diag(MethodLoc, diag::warn_missing_method_return_type)
4812 Context, MethodLoc, EndLoc, Sel, resultDeclType, ReturnTInfo,
4816 MethodDeclKind == tok::objc_optional
4819 HasRelatedResultType);
4822 for (
unsigned I = 0; I < Sel.
getNumArgs(); ++I) {
4826 Params.push_back(Param);
4829 for (
unsigned i = 0, e = CNumArgs; i != e; ++i) {
4830 ParmVarDecl *Param = cast<ParmVarDecl>(CParamInfo[i].Param);
4839 Params.push_back(Param);
4852 if (
ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(ClassDecl)) {
4853 if (MethodType == tok::minus) {
4854 PrevMethod = ImpDecl->getInstanceMethod(Sel);
4855 ImpDecl->addInstanceMethod(ObjCMethod);
4857 PrevMethod = ImpDecl->getClassMethod(Sel);
4858 ImpDecl->addClassMethod(ObjCMethod);
4867 if (
auto *Setter = PropertyImpl->getSetterMethodDecl())
4868 if (Setter->getSelector() == Sel &&
4870 assert(Setter->isSynthesizedAccessorStub() &&
"autosynth stub expected");
4871 PropertyImpl->setSetterMethodDecl(ObjCMethod);
4873 if (
auto *Getter = PropertyImpl->getGetterMethodDecl())
4874 if (Getter->getSelector() == Sel &&
4876 assert(Getter->isSynthesizedAccessorStub() &&
"autosynth stub expected");
4877 PropertyImpl->setGetterMethodDecl(ObjCMethod);
4891 const auto *
attr = CanonicalMD->
getAttr<ObjCDirectAttr>();
4893 ObjCDirectAttr::CreateImplicit(Context,
attr->getLocation()));
4900 if (
auto *IMD = IDecl->lookupMethod(ObjCMethod->
getSelector(),
4920 if (IDecl == IMD->getClassInterface()) {
4921 auto diagContainerMismatch = [&] {
4922 int decl = 0, impl = 0;
4924 if (
auto *Cat = dyn_cast<ObjCCategoryDecl>(IMD->getDeclContext()))
4925 decl = Cat->IsClassExtension() ? 1 : 2;
4927 if (isa<ObjCCategoryImplDecl>(ImpDecl))
4928 impl = 1 + (
decl != 0);
4931 diag::err_objc_direct_impl_decl_mismatch)
4933 Diag(IMD->getLocation(), diag::note_previous_declaration);
4937 const auto *
attr = ObjCMethod->
getAttr<ObjCDirectAttr>();
4939 diagContainerMismatch();
4940 }
else if (!IMD->isDirectMethod()) {
4941 Diag(
attr->getLocation(), diag::err_objc_direct_missing_on_decl);
4942 Diag(IMD->getLocation(), diag::note_previous_declaration);
4944 }
else if (IMD->isDirectMethod()) {
4945 const auto *
attr = IMD->getAttr<ObjCDirectAttr>();
4947 diagContainerMismatch();
4950 ObjCDirectAttr::CreateImplicit(Context,
attr->getLocation()));
4956 if (isa<ObjCCategoryImplDecl>(ImpDecl) && IMD->isOverriding() &&
4969 for (
auto *
C : IDecl->visible_categories())
4970 for (
auto &
P :
C->protocols())
4971 if (
auto *IMD =
P->lookupMethod(ObjCMethod->
getSelector(),
4974 IMD->parameters().size() &&
4975 "Methods have different number of parameters");
4976 auto OI = IMD->param_begin(), OE = IMD->param_end();
4978 for (; OI != OE; ++OI, ++NI)
4983 if (!isa<ObjCProtocolDecl>(ClassDecl)) {
4988 IDecl = cast<ObjCCategoryDecl>(ClassDecl)->getClassInterface();
4996 cast<DeclContext>(ClassDecl)->addDecl(ObjCMethod);
5012 if (!CurrentClass) {
5014 CurrentClass = Cat->getClassInterface();
5015 else if (
ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(ClassDecl))
5016 CurrentClass = Impl->getClassInterface();
5018 = dyn_cast<ObjCCategoryImplDecl>(ClassDecl))
5019 CurrentClass = CatImpl->getClassInterface();
5027 bool ARCError =
false;
5035 bool InferRelatedResultType =
false;
5061 if (InferRelatedResultType &&
5066 if (MethodDefinition &&
5072 if (
const auto *
attr = ObjCMethod->
getAttr<AvailabilityAttr>()) {
5075 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
5077 ObjCMethod->
dropAttr<AvailabilityAttr>();
5097 if (isa<TranslationUnitDecl>(
5101 Diag(
D->
getLocation(), diag::err_objc_decls_may_only_appear_in_global_scope);
5116 Diag(DeclStart, diag::err_undef_interface) << ClassName;
5120 Diag(DeclStart, diag::err_atdef_nonfragile_interface);
5128 for (
unsigned i = 0; i < Ivars.size(); i++) {
5134 ID->getIdentifier(), ID->getType(),
5136 Decls.push_back(FD);
5141 D != Decls.end(); ++
D) {
5162 Diag(IdLoc, diag::err_arg_with_address_space);
5174 Diag(IdLoc, diag::err_illegal_qualifiers_on_catch_parm);
5179 Diag(IdLoc, diag::err_catch_param_not_objc_type);
5182 Diag(IdLoc, diag::err_catch_param_not_objc_type);
5213 if (
DeclSpec::TSCS TSCS =
D.getDeclSpec().getThreadStorageClassSpec())
5214 Diag(
D.getDeclSpec().getThreadStorageClassSpecLoc(),
5215 diag::err_invalid_thread)
5217 D.getMutableDeclSpec().ClearStorageClassSpecs();
5231 D.getIdentifierLoc(),
5236 if (
D.getCXXScopeSpec().isSet()) {
5237 Diag(
D.getIdentifierLoc(), diag::err_qualified_objc_catch_parm)
5238 <<
D.getCXXScopeSpec().getRange();
5244 if (
D.getIdentifier())
5249 if (New->
hasAttr<BlocksAttr>())
5263 Ivars.push_back(Iv);
5273 for (
unsigned I = 0, N = Sels.size(); I != N; ++I)
5284 Selector Sel = SelectorAndLocation.first;
5287 Diag(
Loc, diag::warn_unimplemented_selector) << Sel;
5310 IV->getIdentifier());
5325 bool InvokedSelfMethod;
5329 : S(S), Method(Method), IvarD(IvarD), AccessedIvar(
false),
5330 InvokedSelfMethod(
false) {
5335 if (
E->getDecl() == IvarD) {
5336 AccessedIvar =
true;
5345 InvokedSelfMethod =
true;
5354 if (S->hasUnrecoverableErrorOccurred())
5358 unsigned DIAG = diag::warn_unused_property_backing_ivar;
5368 if (CurMethod->isSynthesizedAccessorStub())
5371 UnusedBackingIvarChecker Checker(
SemaRef, CurMethod, IV);
5372 Checker.TraverseStmt(CurMethod->getBody());
5373 if (Checker.AccessedIvar)
5380 if (!IV->
isReferenced() || !Checker.InvokedSelfMethod) {
5401 if (!
T.isConstQualified()) {
5405 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
5407 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
5421 bool DoTypoCorrection) {
5427 if (!IDecl && DoTypoCorrection) {
5452 unsigned kind = -1U;
5454 if (var->hasAttr<BlocksAttr>())
5456 else if (!var->hasLocalStorage())
5458 }
else if (isa<ObjCIvarDecl>(
decl)) {
5460 }
else if (isa<FieldDecl>(
decl)) {
5465 Diag(
decl->getLocation(), diag::err_arc_autoreleasing_var) << kind;
5469 if (!
type->isObjCLifetimeType())
5472 lifetime =
type->getObjCARCImplicitLifetime();
5480 var->getTLSKind()) {
5481 Diag(var->getLocation(), diag::err_arc_thread_ownership)
5504 for (
unsigned i = 0; i < ivars.size(); i++) {
5506 if (Field->isInvalidDecl())
5516 InitSeq.Perform(
SemaRef, InitEntity, InitKind, {});
5520 if (!MemberInit.get() || MemberInit.isInvalid())
5526 AllToInit.push_back(
Member);
5531 ->getAs<RecordType>()) {
5532 CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
5537 PDiag(diag::err_access_dtor_ivar)
5551 switch (ivarVisibility) {
5553 llvm_unreachable(
"Unknown visitibility kind");
5554 case tok::objc_private:
5556 case tok::objc_public:
5558 case tok::objc_protected:
5560 case tok::objc_package:
5573 Loc =
D.getIdentifierLoc();
5594 Diag(
Loc, diag::err_ivar_reference_type);
5601 TInfo,
T,
Loc, diag::err_typecheck_ivar_variable_size))
5616 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
5620 EnclosingContext = IMPDecl->getClassInterface();
5621 assert(EnclosingContext &&
"Implementation has no class interface!");
5623 EnclosingContext = EnclosingDecl;
5627 Diag(
Loc, diag::err_misplaced_ivar) << CDecl->IsClassExtension();
5631 EnclosingContext = EnclosingDecl;
5637 II,
T, TInfo, ac, BitWidth);
5645 RedeclarationKind::ForVisibleRedeclaration);
5647 !isa<TagDecl>(PrevDecl)) {
5648 Diag(
Loc, diag::err_duplicate_member) << II;
5657 if (
D.isInvalidType())
5664 if (
D.getDeclSpec().isModulePrivateSpecified())
5675 isa<ObjCInterfaceDecl>(EnclosingDecl))
5676 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()
TranslationUnitDecl * getTranslationUnitDecl() 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.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
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 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.
Recursive AST visitor that supports extension via dynamic dispatch.
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...
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 setMethodParams(ASTContext &C, ArrayRef< ParmVarDecl * > Params, ArrayRef< SourceLocation > SelLocs={})
Sets the method's parameters and selector source locations.
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
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...
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
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.
ParmVarDecl * ActOnMethodParmDeclaration(Scope *S, ObjCArgInfo &ArgInfo, int ParamIndex, bool MethodDefinition)
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,...
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,...
Decl * ActOnMethodDeclaration(Scope *S, SourceLocation BeginLoc, SourceLocation EndLoc, tok::TokenKind MethodType, ObjCDeclSpec &ReturnQT, ParsedType ReturnType, ArrayRef< SourceLocation > SelectorLocs, Selector Sel, ParmVarDecl **ArgInfo, DeclaratorChunk::ParamInfo *CParamInfo, unsigned CNumArgs, const ParsedAttributesView &AttrList, tok::ObjCKeywordKind MethodImplKind, bool isVariadic, bool MethodDefinition)
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)
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()
Decl * ActOnAtEnd(Scope *S, SourceRange AtEnd, ArrayRef< Decl * > allMethods={}, ArrayRef< DeclGroupPtrTy > allTUVars={})
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.