30#include "llvm/ADT/DenseMap.h"
31#include "llvm/ADT/DenseSet.h"
58 if (result->isObjCId()) {
60 }
else if (result->isObjCClass()) {
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() &&
104 SemaRef.getSourceManager().isInSystemHeader(loc)) {
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)
169 << Context.getObjCInterfaceType(CurrentClass)
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);
246 if (!Context.hasSameType(method->
getReturnType(), Context.VoidTy)) {
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(),
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)
354 T = PT->getPointeeType();
356 T = RT->getPointeeType();
363 return !
T.getLocalQualifiers().hasObjCLifetime();
370 SemaRef.ImplicitlyRetainedSelfLocs.clear();
371 assert((
SemaRef.getCurMethodDecl() ==
nullptr) &&
"Methodparsing confused");
374 SemaRef.PushExpressionEvaluationContext(
375 SemaRef.ExprEvalContexts.back().Context);
385 diag::err_func_def_incomplete_result))
389 SemaRef.PushDeclContext(FnBodyScope, MDecl);
407 if (!Param->isInvalidDecl() &&
getLangOpts().ObjCAutoRefCount &&
409 Diag(Param->getLocation(), diag::warn_arc_strong_pointer_objc_pointer) <<
412 if (Param->getIdentifier())
413 SemaRef.PushOnScopeChains(Param, FnBodyScope);
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)
471 SemaRef.getCurFunction()->ObjCIsDesignatedInit =
true;
472 SemaRef.getCurFunction()->ObjCWarnForNoDesignatedInitChain =
473 IC->getSuperClass() !=
nullptr;
474 }
else if (IC->hasDesignatedInitializers()) {
475 SemaRef.getCurFunction()->ObjCIsSecondaryInit =
true;
476 SemaRef.getCurFunction()->ObjCWarnForNoInitDelegation =
true;
489 SemaRef.getCurFunction()->ObjCShouldCallSuper =
true;
493 SemaRef.getCurFunction()->ObjCShouldCallSuper =
true;
499 SemaRef.getCurFunction()->ObjCShouldCallSuper =
500 (SuperMethod && SuperMethod->
hasAttr<ObjCRequiresSuperAttr>());
507 SemaRef.applyFunctionAttributesBeforeParsingBody(D);
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);
531 ObjCInterfaceDecl *CurrentIDecl;
539 unsigned NumProtoRefs,
544 for (
unsigned i = 0; i < NumProtoRefs; ++i) {
565 ObjCInterfaceValidatorCCC CCC(IDecl);
569 SemaRef.diagnoseTypo(Corrected,
PDiag(diag::err_undef_superclass_suggest)
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) {
586 (void)
SemaRef.DiagnoseUseOfDecl(SuperClassDecl, SuperLoc);
587 SuperClassType = Context.getObjCInterfaceType(SuperClassDecl);
590 if (PrevDecl && !SuperClassDecl) {
594 dyn_cast_or_null<TypedefNameDecl>(PrevDecl)) {
596 if (
T->isObjCObjectType()) {
598 SuperClassDecl = dyn_cast<ObjCInterfaceDecl>(IDecl);
599 SuperClassType = Context.getTypeDeclType(
606 (void)
SemaRef.DiagnoseUseOfDecl(
617 if (!SuperClassDecl) {
618 Diag(SuperLoc, diag::err_redefinition_different_kind) << SuperName;
623 if (!isa_and_nonnull<TypedefNameDecl>(PrevDecl)) {
625 Diag(SuperLoc, diag::err_undef_superclass)
626 << SuperName << ClassName <<
SourceRange(AtInterfaceLoc, ClassLoc);
627 else if (
SemaRef.RequireCompleteType(
628 SuperLoc, SuperClassType, diag::err_forward_superclass,
631 SuperClassDecl =
nullptr;
636 if (SuperClassType.
isNull()) {
637 assert(!SuperClassDecl &&
"Failed to set SuperClassType?");
643 if (!SuperTypeArgs.empty()) {
645 S, SuperLoc,
SemaRef.CreateParsedType(SuperClassType,
nullptr),
646 SuperTypeArgsRange.
getBegin(), SuperTypeArgs,
653 SemaRef.GetTypeFromParser(fullSuperClassType.
get(), &SuperClassTInfo);
656 if (!SuperClassTInfo) {
657 SuperClassTInfo = Context.getTrivialTypeSourceInfo(SuperClassType,
674 if (parsedTypeBound) {
677 SemaRef.GetTypeFromParser(parsedTypeBound, &typeBoundInfo);
686 diag::err_objc_type_param_bound_missing_pointer)
687 << typeBound << paramName
696 typeBound = Context.getObjCObjectPointerType(typeBound);
706 diag::err_objc_type_param_bound_nonobject)
707 << typeBound << paramName;
710 typeBoundInfo =
nullptr;
719 bool diagnosed =
false;
723 rangeToRemove =
attr.getLocalSourceRange();
724 if (
attr.getTypePtr()->getImmediateNullability()) {
726 diag::err_objc_type_param_bound_explicit_nullability)
727 << paramName << typeBound
737 diag::err_objc_type_param_bound_qualified)
738 << paramName << typeBound
748 if (!quals.
empty()) {
758 if (!typeBoundInfo) {
760 typeBoundInfo = Context.getTrivialTypeSourceInfo(Context.getObjCIdType());
765 varianceLoc,
index, paramLoc, paramName,
766 colonLoc, typeBoundInfo);
778 typeParamsIn.size());
784 llvm::SmallDenseMap<IdentifierInfo *, ObjCTypeParamDecl *> knownParams;
785 for (
auto *typeParam : typeParams) {
786 auto known = knownParams.find(typeParam->getIdentifier());
787 if (known != knownParams.end()) {
788 Diag(typeParam->getLocation(), diag::err_objc_type_param_redecl)
789 << typeParam->getIdentifier()
792 typeParam->setInvalidDecl();
794 knownParams.insert(std::make_pair(typeParam->getIdentifier(), typeParam));
797 SemaRef.PushOnScopeChains(typeParam, S,
false);
807 for (
auto *typeParam : *typeParamList) {
808 if (!typeParam->isInvalidDecl()) {
810 SemaRef.IdResolver.RemoveDecl(typeParam);
818 enum class TypeParamListContext {
832 TypeParamListContext newContext) {
834 if (prevTypeParams->
size() != newTypeParams->
size()) {
836 if (newTypeParams->
size() > prevTypeParams->
size()) {
837 diagLoc = newTypeParams->
begin()[prevTypeParams->
size()]->getLocation();
842 S.
Diag(diagLoc, diag::err_objc_type_param_arity_mismatch)
843 <<
static_cast<unsigned>(newContext)
844 << (newTypeParams->
size() > prevTypeParams->
size())
845 << prevTypeParams->
size()
846 << newTypeParams->
size();
852 for (
unsigned i = 0, n = prevTypeParams->
size(); i != n; ++i) {
859 newContext != TypeParamListContext::Definition) {
879 diag::err_objc_type_param_variance_conflict)
880 <<
static_cast<unsigned>(newTypeParam->
getVariance())
882 <<
static_cast<unsigned>(prevTypeParam->
getVariance())
891 StringRef newVarianceStr
898 (newVarianceStr +
" ").str());
925 S.
Diag(newBoundRange.
getBegin(), diag::err_objc_type_param_bound_conflict)
949 if (newContext == TypeParamListContext::ForwardDeclaration ||
950 newContext == TypeParamListContext::Definition) {
958 diag::err_objc_type_param_bound_missing)
961 << (newContext == TypeParamListContext::ForwardDeclaration)
980 Decl *
const *ProtoRefs,
unsigned NumProtoRefs,
983 assert(ClassName &&
"Missing class identifier");
989 SemaRef.forRedeclarationInCurContext());
992 Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
1019 if (typeParamList) {
1023 TypeParamListContext::Definition)) {
1024 typeParamList =
nullptr;
1027 Diag(ClassLoc, diag::err_objc_parameterized_forward_class_first)
1029 Diag(prevTypeParamList->getLAngleLoc(), diag::note_previous_decl)
1034 for (
auto *typeParam : *prevTypeParamList) {
1036 Context,
SemaRef.CurContext, typeParam->getVariance(),
1039 Context.getTrivialTypeSourceInfo(
1040 typeParam->getUnderlyingType())));
1053 ClassName, typeParamList, PrevIDecl, ClassLoc);
1057 if (SkipBody && !
SemaRef.hasVisibleDefinition(Def)) {
1059 SkipBody->
New = IDecl;
1062 Diag(AtInterfaceLoc, diag::err_duplicate_class_def)
1064 Diag(Def->getLocation(), diag::note_previous_definition);
1070 SemaRef.ProcessDeclAttributeList(
SemaRef.TUScope, IDecl, AttrList);
1072 SemaRef.ProcessAPINotes(IDecl);
1076 SemaRef.mergeDeclAttributes(IDecl, PrevIDecl);
1092 ClassName, ClassLoc,
1093 SuperName, SuperLoc, SuperTypeArgs,
1094 SuperTypeArgsRange);
1102 NumProtoRefs, ProtoLocs);
1104 ProtoLocs, Context);
1127 if (
const TypedefNameDecl *TDecl = dyn_cast_or_null<TypedefNameDecl>(IDecl)) {
1128 QualType T = TDecl->getUnderlyingType();
1129 if (
T->isObjCObjectType())
1131 ProtocolRefs.append(OPT->qual_begin(), OPT->qual_end());
1136 ProtocolLocs.append(OPT->getNumProtocols(), SuperLoc);
1152 SemaRef.forRedeclarationInCurContext());
1154 Diag(AliasLocation, diag::err_conflicting_aliasing_type) << AliasName;
1161 SemaRef.forRedeclarationInCurContext());
1163 dyn_cast_or_null<TypedefNameDecl>(CDeclU)) {
1164 QualType T = TDecl->getUnderlyingType();
1165 if (
T->isObjCObjectType()) {
1167 ClassName = IDecl->getIdentifier();
1168 CDeclU =
SemaRef.LookupSingleName(
1170 SemaRef.forRedeclarationInCurContext());
1176 Diag(ClassLocation, diag::warn_undef_interface) << ClassName;
1184 Context,
SemaRef.CurContext, AtLoc, AliasName, CDecl);
1198 E = PList.
end(); I != E; ++I) {
1200 if (PDecl->getIdentifier() == PName) {
1201 Diag(Ploc, diag::err_protocol_has_circular_dependency);
1202 Diag(PrevLoc, diag::note_previous_definition);
1206 if (!PDecl->hasDefinition())
1210 PDecl->getLocation(), PDecl->getReferencedProtocols()))
1225 assert(ProtocolName &&
"Missing protocol identifier");
1227 ProtocolName, ProtocolLoc,
SemaRef.forRedeclarationInCurContext());
1235 ProtocolLoc, AtProtoInterfaceLoc,
1238 if (SkipBody && !
SemaRef.hasVisibleDefinition(Def)) {
1240 SkipBody->
New = PDecl;
1244 Diag(ProtocolLoc, diag::warn_duplicate_protocol_def) << ProtocolName;
1245 Diag(Def->getLocation(), diag::note_previous_definition);
1260 ProtocolName, ProtocolLoc, PrevDecl->
getLocation(), PList);
1265 ProtocolLoc, AtProtoInterfaceLoc,
1272 SemaRef.ProcessDeclAttributeList(
SemaRef.TUScope, PDecl, AttrList);
1274 SemaRef.ProcessAPINotes(PDecl);
1278 SemaRef.mergeDeclAttributes(PDecl, PrevDecl);
1280 if (!err && NumProtoRefs ) {
1283 NumProtoRefs, ProtoLocs);
1285 ProtoLocs, Context);
1297 UndefinedProtocol = PDecl;
1303 UndefinedProtocol = PI;
1313 bool ForObjCContainer,
1326 SemaRef.diagnoseTypo(Corrected,
1327 PDiag(diag::err_undeclared_protocol_suggest)
1328 << Pair.getIdentifierInfo());
1332 Diag(Pair.getLoc(), diag::err_undeclared_protocol)
1333 << Pair.getIdentifierInfo();
1342 if (!ForObjCContainer) {
1343 (void)
SemaRef.DiagnoseUseOfDecl(PDecl, Pair.getLoc());
1351 if (WarnOnDeclarations &&
1353 Diag(Pair.getLoc(), diag::warn_undef_protocolref)
1354 << Pair.getIdentifierInfo();
1355 Diag(UndefinedProtocol->
getLocation(), diag::note_protocol_decl_undefined)
1356 << UndefinedProtocol;
1358 Protocols.push_back(PDecl);
1365class ObjCTypeArgOrProtocolValidatorCCC final
1370 ObjCTypeArgOrProtocolValidatorCCC(
ASTContext &context,
1372 : Context(context), LookupKind(lookupKind) { }
1374 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
1394 type->isDependentType() ||
1412 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
1413 return std::make_unique<ObjCTypeArgOrProtocolValidatorCCC>(*
this);
1422 bool SelectProtocolFirst) {
1423 Diag(TypeArgLoc, diag::err_objc_type_args_and_protocols)
1424 << SelectProtocolFirst << TypeArgId << ProtocolId
1435 bool warnOnIncompleteProtocols) {
1439 unsigned numProtocolsResolved = 0;
1440 auto resolvedAsProtocols = [&] {
1441 assert(numProtocolsResolved == identifiers.size() &&
"Unresolved protocols");
1448 bool allAreTypeNames =
false;
1452 baseClass = objcObjectType->getInterface();
1455 if (typeParams->size() == numProtocolsResolved) {
1457 allAreTypeNames =
true;
1464 for (
unsigned i = 0, n = protocols.size(); i != n; ++i) {
1469 if (!warnOnIncompleteProtocols) {
1470 (void)
SemaRef.DiagnoseUseOfDecl(proto, identifierLocs[i]);
1481 if (warnOnIncompleteProtocols &&
1483 Diag(identifierLocs[i], diag::warn_undef_protocolref)
1492 if (allAreTypeNames) {
1494 SemaRef.LookupSingleName(S, identifiers[i], identifierLocs[i],
1498 firstClassNameLoc = identifierLocs[i];
1501 allAreTypeNames =
false;
1504 allAreTypeNames =
false;
1513 if (allAreTypeNames && firstClassNameLoc.
isValid()) {
1515 Context.CollectInheritedProtocols(baseClass, knownProtocols);
1516 bool allProtocolsDeclared =
true;
1517 for (
auto *proto : protocols) {
1519 allProtocolsDeclared =
false;
1524 if (allProtocolsDeclared) {
1525 Diag(firstClassNameLoc, diag::warn_objc_redundant_qualified_class_type)
1528 SemaRef.getLocForEndOfToken(firstClassNameLoc),
" *");
1532 protocolLAngleLoc = lAngleLoc;
1533 protocolRAngleLoc = rAngleLoc;
1534 assert(protocols.size() == identifierLocs.size());
1538 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1540 protocols.push_back(proto);
1542 ++numProtocolsResolved;
1546 if (numProtocolsResolved == identifiers.size())
1547 return resolvedAsProtocols();
1553 typedef llvm::PointerUnion<TypeDecl *, ObjCInterfaceDecl *> TypeOrClassDecl;
1555 unsigned numTypeDeclsResolved = 0;
1556 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1560 typeDecls.push_back(TypeOrClassDecl());
1564 if (
auto typeDecl = dyn_cast<TypeDecl>(
decl)) {
1565 typeDecls.push_back(typeDecl);
1566 ++numTypeDeclsResolved;
1570 if (
auto objcClass = dyn_cast<ObjCInterfaceDecl>(
decl)) {
1571 typeDecls.push_back(objcClass);
1572 ++numTypeDeclsResolved;
1576 typeDecls.push_back(TypeOrClassDecl());
1583 auto resolveTypeReference = [&](TypeOrClassDecl typeDecl,
SourceLocation loc)
1587 const char* prevSpec;
1590 if (
auto *actualTypeDecl = dyn_cast<TypeDecl *>(typeDecl))
1593 std::nullopt, actualTypeDecl);
1599 parsedType, Context.getPrintingPolicy());
1620 Diag(loc, diag::err_objc_type_arg_missing_star)
1626 return SemaRef.ActOnTypeName(D);
1631 auto resolvedAsTypeDecls = [&] {
1635 assert(numTypeDeclsResolved == identifiers.size() &&
"Unresolved type decl");
1637 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1639 TypeResult type = resolveTypeReference(typeDecls[i], identifierLocs[i]);
1640 if (!
type.isUsable()) {
1645 typeArgs.push_back(
type.get());
1648 typeArgsLAngleLoc = lAngleLoc;
1649 typeArgsRAngleLoc = rAngleLoc;
1654 if (numTypeDeclsResolved == identifiers.size())
1655 return resolvedAsTypeDecls();
1661 for (
unsigned i = 0, n = identifiers.size(); i != n; ++i) {
1664 if (protocols[i] || typeDecls[i]) {
1670 if (protocols[i] && typeDecls[i])
1693 identifiers[i], identifierLocs[i],
1694 protocols[i] !=
nullptr);
1702 ObjCTypeArgOrProtocolValidatorCCC CCC(Context, lookupKind);
1709 SemaRef.diagnoseTypo(corrected,
1710 PDiag(diag::err_undeclared_protocol_suggest)
1713 protocols[i] = proto;
1714 ++numProtocolsResolved;
1720 SemaRef.diagnoseTypo(corrected,
1721 PDiag(diag::err_unknown_typename_suggest)
1724 typeDecls[i] = typeDecl;
1725 ++numTypeDeclsResolved;
1731 SemaRef.diagnoseTypo(corrected,
1732 PDiag(diag::err_unknown_type_or_class_name_suggest)
1733 << identifiers[i] <<
true);
1735 typeDecls[i] = objcClass;
1736 ++numTypeDeclsResolved;
1742 Diag(identifierLocs[i],
1745 ? diag::err_undeclared_protocol
1746 : diag::err_unknown_typename))
1755 if (numProtocolsResolved == identifiers.size())
1756 return resolvedAsProtocols();
1759 assert(numTypeDeclsResolved == identifiers.size() &&
"Not all types?");
1760 return resolvedAsTypeDecls();
1771 llvm::DenseMap<Selector, const ObjCMethodDecl*> MethodMap;
1772 for (
auto *MD : ID->methods())
1773 MethodMap[MD->getSelector()] = MD;
1775 if (MethodMap.empty())
1782 Diag(
Method->getLocation(), diag::err_duplicate_method_decl)
1783 <<
Method->getDeclName();
1798 Ident, IdentPair.getLoc(),
SemaRef.forRedeclarationInCurContext());
1801 IdentPair.getLoc(), AtProtocolLoc, PrevDecl);
1806 SemaRef.ProcessDeclAttributeList(
SemaRef.TUScope, PDecl, attrList);
1810 SemaRef.mergeDeclAttributes(PDecl, PrevDecl);
1812 DeclsInGroup.push_back(PDecl);
1815 return SemaRef.BuildDeclaratorGroup(DeclsInGroup);
1822 Decl *
const *ProtoRefs,
unsigned NumProtoRefs,
1832 SemaRef.RequireCompleteType(ClassLoc, Context.getObjCInterfaceType(IDecl),
1833 diag::err_category_forward_interface,
1834 CategoryName ==
nullptr)) {
1839 AtInterfaceLoc, ClassLoc, CategoryLoc,
1840 CategoryName, IDecl, typeParamList);
1842 SemaRef.CurContext->addDecl(CDecl);
1845 Diag(ClassLoc, diag::err_undef_interface) << ClassName;
1851 Diag(ClassLoc, diag::err_class_extension_after_impl) << ClassName;
1853 diag::note_implementation_declared);
1861 Diag(CategoryLoc, diag::warn_dup_category_def)
1862 << ClassName << CategoryName;
1863 Diag(
Previous->getLocation(), diag::note_previous_definition);
1868 if (typeParamList) {
1871 SemaRef, prevTypeParamList, typeParamList,
1872 CategoryName ? TypeParamListContext::Category
1873 : TypeParamListContext::Extension))
1874 typeParamList =
nullptr;
1877 diag::err_objc_parameterized_category_nonclass)
1878 << (CategoryName !=
nullptr)
1882 typeParamList =
nullptr;
1887 ClassLoc, CategoryLoc, CategoryName, IDecl,
1890 SemaRef.CurContext->addDecl(CDecl);
1895 SemaRef.ProcessDeclAttributeList(
SemaRef.TUScope, CDecl, AttrList);
1900 NumProtoRefs, ProtoLocs);
1902 ProtoLocs, Context);
1906 NumProtoRefs, Context);
1931 ClassLoc, CatLoc, CatName, IDecl,
1939 ClassLoc, AtCatImplLoc, CatLoc);
1942 Diag(ClassLoc, diag::err_undef_interface) << ClassName;
1944 }
else if (
SemaRef.RequireCompleteType(ClassLoc,
1945 Context.getObjCInterfaceType(IDecl),
1946 diag::err_undef_interface)) {
1954 SemaRef.CurContext->addDecl(CDecl);
1958 if (IDecl && IDecl->
hasAttr<ObjCRuntimeVisibleAttr>()) {
1959 Diag(ClassLoc, diag::err_objc_runtime_visible_category)
1966 Diag(ClassLoc, diag::err_dup_implementation_category) << ClassName
1969 diag::note_previous_definition);
1994 SemaRef.forRedeclarationInCurContext());
1996 Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
1998 }
else if ((IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl))) {
2001 SemaRef.RequireCompleteType(ClassLoc, Context.getObjCInterfaceType(IDecl),
2002 diag::warn_undef_interface);
2006 ObjCInterfaceValidatorCCC CCC{};
2015 Corrected,
PDiag(diag::warn_undef_interface_suggest) << ClassName,
2018 Diag(ClassLoc, diag::warn_undef_interface) << ClassName;
2024 if (SuperClassname) {
2027 SemaRef.LookupSingleName(
SemaRef.TUScope, SuperClassname, SuperClassLoc,
2030 Diag(SuperClassLoc, diag::err_redefinition_different_kind)
2034 SDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
2038 Diag(SuperClassLoc, diag::err_undef_superclass)
2039 << SuperClassname << ClassName;
2043 Diag(SuperClassLoc, diag::err_conflicting_super_class)
2059 nullptr, ClassLoc,
true);
2064 Context.getObjCInterfaceType(SDecl),
2082 ClassLoc, AtClassImplLoc, SuperClassLoc);
2084 SemaRef.ProcessDeclAttributeList(
SemaRef.TUScope, IMPDecl, Attrs);
2095 Diag(ClassLoc, diag::err_dup_implementation_class) << ClassName;
2097 diag::note_previous_definition);
2111 Diag(ClassLoc, diag::err_objc_runtime_visible_subclass)
2124 DeclsInGroup.reserve(Decls.size() + 1);
2126 for (
unsigned i = 0, e = Decls.size(); i != e; ++i) {
2127 Decl *Dcl = Decls[i];
2132 DeclsInGroup.push_back(Dcl);
2135 DeclsInGroup.push_back(ObjCImpDecl);
2139 if (
auto *ImplD = dyn_cast<ObjCImplementationDecl>(ObjCImpDecl))
2140 if (!ImplD->ivar_empty())
2143 return SemaRef.BuildDeclaratorGroup(DeclsInGroup);
2149 assert(ImpDecl &&
"missing implementation decl");
2160 for (
unsigned i = 0, e = numIvars; i != e; ++i) {
2177 assert(ivars &&
"missing @implementation ivars");
2181 for (
unsigned i = 0; i < numIvars; i++) {
2186 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
2194 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
2211 for (; numIvars > 0 && IVI != IVE; ++IVI) {
2214 assert (ImplIvar &&
"missing implementation ivar");
2215 assert (ClsIvar &&
"missing class ivar");
2218 if (!Context.hasSameType(ImplIvar->
getType(), ClsIvar->
getType())) {
2226 diag::err_conflicting_ivar_bitwidth)
2229 diag::note_previous_definition);
2241 Diag(ivars[j]->getLocation(), diag::err_inconsistent_ivar_count);
2242 else if (IVI != IVE)
2243 Diag(IVI->getLocation(), diag::err_inconsistent_ivar_count);
2265 S.
Diag(Impl->getLocation(), DiagID);
2271 std::string FixItStr;
2272 llvm::raw_string_ostream Out(FixItStr);
2273 method->print(Out, Impl->getASTContext().getPrintingPolicy());
2283 S.
Diag(MethodLoc, diag::note_method_declared_at) << method;
2332 Context.ObjCQualifiedIdTypesAreCompatible(A, B,
false);
2348 return Context.canAssignObjCInterfaces(A, B);
2359 (y &
~Decl::OBJC_TQ_CSNullability);
2365 bool IsProtocolMethodDecl,
2366 bool IsOverridingMode,
2368 if (IsProtocolMethodDecl &&
2374 ? diag::warn_conflicting_overriding_ret_type_modifiers
2375 : diag::warn_conflicting_ret_type_modifiers))
2384 if (Warn && IsOverridingMode &&
2392 diag::warn_conflicting_nullability_attr_overriding_ret_types)
2409 IsOverridingMode ? diag::warn_conflicting_overriding_ret_types
2410 : diag::warn_conflicting_ret_types;
2426 IsOverridingMode ? diag::warn_non_covariant_overriding_ret_types
2427 : diag::warn_non_covariant_ret_types;
2436 ? diag::note_previous_declaration
2437 : diag::note_previous_definition)
2447 bool IsProtocolMethodDecl,
2448 bool IsOverridingMode,
2450 if (IsProtocolMethodDecl &&
2454 if (IsOverridingMode)
2456 diag::warn_conflicting_overriding_param_modifiers)
2460 diag::warn_conflicting_param_modifiers)
2472 if (Warn && IsOverridingMode &&
2476 diag::warn_conflicting_nullability_attr_overriding_param_types)
2491 IsOverridingMode ? diag::warn_conflicting_overriding_param_types
2492 : diag::warn_conflicting_param_types;
2508 IsOverridingMode ? diag::warn_non_contravariant_overriding_param_types
2509 : diag::warn_non_contravariant_param_types;
2515 << MethodImpl->
getDeclName() << IfaceTy << ImplTy;
2517 (IsOverridingMode ? diag::note_previous_declaration
2518 : diag::note_previous_definition))
2529 if (implFamily == declFamily)
return false;
2541 unsigned errorID = diag::err_arc_lost_method_convention;
2542 unsigned noteID = diag::note_arc_lost_method_convention;
2545 family = implFamily;
2546 errorID = diag::err_arc_gained_method_convention;
2547 noteID = diag::note_arc_gained_method_convention;
2551 enum FamilySelector {
2552 F_alloc, F_copy, F_mutableCopy = F_copy, F_init, F_new
2554 FamilySelector familySelector = FamilySelector();
2557 case OMF_None: llvm_unreachable(
"logic error, no method convention");
2571 case OMF_init: familySelector = F_init;
break;
2572 case OMF_alloc: familySelector = F_alloc;
break;
2573 case OMF_copy: familySelector = F_copy;
break;
2575 case OMF_new: familySelector = F_new;
break;
2578 enum ReasonSelector { R_NonObjectReturn, R_UnrelatedReturn };
2579 ReasonSelector reasonSelector;
2584 reasonSelector = R_UnrelatedReturn;
2586 reasonSelector = R_NonObjectReturn;
2590 S.
Diag(
decl->getLocation(), noteID) <<
int(familySelector) <<
int(reasonSelector);
2597 bool IsProtocolMethodDecl) {
2603 IsProtocolMethodDecl,
false,
true);
2608 IM != EM && IF != EF; ++IM, ++IF) {
2610 IsProtocolMethodDecl,
false,
true);
2615 diag::warn_conflicting_variadic);
2622 bool IsProtocolMethodDecl) {
2630 IM != EM && IF != EF; ++IM, ++IF) {
2632 IsProtocolMethodDecl,
true,
true);
2637 diag::warn_conflicting_overriding_variadic);
2646 bool IsProtocolMethodDecl) {
2656 if (MethodDecl->
hasAttr<UnavailableAttr>() ||
2657 MethodDecl->
hasAttr<DeprecatedAttr>())
2661 IsProtocolMethodDecl,
false,
false);
2666 IM != EM && IF != EF; ++IM, ++IF) {
2668 *IF, IsProtocolMethodDecl,
false,
false);
2680 diag::warn_category_method_impl_match);
2697 if (PDecl->
hasAttr<ObjCExplicitProtocolImplAttr>())
2699 for (
const auto *PI : PDecl->
protocols())
2725 : dyn_cast<ObjCInterfaceDecl>(CDecl);
2726 assert (IDecl &&
"CheckProtocolMethodDefs - IDecl is null");
2742 if (PDecl->
hasAttr<ObjCExplicitProtocolImplAttr>()) {
2743 if (!ProtocolsExplictImpl) {
2765 if (InsMap.count(fISelector))
2784 if (method->getImplementationControl() !=
2786 !method->isPropertyAccessor() &&
2787 !InsMap.count(method->getSelector()) &&
2789 method->getSelector(),
true ,
2802 method->getSelector(),
true ,
2804 if (
C || MethodInClass->isPropertyAccessor())
2806 unsigned DIAG = diag::warn_unimplemented_protocol_method;
2814 if (method->getImplementationControl() !=
2816 !ClsMap.count(method->getSelector()) &&
2818 method->getSelector(),
false ,
2820 true ,
nullptr ))) {
2828 unsigned DIAG = diag::warn_unimplemented_protocol_method;
2837 ProtocolsExplictImpl);
2847 bool WarnCategoryMethodImpl) {
2851 if (!InsMapSeen.insert(I->getSelector()).second)
2853 if (!I->isPropertyAccessor() &&
2854 !InsMap.count(I->getSelector())) {
2857 diag::warn_undef_method_impl);
2863 "Expected to find the method through lookup as well");
2865 if (ImpMethodDecl) {
2869 if (!WarnCategoryMethodImpl)
2872 else if (!I->isPropertyAccessor())
2881 if (!ClsMapSeen.insert(I->getSelector()).second)
2883 if (!I->isPropertyAccessor() &&
2884 !ClsMap.count(I->getSelector())) {
2887 diag::warn_undef_method_impl);
2892 "Expected to find the method through lookup as well");
2894 if (ImpMethodDecl) {
2898 if (!WarnCategoryMethodImpl)
2901 else if (!I->isPropertyAccessor())
2910 for (
auto *PI : PD->protocols())
2912 IMPDecl, PI, IncompleteImpl,
false,
2913 WarnCategoryMethodImpl);
2920 if (!WarnCategoryMethodImpl) {
2921 for (
auto *Cat : I->visible_categories())
2923 IMPDecl, Cat, IncompleteImpl,
2924 ImmediateClass && Cat->IsClassExtension(),
2925 WarnCategoryMethodImpl);
2928 for (
auto *Ext : I->visible_extensions())
2930 IMPDecl, Ext, IncompleteImpl,
false,
2931 WarnCategoryMethodImpl);
2935 for (
auto *PI : I->all_referenced_protocols())
2937 IMPDecl, PI, IncompleteImpl,
false,
2938 WarnCategoryMethodImpl);
2942 if (!WarnCategoryMethodImpl && I->getSuperClass())
2945 I->getSuperClass(), IncompleteImpl,
false);
2976 if (SuperIDecl && SuperIDecl->
lookupMethod(Sel,
false))
2980 if (InsMap.empty() && ClsMap.empty())
2984 bool IncompleteImpl =
false;
2987 IncompleteImpl,
false,
2993 bool IncompleteImpl) {
2998 InsMap.insert(I->getSelector());
3006 const auto *P = PImpl->getPropertyDecl();
3009 InsMap.insert(P->getGetterName());
3010 if (!P->getSetterName().isNull())
3011 InsMap.insert(P->getSetterName());
3018 bool SynthesizeProperties =
getLangOpts().ObjCDefaultSynthProperties &&
3020 !IDecl->isObjCRequiresPropertyDefs();
3029 ClsMap.insert(I->getSelector());
3036 IncompleteImpl,
true);
3041 dyn_cast<ObjCCategoryImplDecl>(IMPDecl))
3052 for (
auto *PI : I->all_referenced_protocols())
3054 ClsMap, I, ExplicitImplProtocols);
3058 if (!
C->IsClassExtension()) {
3059 for (
auto *P :
C->protocols())
3061 ClsMap, CDecl, ExplicitImplProtocols);
3066 llvm_unreachable(
"invalid ObjCContainerDecl type.");
3075 for (
unsigned i = 0; i != NumElts; ++i) {
3079 SemaRef.forRedeclarationInCurContext());
3090 Diag(AtClassLoc, diag::err_redefinition_different_kind) << IdentList[i];
3098 Diag(AtClassLoc, diag::warn_forward_class_redefinition)
3108 = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
3130 if (PrevIDecl && TypeParams) {
3134 SemaRef, PrevTypeParams, TypeParams,
3135 TypeParamListContext::ForwardDeclaration)) {
3136 TypeParams =
nullptr;
3140 Diag(IdentLocs[i], diag::err_objc_parameterized_forward_class)
3143 Diag(Def->getLocation(), diag::note_defined_here)
3146 TypeParams =
nullptr;
3151 Context,
SemaRef.CurContext, AtClassLoc, ClassName, TypeParams,
3152 PrevIDecl, IdentLocs[i]);
3156 SemaRef.mergeDeclAttributes(IDecl, PrevIDecl);
3160 DeclsInGroup.push_back(IDecl);
3163 return SemaRef.BuildDeclaratorGroup(DeclsInGroup);
3168 const Type *left,
const Type *right);
3174 Context.getCanonicalType(leftQT).getUnqualifiedType().getTypePtr();
3176 Context.getCanonicalType(rightQT).getUnqualifiedType().getTypePtr();
3178 if (left == right)
return true;
3190 TypeInfo LeftTI = Context.getTypeInfo(left);
3191 TypeInfo RightTI = Context.getTypeInfo(right);
3226 return (leftSK == rightSK);
3232 assert(lt && rt && lt != rt);
3247 TypeInfo LeftTI = Context.getTypeInfo(lt);
3248 TypeInfo RightTI = Context.getTypeInfo(rt);
3258 for (; li != le && ri != re; ++li, ++ri) {
3259 if (!
matchTypes(Context, strategy, li->getType(), ri->getType()))
3262 return (li == le && ri == re);
3284 (left->
hasAttr<NSReturnsRetainedAttr>()
3285 != right->
hasAttr<NSReturnsRetainedAttr>() ||
3286 left->
hasAttr<NSConsumesSelfAttr>()
3287 != right->
hasAttr<NSConsumesSelfAttr>()))
3294 for (; li != le && ri != re; ++li, ++ri) {
3295 assert(ri != right->
param_end() &&
"Param mismatch");
3302 lparm->
hasAttr<NSConsumedAttr>() != rparm->hasAttr<NSConsumedAttr>())
3310 auto *MethodProtocol = dyn_cast<ObjCProtocolDecl>(Method->getDeclContext());
3311 auto *MethodInListProtocol =
3315 if ((MethodProtocol && !MethodInListProtocol) ||
3316 (!MethodProtocol && MethodInListProtocol))
3319 if (MethodProtocol && MethodInListProtocol)
3325 return MethodInterface == MethodInListInterface;
3333 dyn_cast<ObjCCategoryDecl>(
Method->getDeclContext()))
3334 if (!CD->IsClassExtension() && List->
getBits() < 2)
3365 if (!SameDeclaration ||
3370 if (!
Method->isDefined())
3375 if (
Method->isDeprecated() && SameDeclaration &&
3377 ListWithSameDeclaration = List;
3379 if (
Method->isUnavailable() && SameDeclaration &&
3380 !ListWithSameDeclaration &&
3382 ListWithSameDeclaration = List;
3401 if (
Method->isDeprecated()) {
3407 if (
Method->isUnavailable()) {
3420 if (ListWithSameDeclaration) {
3424 ListWithSameDeclaration->
setNext(List);
3434 assert(
SemaRef.ExternalSource &&
"We need an external AST source");
3435 SemaRef.ExternalSource->ReadMethodPool(Sel);
3441 SemaRef.ExternalSource->updateOutOfDateSelector(Sel);
3455 Method->setDefined(impl);
3489 if (TypeBound->isObjCId())
3493 auto *BoundInterface = TypeBound->getInterface();
3494 assert(BoundInterface &&
"unexpected object type!");
3498 auto *MethodProtocol = dyn_cast<ObjCProtocolDecl>(Method->getDeclContext());
3499 if (MethodProtocol) {
3509 return MethodInterface == BoundInterface ||
3510 MethodInterface->isSuperClassOf(BoundInterface) ||
3511 BoundInterface->isSuperClassOf(MethodInterface);
3513 llvm_unreachable(
"unknown method context");
3520 bool InstanceFirst,
bool CheckTheOther,
const ObjCObjectType *TypeBound) {
3524 GlobalMethodPool::iterator Pos =
MethodPool.find(Sel);
3532 if (M->getMethod() && M->getMethod()->isUnconditionallyVisible()) {
3534 Methods.push_back(M->getMethod());
3538 if (!Methods.empty())
3539 return Methods.size() > 1;
3548 if (M->getMethod() && M->getMethod()->isUnconditionallyVisible()) {
3550 Methods.push_back(M->getMethod());
3553 return Methods.size() > 1;
3561 FilteredMethods.push_back(BestMethod);
3563 for (
auto *M : Methods)
3564 if (M != BestMethod && !M->
hasAttr<UnavailableAttr>())
3565 FilteredMethods.push_back(M);
3567 if (FilteredMethods.size() > 1)
3571 GlobalMethodPool::iterator Pos =
MethodPool.find(Sel);
3582 bool receiverIdOrClass,
3587 GlobalMethodPool::iterator Pos =
MethodPool.find(Sel);
3592 ObjCMethodList &MethList = instance ? Pos->second.first : Pos->second.second;
3594 if (M->getMethod() && M->getMethod()->isUnconditionallyVisible())
3595 return M->getMethod();
3602 bool receiverIdOrClass) {
3604 bool issueDiagnostic =
false, issueError =
false;
3608 bool strictSelectorMatch =
3609 receiverIdOrClass &&
3612 if (strictSelectorMatch) {
3613 for (
unsigned I = 1, N = Methods.size(); I != N; ++I) {
3615 issueDiagnostic =
true;
3624 if (!strictSelectorMatch ||
3625 (issueDiagnostic &&
getLangOpts().ObjCAutoRefCount))
3626 for (
unsigned I = 1, N = Methods.size(); I != N; ++I) {
3630 issueDiagnostic =
true;
3637 if (issueDiagnostic) {
3639 Diag(R.
getBegin(), diag::err_arc_multiple_method_decl) << Sel << R;
3640 else if (strictSelectorMatch)
3641 Diag(R.getBegin(), diag::warn_strict_multiple_method_decl) << Sel << R;
3643 Diag(R.getBegin(), diag::warn_multiple_method_decl) << Sel << R;
3645 Diag(Methods[0]->getBeginLoc(),
3646 issueError ? diag::note_possibility : diag::note_using)
3647 << Methods[0]->getSourceRange();
3648 for (
unsigned I = 1, N = Methods.size(); I != N; ++I) {
3649 Diag(Methods[I]->getBeginLoc(), diag::note_also_found)
3650 << Methods[I]->getSourceRange();
3656 GlobalMethodPool::iterator Pos =
MethodPool.find(Sel);
3660 auto &Methods = Pos->second;
3663 if (
Method->getMethod() &&
3664 (
Method->getMethod()->isDefined() ||
3665 Method->getMethod()->isPropertyAccessor()))
3666 return Method->getMethod();
3670 if (
Method->getMethod() &&
3671 (
Method->getMethod()->isDefined() ||
3672 Method->getMethod()->isPropertyAccessor()))
3673 return Method->getMethod();
3681 const unsigned MaxEditDistance = 1;
3682 unsigned BestEditDistance = MaxEditDistance + 1;
3683 std::string MethodName = Method->getSelector().getAsString();
3685 unsigned MinPossibleEditDistance =
abs((
int)MethodName.size() - (
int)Typo.size());
3686 if (MinPossibleEditDistance > 0 &&
3687 Typo.size() / MinPossibleEditDistance < 1)
3689 unsigned EditDistance = Typo.edit_distance(MethodName,
true, MaxEditDistance);
3690 if (EditDistance > MaxEditDistance)
3692 if (EditDistance == BestEditDistance)
3693 BestMethod.push_back(Method);
3694 else if (EditDistance < BestEditDistance) {
3696 BestMethod.push_back(Method);
3715 bool ObjectIsId =
true, ObjectIsClass =
true;
3717 ObjectIsId = ObjectIsClass =
false;
3722 ObjectType =
QualType(ObjCPtr->getInterfaceType(), 0);
3723 ObjectIsId = ObjectIsClass =
false;
3726 ObjectIsClass =
false;
3732 for (GlobalMethodPool::iterator
b =
MethodPool.begin(),
3736 if (M->getMethod() &&
3737 (M->getMethod()->getSelector().getNumArgs() == NumArgs) &&
3738 (M->getMethod()->getSelector() != Sel)) {
3740 Methods.push_back(M->getMethod());
3741 else if (!ObjectIsClass &&
3743 SemaRef, M->getMethod()->getSelector(), ObjectType))
3744 Methods.push_back(M->getMethod());
3748 if (M->getMethod() &&
3749 (M->getMethod()->getSelector().getNumArgs() == NumArgs) &&
3750 (M->getMethod()->getSelector() != Sel)) {
3752 Methods.push_back(M->getMethod());
3753 else if (!ObjectIsId &&
3755 SemaRef, M->getMethod()->getSelector(), ObjectType))
3756 Methods.push_back(M->getMethod());
3761 for (
unsigned i = 0, e = Methods.size(); i < e; i++) {
3765 return (SelectedMethods.size() == 1) ? SelectedMethods[0] :
nullptr;
3775 for (
auto *Ivar : ID->ivars()) {
3776 if (Ivar->isInvalidDecl())
3781 Diag(Ivar->getLocation(), diag::err_duplicate_member) << II;
3783 Ivar->setInvalidDecl();
3793 for (
auto ivar = ID->getClassInterface()->all_declared_ivar_begin();
3794 ivar; ivar = ivar->getNextIvar()) {
3795 if (ivar->isInvalidDecl())
continue;
3798 S.
Diag(ivar->getLocation(), diag::err_arc_weak_disabled);
3800 S.
Diag(ivar->getLocation(), diag::err_arc_weak_no_runtime);
3812 for (
auto ivar = ID->all_declared_ivar_begin(); ivar;
3813 ivar = ivar->getNextIvar()) {
3814 if (ivar->isInvalidDecl())
3820 S.
Diag(ivar->getLocation(), diag::err_flexible_array_arc_retainable);
3821 ivar->setInvalidDecl();
3827 switch (
SemaRef.CurContext->getDeclKind()) {
3828 case Decl::ObjCInterface:
3830 case Decl::ObjCProtocol:
3832 case Decl::ObjCCategory:
3836 case Decl::ObjCImplementation:
3838 case Decl::ObjCCategoryImpl:
3847 if (
T->isIncompleteArrayType())
3849 const auto *RD =
T->getAsRecordDecl();
3850 return RD && RD->hasFlexibleArrayMember();
3857 if ((IntfDecl = dyn_cast<ObjCInterfaceDecl>(OCD))) {
3858 Ivars = IntfDecl->
ivars();
3859 }
else if (
auto *ImplDecl = dyn_cast<ObjCImplementationDecl>(OCD)) {
3860 IntfDecl = ImplDecl->getClassInterface();
3861 Ivars = ImplDecl->
ivars();
3862 }
else if (
auto *CategoryDecl = dyn_cast<ObjCCategoryDecl>(OCD)) {
3863 if (CategoryDecl->IsClassExtension()) {
3864 IntfDecl = CategoryDecl->getClassInterface();
3865 Ivars = CategoryDecl->
ivars();
3871 for (
auto *ivar : Ivars) {
3873 S.
Diag(ivar->getLocation(), diag::warn_variable_sized_ivar_visibility)
3874 << ivar->getDeclName() << ivar->getType();
3886 if (ivar->isInvalidDecl() || !ivar->getNextIvar())
3889 bool IsInvalidIvar =
false;
3891 S.
Diag(ivar->getLocation(), diag::err_flexible_array_not_at_end)
3892 << ivar->getDeclName() << IvarTy
3894 IsInvalidIvar =
true;
3897 S.
Diag(ivar->getLocation(), diag::err_objc_variable_sized_type_not_at_end)
3898 << ivar->getDeclName() << IvarTy;
3899 IsInvalidIvar =
true;
3901 if (IsInvalidIvar) {
3902 S.
Diag(ivar->getNextIvar()->getLocation(),
3903 diag::note_next_ivar_declaration)
3904 << ivar->getNextIvar()->getSynthesize();
3905 ivar->setInvalidDecl();
3913 (Ivars.begin() == Ivars.end()) ?
nullptr : *Ivars.begin();
3916 while (SuperClass && SuperClass->
ivar_empty())
3920 std::advance(IvarIter, SuperClass->
ivar_size() - 1);
3924 diag::warn_superclass_variable_sized_type_not_at_end)
3939 const llvm::iterator_range<ObjCProtocolList::iterator> &Protocols) {
3940 for (
auto *PI : Protocols)
3951 for (
auto *MD : PDecl->
methods()) {
3952 if (!MD->isPropertyAccessor()) {
3953 if (
const auto *CMD =
3954 IDecl->getMethod(MD->getSelector(), MD->isInstanceMethod())) {
3955 if (CMD->isDirectMethod())
3956 DirectMembers.push_back(CMD);
3961 if (
const auto *CPD = IDecl->FindPropertyVisibleInPrimaryClass(
3962 PD->getIdentifier(),
3963 PD->isClassProperty()
3966 if (CPD->isDirectProperty())
3967 DirectMembers.push_back(CPD);
3970 if (!DirectMembers.empty()) {
3971 S.
Diag(CDecl->
getLocation(), diag::err_objc_direct_protocol_conformance)
3973 for (
const auto *MD : DirectMembers)
3974 S.
Diag(MD->getLocation(), diag::note_direct_member_here);
3991 assert(AtEnd.
isValid() &&
"Invalid location for '@end'");
3994 Decl *ClassDecl = OCD;
3996 bool isInterfaceDeclKind =
4005 if (
auto *OID = dyn_cast<ObjCImplementationDecl>(
SemaRef.CurContext)) {
4006 for (
auto *PropImpl : OID->property_impls()) {
4007 if (
auto *Getter = PropImpl->getGetterMethodDecl())
4008 if (Getter->isSynthesizedAccessorStub())
4009 OID->addDecl(Getter);
4010 if (
auto *Setter = PropImpl->getSetterMethodDecl())
4011 if (Setter->isSynthesizedAccessorStub())
4012 OID->addDecl(Setter);
4017 llvm::DenseMap<Selector, const ObjCMethodDecl*> InsMap;
4018 llvm::DenseMap<Selector, const ObjCMethodDecl*> ClsMap;
4020 for (
unsigned i = 0, e = allMethods.size(); i != e; i++ ) {
4022 cast_or_null<ObjCMethodDecl>(allMethods[i]);
4025 if (
Method->isInstanceMethod()) {
4030 if ((isInterfaceDeclKind && PrevMethod && !
match)
4031 || (checkIdenticalMethods &&
match)) {
4032 Diag(
Method->getLocation(), diag::err_duplicate_method_decl)
4033 <<
Method->getDeclName();
4035 Method->setInvalidDecl();
4038 Method->setAsRedeclaration(PrevMethod);
4039 if (!Context.getSourceManager().isInSystemHeader(
4041 Diag(
Method->getLocation(), diag::warn_duplicate_method_decl)
4042 <<
Method->getDeclName();
4054 if ((isInterfaceDeclKind && PrevMethod && !
match)
4055 || (checkIdenticalMethods &&
match)) {
4056 Diag(
Method->getLocation(), diag::err_duplicate_method_decl)
4057 <<
Method->getDeclName();
4059 Method->setInvalidDecl();
4062 Method->setAsRedeclaration(PrevMethod);
4063 if (!Context.getSourceManager().isInSystemHeader(
4065 Diag(
Method->getLocation(), diag::warn_duplicate_method_decl)
4066 <<
Method->getDeclName();
4081 if (
C->IsClassExtension()) {
4090 if (CDecl->getIdentifier())
4094 for (
auto *I : CDecl->properties())
4096 CDecl->setAtEndRange(AtEnd);
4099 IC->setAtEndRange(AtEnd);
4106 for (
const auto *Ext : IDecl->visible_extensions()) {
4107 for (
const auto *
Property : Ext->instance_properties()) {
4110 = IC->FindPropertyImplDecl(
Property->getIdentifier(),
4112 if (PIDecl->getPropertyImplementation()
4116 for (
const auto *Ext : IDecl->visible_extensions()) {
4118 Ext->getInstanceMethod(
Property->getGetterName()))
4119 GetterMethod->setPropertyAccessor(
true);
4122 = Ext->getInstanceMethod(
Property->getSetterName()))
4123 SetterMethod->setPropertyAccessor(
true);
4131 if (IDecl->hasDesignatedInitializers())
4136 bool HasRootClassAttr = IDecl->hasAttr<ObjCRootClassAttr>();
4137 if (IDecl->getSuperClass() ==
nullptr) {
4140 if (!HasRootClassAttr) {
4143 Diag(DeclLoc, diag::warn_objc_root_class_missing)
4144 << IDecl->getIdentifier();
4152 Diag(SuperClassLoc, diag::note_objc_needs_superclass)
4155 Diag(SuperClassLoc, diag::note_objc_needs_superclass);
4158 }
else if (HasRootClassAttr) {
4160 Diag(IDecl->getLocation(), diag::err_objc_root_class_subclass);
4168 if (IDecl->hasAttr<ObjCSubclassingRestrictedAttr>() &&
4169 Super->hasAttr<ObjCSubclassingRestrictedAttr>()) {
4170 Diag(IC->getLocation(), diag::err_restricted_superclass_mismatch);
4171 Diag(Super->getLocation(), diag::note_class_declared);
4175 if (IDecl->hasAttr<ObjCClassStubAttr>())
4176 Diag(IC->getLocation(), diag::err_implementation_of_class_stub);
4179 while (IDecl->getSuperClass()) {
4181 IDecl = IDecl->getSuperClass();
4187 dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) {
4188 CatImplClass->setAtEndRange(AtEnd);
4194 = IDecl->FindCategoryDeclaration(CatImplClass->getIdentifier())) {
4198 }
else if (
const auto *IntfDecl = dyn_cast<ObjCInterfaceDecl>(ClassDecl)) {
4200 if (!IntfDecl->hasAttr<ObjCSubclassingRestrictedAttr>() &&
4201 Super->hasAttr<ObjCSubclassingRestrictedAttr>()) {
4202 Diag(IntfDecl->getLocation(), diag::err_restricted_superclass_mismatch);
4203 Diag(Super->getLocation(), diag::note_class_declared);
4207 if (IntfDecl->hasAttr<ObjCClassStubAttr>() &&
4208 !IntfDecl->hasAttr<ObjCSubclassingRestrictedAttr>())
4209 Diag(IntfDecl->getLocation(), diag::err_class_stub_subclassing_mismatch);
4212 if (isInterfaceDeclKind) {
4214 for (
unsigned i = 0, e = allTUVars.size(); i != e; i++) {
4217 if (
VarDecl *VDecl = dyn_cast<VarDecl>(*I)) {
4218 if (!VDecl->hasExternalStorage())
4219 Diag(VDecl->getLocation(), diag::err_objc_var_decl_inclass);
4225 for (
unsigned i = 0, e = allTUVars.size(); i != e; i++) {
4228 (*I)->setTopLevelDeclInObjCContainer();
4229 SemaRef.Consumer.HandleTopLevelDeclInObjCContainer(DG);
4232 SemaRef.ActOnDocumentableDecl(ClassDecl);
4249 QualType ResultType = Method->getReturnType();
4257 if (ResultObjectType->isObjCIdType() ||
4258 ResultObjectType->isObjCQualifiedIdType())
4263 = ResultObjectType->getInterfaceDecl()) {
4269 if (ResultClass->isSuperClassOf(CurrentClass))
4285class OverrideSearch {
4287 const ObjCMethodDecl *
Method;
4288 llvm::SmallSetVector<ObjCMethodDecl*, 4> Overridden;
4292 OverrideSearch(Sema &S,
const ObjCMethodDecl *method) :
Method(method) {
4297 SemaObjC::GlobalMethodPool::iterator it =
4298 S.
ObjC().MethodPool.find(selector);
4300 if (!S.getExternalSource()) return;
4301 S.ObjC().ReadMethodPool(selector);
4303 it = S.ObjC().MethodPool.find(selector);
4304 if (it == S.ObjC().MethodPool.end())
4307 const ObjCMethodList &list =
4309 if (!list.getMethod())
return;
4311 const ObjCContainerDecl *container
4317 if (
const ObjCCategoryDecl *Category =
4318 dyn_cast<ObjCCategoryDecl>(container)) {
4319 searchFromContainer(container);
4320 if (
const ObjCInterfaceDecl *
Interface = Category->getClassInterface())
4323 searchFromContainer(container);
4327 typedef decltype(Overridden)::iterator iterator;
4328 iterator begin()
const {
return Overridden.begin(); }
4329 iterator end()
const {
return Overridden.end(); }
4332 void searchFromContainer(
const ObjCContainerDecl *container) {
4336#define OBJCCONTAINER(type, base) \
4338 searchFrom(cast<type##Decl>(container)); \
4340#define ABSTRACT_DECL(expansion)
4341#define DECL(type, base) \
4343#include "clang/AST/DeclNodes.inc"
4344 llvm_unreachable(
"not an ObjC container!");
4348 void searchFrom(
const ObjCProtocolDecl *protocol) {
4357 void searchFrom(
const ObjCCategoryDecl *category) {
4364 void searchFrom(
const ObjCCategoryImplDecl *impl) {
4370 if (ObjCInterfaceDecl *
Interface = category->getClassInterface())
4379 void searchFrom(
const ObjCInterfaceDecl *iface) {
4396 void searchFrom(
const ObjCImplementationDecl *impl) {
4403 void search(
const ObjCProtocolList &protocols) {
4404 for (
const auto *Proto : protocols)
4408 void search(
const ObjCContainerDecl *container) {
4411 Method->isInstanceMethod(),
4416 Overridden.insert(meth);
4426 searchFromContainer(container);
4434 const auto *
attr = overridden->
getAttr<ObjCDirectAttr>();
4436 Diag(
attr->getLocation(), diag::note_previous_declaration);
4438 const auto *
attr = method->
getAttr<ObjCDirectAttr>();
4439 Diag(
attr->getLocation(), diag::err_objc_direct_on_override)
4451 auto IsMethodInCurrentClass = [CurrentClass](
const ObjCMethodDecl *M) {
4453 return M->getClassInterface()->getCanonicalDecl() ==
4457 OverrideSearch overrides(
SemaRef, ObjCMethod);
4463 bool hasOverriddenMethodsInBaseOrProtocol =
false;
4465 if (!hasOverriddenMethodsInBaseOrProtocol) {
4467 !IsMethodInCurrentClass(overridden) || overridden->isOverriding()) {
4469 hasOverriddenMethodsInBaseOrProtocol =
true;
4478 GlobalMethodPool::iterator It =
4483 unsigned CategCount = List.
getBits();
4484 if (CategCount > 0) {
4487 if (CategCount > 1 ||
4489 OverrideSearch overrides(
SemaRef, overridden);
4492 !IsMethodInCurrentClass(SuperOverridden)) {
4494 hasOverriddenMethodsInBaseOrProtocol =
true;
4495 overridden->setOverriding(
true);
4510 SemaRef.mergeObjCMethodDecls(ObjCMethod, overridden);
4512 if (ObjCMethod->
isImplicit() && overridden->isImplicit())
4521 if (CurrentClass && overridden->
getDeclContext() != CurrentClass &&
4523 !overridden->isImplicit() ) {
4527 PrevE = overridden->param_end();
4528 for (; ParamI != E && PrevI != PrevE; ++ParamI, ++PrevI) {
4529 assert(PrevI != overridden->param_end() &&
"Param mismatch");
4534 if (!Context.typesAreCompatible(T1, T2)) {
4535 Diag((*ParamI)->getLocation(), diag::ext_typecheck_base_super)
4537 Diag(overridden->getLocation(), diag::note_previous_declaration);
4544 ObjCMethod->
setOverriding(hasOverriddenMethodsInBaseOrProtocol);
4554 bool prevUsesCSKeyword) {
4556 auto nullability =
type->getNullability();
4560 if (nullability.has_value() == prevNullability.has_value()) {
4566 if (*nullability == *prevNullability)
4570 S.
Diag(loc, diag::err_nullability_conflicting)
4591 if (prevMethod->
hasAttr<ObjCRequiresSuperAttr>() &&
4592 !method->
hasAttr<ObjCRequiresSuperAttr>()) {
4595 ObjCRequiresSuperAttr::CreateImplicit(S.
Context,
4612 unsigned numPrevParams = prevMethod->
param_size();
4613 for (
unsigned i = 0, n = std::min(numParams, numPrevParams); i != n; ++i) {
4633 llvm::Triple::x86 &&
4634 "x86-specific check invoked for a different target");
4637 for (
const ParmVarDecl *P : Method->parameters()) {
4638 if (P->getType()->isVectorType()) {
4639 Loc = P->getBeginLoc();
4645 if (Method->getReturnType()->isVectorType()) {
4646 Loc = Method->getReturnTypeSourceRange().getBegin();
4647 T = Method->getReturnType();
4655 VersionTuple AcceptedInVersion;
4656 if (Triple.getOS() == llvm::Triple::IOS)
4657 AcceptedInVersion = VersionTuple(9);
4658 else if (Triple.isMacOSX())
4659 AcceptedInVersion = VersionTuple(10, 11);
4665 SemaRef.
Diag(Loc, diag::err_objc_method_unsupported_param_ret_type)
4666 <<
T << (Method->getReturnType()->isVectorType() ? 1
4668 << (Triple.isMacOSX() ?
"macOS 10.11" :
"iOS 9");
4672 if (!Method->isDirectMethod() && !Method->hasAttr<UnavailableAttr>() &&
4673 CD->
hasAttr<ObjCDirectMembersAttr>()) {
4675 ObjCDirectAttr::CreateImplicit(S.
Context, Method->getLocation()));
4682 auto Sel = Method->getSelector();
4683 bool isInstance = Method->isInstanceMethod();
4684 bool diagnosed =
false;
4687 if (diagnosed || IMD->isImplicit())
4689 if (Method->isDirectMethod() || IMD->isDirectMethod()) {
4690 S.
Diag(Method->getLocation(), diag::err_objc_direct_duplicate_decl)
4691 << Method->isDirectMethod() << 0 << IMD->isDirectMethod()
4692 << Method->getDeclName();
4693 S.
Diag(IMD->getLocation(), diag::note_previous_declaration);
4711 if (
auto *IMD = IDecl->
getMethod(Sel, isInstance))
4714 if (Impl != ImpDecl)
4719 if (
auto *IMD = Cat->getMethod(Sel, isInstance))
4721 else if (
auto CatImpl = Cat->getImplementation())
4722 if (CatImpl != ImpDecl)
4723 if (
auto *IMD = Cat->getMethod(Sel, isInstance))
4730 bool MethodDefinition) {
4735 if (!ArgInfo.
Type) {
4736 ArgType = Context.getObjCIdType();
4743 SemaRef.forRedeclarationInCurContext());
4749 (MethodDefinition ? diag::warn_method_param_redefinition
4750 : diag::warn_method_param_declaration))
4762 Context.getTranslationUnitDecl(), StartLoc, ArgInfo.
NameLoc, ArgInfo.
Name,
4764 Param->setObjCMethodScopeInfo(ParamIndex);
4765 Param->setObjCDeclQualifier(
4771 if (Param->hasAttr<BlocksAttr>()) {
4772 Diag(Param->getLocation(), diag::err_block_on_nonlocal);
4773 Param->setInvalidDecl();
4777 SemaRef.IdResolver.AddDecl(Param);
4790 bool isVariadic,
bool MethodDefinition) {
4793 if (!
SemaRef.CurContext->isObjCContainer()) {
4794 Diag(MethodLoc, diag::err_missing_method_context);
4801 bool HasRelatedResultType =
false;
4804 resultDeclType =
SemaRef.GetTypeFromParser(ReturnType, &ReturnTInfo);
4806 if (
SemaRef.CheckFunctionReturnType(resultDeclType, MethodLoc))
4809 QualType bareResultType = resultDeclType;
4810 (void)AttributedType::stripOuterNullability(bareResultType);
4811 HasRelatedResultType = (bareResultType == Context.getObjCInstanceType());
4813 resultDeclType = Context.getObjCIdType();
4814 Diag(MethodLoc, diag::warn_missing_method_return_type)
4819 Context, MethodLoc, EndLoc, Sel, resultDeclType, ReturnTInfo,
4820 SemaRef.CurContext, MethodType == tok::minus, isVariadic,
4823 MethodDeclKind == tok::objc_optional
4826 HasRelatedResultType);
4829 for (
unsigned I = 0; I < Sel.
getNumArgs(); ++I) {
4832 SemaRef.ProcessAPINotes(Param);
4833 Params.push_back(Param);
4836 for (
unsigned i = 0, e = CNumArgs; i != e; ++i) {
4840 ArgType = Context.getObjCIdType();
4845 Param->setDeclContext(ObjCMethod);
4846 Params.push_back(Param);
4853 SemaRef.ProcessDeclAttributeList(
SemaRef.TUScope, ObjCMethod, AttrList);
4855 SemaRef.ProcessAPINotes(ObjCMethod);
4859 if (
ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(ClassDecl)) {
4860 if (MethodType == tok::minus) {
4861 PrevMethod = ImpDecl->getInstanceMethod(Sel);
4862 ImpDecl->addInstanceMethod(ObjCMethod);
4864 PrevMethod = ImpDecl->getClassMethod(Sel);
4865 ImpDecl->addClassMethod(ObjCMethod);
4874 if (
auto *Setter = PropertyImpl->getSetterMethodDecl())
4875 if (Setter->getSelector() == Sel &&
4877 assert(Setter->isSynthesizedAccessorStub() &&
"autosynth stub expected");
4878 PropertyImpl->setSetterMethodDecl(ObjCMethod);
4880 if (
auto *Getter = PropertyImpl->getGetterMethodDecl())
4881 if (Getter->getSelector() == Sel &&
4883 assert(Getter->isSynthesizedAccessorStub() &&
"autosynth stub expected");
4884 PropertyImpl->setGetterMethodDecl(ObjCMethod);
4898 const auto *
attr = CanonicalMD->
getAttr<ObjCDirectAttr>();
4900 ObjCDirectAttr::CreateImplicit(Context,
attr->getLocation()));
4907 if (
auto *IMD = IDecl->lookupMethod(ObjCMethod->
getSelector(),
4927 if (IDecl == IMD->getClassInterface()) {
4928 auto diagContainerMismatch = [&] {
4929 int decl = 0, impl = 0;
4931 if (
auto *Cat = dyn_cast<ObjCCategoryDecl>(IMD->getDeclContext()))
4932 decl = Cat->IsClassExtension() ? 1 : 2;
4935 impl = 1 + (
decl != 0);
4938 diag::err_objc_direct_impl_decl_mismatch)
4940 Diag(IMD->getLocation(), diag::note_previous_declaration);
4944 const auto *
attr = ObjCMethod->
getAttr<ObjCDirectAttr>();
4946 diagContainerMismatch();
4947 }
else if (!IMD->isDirectMethod()) {
4948 Diag(
attr->getLocation(), diag::err_objc_direct_missing_on_decl);
4949 Diag(IMD->getLocation(), diag::note_previous_declaration);
4951 }
else if (IMD->isDirectMethod()) {
4952 const auto *
attr = IMD->getAttr<ObjCDirectAttr>();
4954 diagContainerMismatch();
4957 ObjCDirectAttr::CreateImplicit(Context,
attr->getLocation()));
4976 for (
auto *
C : IDecl->visible_categories())
4977 for (
auto &P :
C->protocols())
4978 if (
auto *IMD = P->lookupMethod(ObjCMethod->
getSelector(),
4981 IMD->parameters().size() &&
4982 "Methods have different number of parameters");
4983 auto OI = IMD->param_begin(), OE = IMD->param_end();
4985 for (; OI != OE; ++OI, ++NI)
5019 if (!CurrentClass) {
5021 CurrentClass = Cat->getClassInterface();
5022 else if (
ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(ClassDecl))
5023 CurrentClass = Impl->getClassInterface();
5025 = dyn_cast<ObjCCategoryImplDecl>(ClassDecl))
5026 CurrentClass = CatImpl->getClassInterface();
5034 bool ARCError =
false;
5042 bool InferRelatedResultType =
false;
5068 if (InferRelatedResultType &&
5073 if (MethodDefinition &&
5074 Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
5079 if (
const auto *
attr = ObjCMethod->
getAttr<AvailabilityAttr>()) {
5082 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
5084 ObjCMethod->
dropAttr<AvailabilityAttr>();
5091 SemaRef.ActOnDocumentableDecl(ObjCMethod);
5105 SemaRef.getCurLexicalContext()->getRedeclContext()))
5108 Diag(D->
getLocation(), diag::err_objc_decls_may_only_appear_in_global_scope);
5123 Diag(DeclStart, diag::err_undef_interface) << ClassName;
5127 Diag(DeclStart, diag::err_atdef_nonfragile_interface);
5133 Context.DeepCollectObjCIvars(
Class,
true, Ivars);
5135 for (
unsigned i = 0; i < Ivars.size(); i++) {
5141 ID->getIdentifier(), ID->getType(),
5143 Decls.push_back(FD);
5148 D != Decls.end(); ++D) {
5151 SemaRef.PushOnScopeChains(FD, S);
5169 Diag(IdLoc, diag::err_arg_with_address_space);
5177 }
else if (
T->isDependentType()) {
5179 }
else if (
T->isObjCQualifiedIdType()) {
5181 Diag(IdLoc, diag::err_illegal_qualifiers_on_catch_parm);
5182 }
else if (
T->isObjCIdType()) {
5184 }
else if (!
T->isObjCObjectPointerType()) {
5186 Diag(IdLoc, diag::err_catch_param_not_objc_type);
5189 Diag(IdLoc, diag::err_catch_param_not_objc_type);
5194 New->setExceptionVariable(
true);
5201 New->setInvalidDecl();
5222 diag::err_invalid_thread)
5231 SemaRef.CheckExtraCXXDefaultArguments(D);
5246 New->setInvalidDecl();
5256 if (
New->hasAttr<BlocksAttr>())
5257 Diag(
New->getLocation(), diag::err_block_on_nonlocal);
5268 QualType QT = Context.getBaseElementType(Iv->getType());
5270 Ivars.push_back(Iv);
5279 SemaRef.ExternalSource->ReadReferencedSelectors(Sels);
5280 for (
unsigned I = 0, N = Sels.size(); I != N; ++I)
5288 !Context.AnyObjCImplementation())
5291 Selector Sel = SelectorAndLocation.first;
5294 Diag(Loc, diag::warn_unimplemented_selector) << Sel;
5301 if (
Method->isClassMethod())
5311 if ((PDecl =
Method->findPropertyDecl()))
5317 IV->getIdentifier());
5332 bool InvokedSelfMethod;
5337 InvokedSelfMethod(
false) {
5343 AccessedIvar =
true;
5349 bool VisitObjCMessageExpr(ObjCMessageExpr *E)
override {
5352 InvokedSelfMethod =
true;
5365 unsigned DIAG = diag::warn_unused_property_backing_ivar;
5375 if (CurMethod->isSynthesizedAccessorStub())
5378 UnusedBackingIvarChecker Checker(
SemaRef, CurMethod, IV);
5379 Checker.TraverseStmt(CurMethod->getBody());
5380 if (Checker.AccessedIvar)
5387 if (!IV->
isReferenced() || !Checker.InvokedSelfMethod) {
5407 if (
T->isArrayType()) {
5408 if (!
T.isConstQualified()) {
5409 if (
SemaRef.DelayedDiagnostics.shouldDelayDiagnostics())
5410 SemaRef.DelayedDiagnostics.add(
5412 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
5414 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
5419 Lifetime =
T->getObjCARCImplicitLifetime();
5421 T = Context.getLifetimeQualifiedType(
T, Lifetime);
5428 bool DoTypoCorrection) {
5434 if (!IDecl && DoTypoCorrection) {
5441 SemaRef.diagnoseTypo(
C,
PDiag(diag::err_undef_interface_suggest) << Id);
5459 unsigned kind = -1U;
5461 if (var->hasAttr<BlocksAttr>())
5463 else if (!var->hasLocalStorage())
5472 Diag(
decl->getLocation(), diag::err_arc_autoreleasing_var) << kind;
5476 if (!
type->isObjCLifetimeType())
5479 lifetime =
type->getObjCARCImplicitLifetime();
5480 type = Context.getLifetimeQualifiedType(
type, lifetime);
5487 var->getTLSKind()) {
5488 Diag(var->getLocation(), diag::err_arc_thread_ownership)
5498 return (dyn_cast_or_null<ObjCContainerDecl>(
SemaRef.CurContext));
5511 for (
unsigned i = 0; i < ivars.size(); i++) {
5513 if (Field->isInvalidDecl())
5523 InitSeq.Perform(
SemaRef, InitEntity, InitKind, {});
5524 MemberInit =
SemaRef.MaybeCreateExprWithCleanups(MemberInit);
5527 if (!MemberInit.get() || MemberInit.isInvalid())
5533 AllToInit.push_back(
Member);
5536 if (
auto *RD = Context.getBaseElementType(Field->getType())
5537 ->getAsCXXRecordDecl()) {
5540 SemaRef.CheckDestructorAccess(
5542 PDiag(diag::err_access_dtor_ivar)
5543 << Context.getBaseElementType(Field->getType()));
5556 switch (ivarVisibility) {
5558 llvm_unreachable(
"Unknown visitibility kind");
5559 case tok::objc_private:
5561 case tok::objc_public:
5563 case tok::objc_protected:
5565 case tok::objc_package:
5586 if (Context.getLangOpts().PointerAuthObjcInterfaceSel &&
5587 !
T.getPointerAuth()) {
5588 if (Context.isObjCSelType(
T.getUnqualifiedType())) {
5589 if (
auto PAQ = Context.getObjCMemberSelTypePtrAuth())
5590 T = Context.getPointerAuthType(
T, PAQ);
5597 SemaRef.VerifyBitField(Loc, II,
T,
false, BitWidth)
5606 if (
T->isReferenceType()) {
5607 Diag(Loc, diag::err_ivar_reference_type);
5612 else if (
T->isVariablyModifiedType()) {
5613 if (!
SemaRef.tryToFixVariablyModifiedVarType(
5614 TInfo,
T, Loc, diag::err_typecheck_ivar_variable_size))
5629 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
5633 EnclosingContext = IMPDecl->getClassInterface();
5634 assert(EnclosingContext &&
"Implementation has no class interface!");
5636 EnclosingContext = EnclosingDecl;
5640 Diag(Loc, diag::err_misplaced_ivar) << CDecl->IsClassExtension();
5644 EnclosingContext = EnclosingDecl;
5650 II,
T, TInfo, ac, BitWidth);
5652 if (
T->containsErrors())
5659 if (PrevDecl &&
SemaRef.isDeclInScope(PrevDecl, EnclosingContext, S) &&
5661 Diag(Loc, diag::err_duplicate_member) << II;
5668 SemaRef.ProcessDeclAttributes(S, NewID, D);
5684 SemaRef.IdResolver.AddDecl(NewID);
5689 Diag(Loc, diag::warn_ivars_in_interface);
Defines the clang::ASTContext interface.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
#define DIAG(ENUM, CLASS, DEFAULT_SEVERITY, 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
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
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)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig, ObjCTypeParamDecl *New) const
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
const LangOptions & getLangOpts() const
SelectorTable & Selectors
const clang::PrintingPolicy & getPrintingPolicy() const
void ResetObjCLayout(const ObjCInterfaceDecl *D)
CanQualType getCanonicalTypeDeclType(const TypeDecl *TD) const
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const TargetInfo & getTargetInfo() const
bool hasSameNullabilityTypeQualifier(QualType SubT, QualType SuperT, bool IsParam) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
void addObjCSubClass(const ObjCInterfaceDecl *D, const ObjCInterfaceDecl *SubClass)
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
Type source information for an attributed type.
Represents a C++ base or member initializer.
Represents a C++ destructor within a class.
SourceRange getRange() const
bool isSet() const
Deprecated.
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
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.
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".
bool isModulePrivateSpecified() const
static const TST TST_typename
ThreadStorageClassSpecifier TSCS
void ClearStorageClassSpecs()
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
TSCS getThreadStorageClassSpec() const
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 getThreadStorageClassSpecLoc() const
SourceLocation getInlineSpecLoc() const
Decl - This represents one declaration (or definition), e.g.
SourceLocation getEndLoc() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
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)
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
SourceLocation getIdentifierLoc() const
void setInvalidType(bool Val=true)
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &&attrs, SourceLocation EndLoc)
AddTypeInfo - Add a chunk to this declarator.
bool isInvalidType() const
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
const IdentifierInfo * getIdentifier() const
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
This represents one expression.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getBitWidthValue() const
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.
A simple pair of identifier info and location.
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
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
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
llvm::iterator_range< specific_decl_iterator< ObjCIvarDecl > > ivar_range
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...
specific_decl_iterator< ObjCIvarDecl > ivar_iterator
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
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)
Expr * getInstanceReceiver()
Returns the object expression (receiver) for an instance message, or null for a message that is not a...
@ Instance
The receiver is an object instance.
ReceiverKind getReceiverKind() const
Determine the kind of receiver that this message is being sent to.
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
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)
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 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 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
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.
ObjCDeclQualifier getObjCDeclQualifier() const
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 getCanonicalType() const
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.
bool hasFlexibleArrayMember() const
field_iterator field_end() const
specific_decl_iterator< FieldDecl > field_iterator
field_iterator field_begin() const
Base for LValueReferenceType and RValueReferenceType.
Scope - A scope is a transient data structure that is used while parsing the program.
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
bool hasUnrecoverableErrorOccurred() const
Determine whether any unrecoverable errors have occurred within this scope.
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.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
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)
llvm::SmallPtrSet< Selector, 8 > SelectorSet
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 FindProtocolDeclaration(bool WarnOnDeclarations, bool ForObjCContainer, ArrayRef< IdentifierLoc > ProtocolId, SmallVectorImpl< Decl * > &Protocols)
FindProtocolDeclaration - This routine looks up protocols and issues an error if they are not declare...
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.
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)
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
DeclGroupPtrTy ActOnForwardProtocolDeclaration(SourceLocation AtProtoclLoc, ArrayRef< IdentifierLoc > IdentList, const ParsedAttributesView &attrList)
ActOnForwardProtocolDeclaration - Handle @protocol foo;.
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)
Sema - This implements semantic analysis and AST building for C.
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.
ASTContext & getASTContext() const
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() 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.
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
DiagnosticsEngine & Diags
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
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
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
const ObjCObjectPointerType * getAsObjCInterfacePointerType() const
bool isScalarType() const
bool isObjCQualifiedIdType() const
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 isObjCIdType() const
bool isObjCObjectType() const
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
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 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)
static DelayedDiagnostic makeForbiddenType(SourceLocation loc, unsigned diagnostic, QualType type, unsigned argument)
Defines the clang::TargetInfo interface.
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.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
ObjCMethodFamily
A family of Objective-C methods.
@ OMF_None
No particular method family.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
@ Property
The type of a property.
ActionResult< ParsedType > TypeResult
const FunctionProtoType * T
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.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
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...
U cast(CodeGen::Address addr)
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
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)
void setHasMoreThanOneDecl(bool B)
bool hasMoreThanOneDecl() const
ObjCMethodList * getNext() const
ParsedAttributesView ArgAttrs
ArgAttrs - Attribute list for this argument.