23#include "llvm/ADT/DenseSet.h"
54 type->isObjCRetainableType()) {
69 =
property->getType().getObjCLifetime();
75 if (!expectedLifetime) {
89 property->setPropertyAttributes(
attr);
93 if (propertyLifetime == expectedLifetime)
return;
95 property->setInvalidDecl();
97 diag::err_arc_inconsistent_property_ownership)
98 <<
property->getDeclName()
108 llvm::SmallPtrSetImpl<ObjCProtocolDecl *> &Known) {
110 if (!Known.insert(Proto).second)
128 if (S.
getLangOpts().getGC() != LangOptions::NonGC) {
129 if (
T.isObjCGCWeak())
134 }
else if (
auto ownership =
T.getObjCLifetime()) {
146 llvm_unreachable(
"bad qualifier");
194 if (CDecl->IsClassExtension()) {
199 isReadWrite, Attributes,
201 T, TSI, MethodImplKind);
219 (isa<ObjCInterfaceDecl>(ClassDecl) ||
220 isa<ObjCProtocolDecl>(ClassDecl)));
229 bool FoundInSuper =
false;
238 CurrentInterfaceDecl = Super;
243 for (
auto *
P : CurrentInterfaceDecl->
protocols()) {
248 for (
auto *
P : IFace->all_referenced_protocols()) {
256 if (!Cat->IsClassExtension())
257 for (
auto *
P : Cat->protocols())
271 unsigned attributesAsWritten = 0;
310 std::pair<FileID, unsigned> locInfo =
SM.getDecomposedLoc(LParenLoc);
312 bool invalidTemp =
false;
313 StringRef file =
SM.getBufferData(locInfo.first, &invalidTemp);
316 const char *tokenBegin = file.data() + locInfo.second;
319 Lexer lexer(
SM.getLocForStartOfFile(locInfo.first),
321 file.begin(), tokenBegin, file.end());
329 }
while (Tok.
isNot(tok::r_paren));
337 bool PropagateAtomicity) {
343 if (OldIsAtomic == NewIsAtomic)
return;
349 auto Attrs =
Property->getPropertyAttributes();
358 if (
Property->getPropertyAttributesAsWritten() &
369 if (PropagateAtomicity &&
372 Attrs = Attrs & ~AtomicityMask;
384 if ((OldIsAtomic && isImplicitlyReadonlyAtomic(OldProperty)) ||
385 (NewIsAtomic && isImplicitlyReadonlyAtomic(NewProperty)))
391 if (
auto Category = dyn_cast<ObjCCategoryDecl>(OldDC))
392 OldContextName =
Category->getClassInterface()->getIdentifier();
394 OldContextName = cast<ObjCContainerDecl>(OldDC)->getIdentifier();
406 unsigned &Attributes,
const unsigned AttributesAsWritten,
QualType T,
421 bool isClassProperty =
432 Diag(AtLoc, diag::err_duplicate_property);
451 ? diag::err_use_continuation_class_redeclaration_readwrite
452 : diag::err_use_continuation_class;
463 Diag(AtLoc, diag::warn_property_redecl_getter_mismatch)
474 unsigned ExistingOwnership
477 if (ExistingOwnership && NewOwnership != ExistingOwnership) {
480 Diag(AtLoc, diag::warn_property_attr_mismatch);
485 Attributes = (Attributes & ~OwnershipMask) | ExistingOwnership;
494 Diag(AtLoc, diag::warn_property_implicitly_mismatched);
502 FD, GetterSel, GetterNameLoc,
503 SetterSel, SetterNameLoc,
505 Attributes, AttributesAsWritten,
506 T, TSI, MethodImplKind, DC);
516 bool IncompatibleObjC =
false;
526 if (!isa<ObjCObjectPointerType>(PrimaryClassPropertyT) ||
527 !isa<ObjCObjectPointerType>(ClassExtPropertyT) ||
529 PrimaryClassPropertyT, ConvertedType,
530 IncompatibleObjC)) ||
533 diag::err_type_mismatch_continuation_class) << PDecl->
getType();
553 const unsigned Attributes,
const unsigned AttributesAsWritten,
QualType T,
583 Diag(AtLoc, diag::warn_implements_nscopying) << PropertyId;
601 LParenLoc,
T, TInfo);
603 bool isClassProperty =
610 Diag(prevDecl->getLocation(), diag::note_property_declare);
620 Diag(AtLoc, diag::err_property_type) <<
T;
675 if (MethodImplKind == tok::objc_required)
677 else if (MethodImplKind == tok::objc_optional)
690 CDecl->
hasAttr<ObjCDirectMembersAttr>()) {
691 if (isa<ObjCProtocolDecl>(CDecl)) {
718 if (propertyLifetime == ivarLifetime)
return;
744 switch (propertyLifetime) {
747 <<
property->getDeclName()
754 <<
property->getDeclName()
761 << ((
property->getPropertyAttributesAsWritten() &
766 llvm_unreachable(
"properties cannot be autoreleasing");
775 S.
Diag(propertyImplLoc, diag::note_property_synthesize);
807 return (Attr1 & Kind) != (Attr2 & Kind);
812 return ((Attr1 & Kinds) != 0) != ((Attr2 & Kinds) != 0);
824 assert(isa<ObjCProtocolDecl>(
Property->getDeclContext()) &&
825 "Expected a property from a protocol");
830 PDecl->collectInheritedProtocolProperties(
Property, ProtocolSet,
835 for (
const auto *PI : SDecl->all_referenced_protocols()) {
837 PDecl->collectInheritedProtocolProperties(
Property, ProtocolSet,
840 SDecl = SDecl->getSuperClass();
844 if (Properties.empty())
848 size_t SelectedIndex = 0;
849 for (
const auto &Prop : llvm::enumerate(Properties)) {
851 if (
Property->isReadOnly() && !Prop.value()->isReadOnly()) {
853 SelectedIndex = Prop.index();
858 Properties[SelectedIndex] = OriginalProperty;
862 unsigned OriginalAttributes =
Property->getPropertyAttributesAsWritten();
864 IncompatibleType = 0,
865 HasNoExpectedAttribute,
866 HasUnexpectedAttribute,
872 struct MismatchingProperty {
875 StringRef AttributeName;
880 unsigned Attr = Prop->getPropertyAttributesAsWritten();
881 if (
Attr != OriginalAttributes) {
882 auto Diag = [&](
bool OriginalHasAttribute, StringRef AttributeName) {
883 MismatchKind Kind = OriginalHasAttribute ? HasNoExpectedAttribute
884 : HasUnexpectedAttribute;
885 Mismatches.push_back({Prop, Kind, AttributeName});
903 OriginalAttributes,
Attr,
908 "retain (or strong)");
917 if (
Property->getGetterName() != Prop->getGetterName()) {
918 Mismatches.push_back({Prop, DifferentGetter,
""});
921 if (!
Property->isReadOnly() && !Prop->isReadOnly() &&
922 Property->getSetterName() != Prop->getSetterName()) {
923 Mismatches.push_back({Prop, DifferentSetter,
""});
928 bool IncompatibleObjC =
false;
931 || IncompatibleObjC) {
932 Mismatches.push_back({Prop, IncompatibleType,
""});
938 if (Mismatches.empty())
943 bool HasIncompatibleAttributes =
false;
944 for (
const auto &
Note : Mismatches)
945 HasIncompatibleAttributes =
946 Note.Kind != IncompatibleType ?
true : HasIncompatibleAttributes;
950 Property != OriginalProperty || HasIncompatibleAttributes
951 ? diag::err_protocol_property_mismatch
952 : diag::warn_protocol_property_mismatch);
953 Diag << Mismatches[0].Kind;
954 switch (Mismatches[0].Kind) {
955 case IncompatibleType:
958 case HasNoExpectedAttribute:
959 case HasUnexpectedAttribute:
960 Diag << Mismatches[0].AttributeName;
962 case DifferentGetter:
965 case DifferentSetter:
970 for (
const auto &
Note : Mismatches) {
972 S.
Diag(
Note.Prop->getLocation(), diag::note_protocol_property_declare)
975 case IncompatibleType:
978 case HasNoExpectedAttribute:
979 case HasUnexpectedAttribute:
982 case DifferentGetter:
985 case DifferentSetter:
991 S.
Diag(AtLoc, diag::note_property_synthesize);
1013 auto OrigClass =
Category->getClassInterface();
1016 return OrigProp->getPropertyAttributesAsWritten() &
OwnershipMask;
1020 for (
const auto *Proto : OrigClass->all_referenced_protocols()) {
1023 return OrigProp->getPropertyAttributesAsWritten() &
OwnershipMask;
1038 Decl->getSelector(),
Decl->getReturnType(),
1039 Decl->getReturnTypeSourceInfo(), Impl,
Decl->isInstanceMethod(),
1040 Decl->isVariadic(),
Decl->isPropertyAccessor(),
1042 Decl->getImplementationControl(),
Decl->hasRelatedResultType());
1049 Decl->getSelectorLocs(SelLocs);
1068 if (!ClassImpDecl) {
1069 Diag(AtLoc, diag::err_missing_property_context);
1073 PropertyIvarLoc = PropertyLoc;
1083 if ((IC = dyn_cast<ObjCImplementationDecl>(ClassImpDecl))) {
1088 "ActOnPropertyImplDecl - @implementation without @interface");
1093 Diag(PropertyLoc, diag::err_bad_property_decl) << IDecl->
getDeclName();
1096 if (property->isClassProperty() && Synthesize) {
1097 Diag(PropertyLoc, diag::err_synthesize_on_class_property) << PropertyId;
1100 unsigned PIkind =
property->getPropertyAttributesAsWritten();
1104 Diag(AtLoc, diag::warn_implicit_atomic_property);
1107 Diag(property->getLocation(), diag::note_property_declare);
1111 dyn_cast<ObjCCategoryDecl>(property->getDeclContext())) {
1112 if (!CD->IsClassExtension()) {
1113 Diag(PropertyLoc, diag::err_category_property) << CD->getDeclName();
1114 Diag(property->getLocation(), diag::note_property_declare);
1119 property->hasAttr<IBOutletAttr>() && !AtLoc.
isValid()) {
1120 bool ReadWriteProperty =
false;
1126 PIkind = ExtProp->getPropertyAttributesAsWritten();
1128 ReadWriteProperty =
true;
1134 if (!ReadWriteProperty) {
1135 Diag(property->getLocation(), diag::warn_auto_readonly_iboutlet_property)
1139 property->getLParenLoc(), readonlyLoc)) {
1142 SourceRange ReadonlySourceRange(readonlyLoc, endLoc);
1143 Diag(property->getLocation(),
1144 diag::note_auto_readonly_iboutlet_fixup_suggest) <<
1149 if (Synthesize && isa<ObjCProtocolDecl>(property->getDeclContext()))
1153 }
else if ((CatImplClass = dyn_cast<ObjCCategoryImplDecl>(ClassImpDecl))) {
1155 Diag(AtLoc, diag::err_synthesize_category_decl);
1160 Diag(AtLoc, diag::err_missing_property_interface);
1171 property =
Category->FindPropertyDeclaration(PropertyId, QueryKind);
1173 Diag(PropertyLoc, diag::err_bad_category_property_decl)
1178 Diag(AtLoc, diag::err_bad_property_context);
1182 bool CompleteTypeErr =
false;
1188 PropertyIvar = PropertyId;
1192 QualType PropType =
property->getType();
1196 diag::err_incomplete_synthesized_property,
1197 property->getDeclName())) {
1198 Diag(property->getLocation(), diag::note_property_declare);
1199 CompleteTypeErr =
true;
1203 (property->getPropertyAttributesAsWritten() &
1211 bool isARCWeak =
false;
1217 Diag(PropertyDiagLoc, diag::err_gc_weak_property_strong_type);
1218 Diag(property->getLocation(), diag::note_property_declare);
1230 Diag(PropertyDiagLoc,
1232 ? diag::err_synthesizing_arc_weak_property_disabled
1233 : diag::err_synthesizing_arc_weak_property_no_runtime);
1234 Diag(property->getLocation(), diag::note_property_declare);
1236 CompleteTypeErr =
true;
1243 Diag(property->getLocation(),
1244 diag::err_arc_weak_unavailable_property)
1245 << PropertyIvarType;
1264 Diag(PropertyDiagLoc,
1265 diag::warn_autosynthesis_property_ivar_match)
1266 << PropertyId << (Ivar ==
nullptr) << PropertyIvar
1268 Diag(property->getLocation(), diag::note_property_declare);
1276 if ((
getLangOpts().ObjCAutoRefCount || isARCWeak) &&
1284 Diag(PropertyDiagLoc,
1285 diag::err_arc_objc_property_default_assign_on_object);
1286 Diag(property->getLocation(), diag::note_property_declare);
1290 assert(lifetime &&
"no lifetime for property?");
1299 PropertyIvarLoc,PropertyIvarLoc, PropertyIvar,
1300 PropertyIvarType,
nullptr,
1302 (
Expr *)
nullptr,
true);
1304 diag::err_abstract_type_in_decl,
1306 Diag(property->getLocation(), diag::note_property_declare);
1308 CompleteTypeErr =
true;
1310 if (!CompleteTypeErr) {
1313 Diag(PropertyIvarLoc, diag::err_synthesize_variable_sized_ivar)
1314 << PropertyIvarType;
1315 CompleteTypeErr =
true;
1318 if (CompleteTypeErr)
1324 Diag(PropertyDiagLoc, diag::err_missing_property_ivar_decl)
1330 Diag(PropertyDiagLoc, diag::err_ivar_in_superclass_use)
1337 property->setPropertyIvarDecl(Ivar);
1342 if (!Context.
hasSameType(PropertyIvarType, IvarType)) {
1343 if (isa<ObjCObjectPointerType>(PropertyIvarType)
1344 && isa<ObjCObjectPointerType>(IvarType))
1350 PropertyIvarLoc, PropertyIvarType, IvarType) ==
1354 Diag(PropertyDiagLoc, diag::err_property_ivar_type)
1355 <<
property->getDeclName() << PropType
1367 if (lhsType != rhsType &&
1369 Diag(PropertyDiagLoc, diag::err_property_ivar_type)
1370 <<
property->getDeclName() << PropType
1379 Diag(PropertyDiagLoc, diag::err_weak_property)
1380 <<
property->getDeclName() << Ivar->
getDeclName();
1385 if ((property->getType()->isObjCObjectPointerType() ||
1388 Diag(PropertyDiagLoc, diag::err_strong_property)
1389 <<
property->getDeclName() << Ivar->
getDeclName();
1393 if (
getLangOpts().ObjCAutoRefCount || isARCWeak ||
1396 }
else if (PropertyIvar)
1398 Diag(PropertyDiagLoc, diag::err_dynamic_property_ivar_decl);
1400 assert (property &&
"ActOnPropertyImplDecl - property declaration missing");
1405 Ivar, PropertyIvarLoc);
1407 if (CompleteTypeErr || !compat)
1410 if (
ObjCMethodDecl *getterMethod = property->getGetterMethodDecl()) {
1411 getterMethod->createImplicitParams(Context, IDecl);
1417 getterMethod->getSelector(), getterMethod->isInstanceMethod());
1436 Context, SelfDecl->
getType(), CK_LValueToRValue, SelfExpr,
nullptr,
1443 LoadSelfExpr,
true,
true);
1446 getterMethod->getReturnType()),
1447 PropertyDiagLoc, IvarRefExpr);
1455 if (property->hasAttr<NSReturnsNotRetainedAttr>() &&
1456 !getterMethod->hasAttr<NSReturnsNotRetainedAttr>()) {
1457 Diag(getterMethod->getLocation(),
1458 diag::warn_property_getter_owning_mismatch);
1459 Diag(property->getLocation(), diag::note_property_declare);
1462 switch (getterMethod->getMethodFamily()) {
1467 Diag(getterMethod->getLocation(), diag::err_arc_illegal_method_def)
1468 << 1 << getterMethod->getSelector();
1475 if (
ObjCMethodDecl *setterMethod = property->getSetterMethodDecl()) {
1476 setterMethod->createImplicitParams(Context, IDecl);
1481 setterMethod->getSelector(), setterMethod->isInstanceMethod());
1484 AtLoc, PropertyLoc);
1498 Context, SelfDecl->
getType(), CK_LValueToRValue, SelfExpr,
nullptr,
1505 LoadSelfExpr,
true,
true);
1514 if (property->getPropertyAttributes() &
1518 dyn_cast_or_null<CXXOperatorCallExpr>(
callExpr))
1519 if (
const FunctionDecl *FuncDecl = CXXCE->getDirectCallee())
1520 if (!FuncDecl->isTrivial())
1521 if (property->getType()->isReferenceType()) {
1522 Diag(PropertyDiagLoc,
1523 diag::err_atomic_property_nontrivial_assign_op)
1524 <<
property->getType();
1525 Diag(FuncDecl->getBeginLoc(), diag::note_callee_decl)
1537 Diag(PropertyLoc, diag::err_duplicate_ivar_use)
1538 << PropertyId << PPIDecl->getPropertyDecl()->getIdentifier()
1540 Diag(PPIDecl->getLocation(), diag::note_previous_use);
1545 Diag(PropertyLoc, diag::err_property_implemented) << PropertyId;
1546 Diag(PPIDecl->getLocation(), diag::note_previous_declaration);
1561 if (PropertyIvar && PropertyIvar != PropertyId)
1576 Diag(PropertyDiagLoc, diag::err_duplicate_ivar_use)
1577 << PropertyId << PPIDecl->getPropertyDecl()->getIdentifier()
1579 Diag(PPIDecl->getLocation(), diag::note_previous_use);
1584 Diag(PropertyDiagLoc, diag::err_property_implemented) << PropertyId;
1585 Diag(PPIDecl->getLocation(), diag::note_previous_declaration);
1594 Diag(PropertyLoc, diag::err_objc_direct_dynamic_property);
1596 diag::note_previous_declaration);
1613 bool OverridingProtocolProperty) {
1621 if (!OverridingProtocolProperty &&
1627 Diag(
Property->getLocation(), diag::warn_readonly_property)
1628 <<
Property->getDeclName() << inheritedName;
1631 Diag(
Property->getLocation(), diag::warn_property_attribute)
1632 <<
Property->getDeclName() <<
"copy" << inheritedName;
1638 bool CStrong = (CAttrRetain != 0);
1639 bool SStrong = (SAttrRetain != 0);
1640 if (CStrong != SStrong)
1641 Diag(
Property->getLocation(), diag::warn_property_attribute)
1642 <<
Property->getDeclName() <<
"retain (or strong)" << inheritedName;
1655 Diag(
Property->getLocation(), diag::warn_property_attribute)
1656 <<
Property->getDeclName() <<
"setter" << inheritedName;
1660 Diag(
Property->getLocation(), diag::warn_property_attribute)
1661 <<
Property->getDeclName() <<
"getter" << inheritedName;
1673 bool IncompatibleObjC =
false;
1676 IncompatibleObjC) ||
1678 Diag(
Property->getLocation(), diag::warn_property_types_are_incompatible)
1693 property->getType().getNonReferenceType().getAtomicUnqualifiedType();
1694 bool compat = Context.
hasSameType(PropertyRValueType, GetterType);
1698 if ((propertyObjCPtr =
1704 Diag(
Loc, diag::err_property_accessor_type)
1705 <<
property->getDeclName() << PropertyRValueType
1719 Diag(
Loc, diag::warn_accessor_property_type_mismatch)
1720 <<
property->getDeclName()
1735 bool CollectClassPropsOnly =
false,
1736 bool IncludeProtocols =
true) {
1738 for (
auto *Prop : IDecl->properties()) {
1739 if (CollectClassPropsOnly && !Prop->isClassProperty())
1741 PropMap[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] =
1746 for (
auto *Ext : IDecl->visible_extensions())
1748 CollectClassPropsOnly, IncludeProtocols);
1750 if (IncludeProtocols) {
1752 for (
auto *PI : IDecl->all_referenced_protocols())
1754 CollectClassPropsOnly);
1758 for (
auto *Prop : CATDecl->properties()) {
1759 if (CollectClassPropsOnly && !Prop->isClassProperty())
1761 PropMap[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] =
1764 if (IncludeProtocols) {
1766 for (
auto *PI : CATDecl->protocols())
1768 CollectClassPropsOnly);
1772 for (
auto *Prop : PDecl->properties()) {
1773 if (CollectClassPropsOnly && !Prop->isClassProperty())
1776 SuperPropMap[std::make_pair(Prop->getIdentifier(),
1777 Prop->isClassProperty())];
1780 if (!PropertyFromSuper ||
1781 PropertyFromSuper->
getIdentifier() != Prop->getIdentifier()) {
1783 PropMap[std::make_pair(Prop->getIdentifier(),
1784 Prop->isClassProperty())];
1790 for (
auto *PI : PDecl->protocols())
1792 CollectClassPropsOnly);
1803 SDecl->collectPropertiesToImplement(PropMap);
1804 SDecl = SDecl->getSuperClass();
1827 (
Property->getPropertyIvarDecl() == IV))
1833 for (
const auto *
Property : Ext->instance_properties())
1836 (
Property->getPropertyIvarDecl() == IV))
1843 bool SuperClassImplementsGetter =
false;
1844 bool SuperClassImplementsSetter =
false;
1846 SuperClassImplementsSetter =
true;
1851 SuperClassImplementsGetter =
true;
1854 SuperClassImplementsSetter =
true;
1855 if (SuperClassImplementsGetter && SuperClassImplementsSetter)
1870 if (PropMap.empty())
1875 for (
const auto &PropEntry : PropMap) {
1887 if (ImpMethod && !ImpMethod->
getBody()) {
1891 if (ImpMethod && !ImpMethod->
getBody())
1896 Diag(Prop->
getLocation(), diag::warn_no_autosynthesis_shared_ivar_property)
1898 if (PID->getLocation().isValid())
1899 Diag(PID->getLocation(), diag::note_property_synthesize);
1913 diag::warn_auto_synthesizing_protocol_property)
1917 (Twine(
"@synthesize ") + Prop->
getName() +
";\n\n").str();
1918 Diag(AtEnd, diag::note_add_synthesize_directive)
1924 if (PropInSuperClass) {
1935 Diag(Prop->
getLocation(), diag::warn_autosynthesis_property_in_superclass)
1968 if (!IDecl->isObjCRequiresPropertyDefs())
1987 if (I ==
SMap.end() &&
1988 (PrimaryClass ==
nullptr ||
1992 isa<ObjCCategoryDecl>(CDecl)
1994 ? diag::warn_impl_required_in_category_for_class_property
1995 : diag::warn_setter_getter_impl_required_in_category)
1997 ? diag::warn_impl_required_for_class_property
1998 : diag::warn_setter_getter_impl_required);
2001 if (S.
LangOpts.ObjCDefaultSynthProperties &&
2005 S.
Diag(RID->getLocation(), diag::note_suppressed_class_declare);
2011 bool SynthesizeProperties) {
2025 if ((IDecl =
C->getClassInterface())) {
2034 SynthesizeProperties);
2040 std::unique_ptr<ObjCContainerDecl::PropertyMap> LazyMap;
2043 if (!PDecl->hasAttr<ObjCExplicitProtocolImplAttr>())
2061 for (
auto *PropDecl : PDecl->properties()) {
2062 if ((*LazyMap)[std::make_pair(PropDecl->getIdentifier(),
2063 PropDecl->isClassProperty())])
2065 PropMap[std::make_pair(PropDecl->getIdentifier(),
2066 PropDecl->isClassProperty())] = PropDecl;
2071 if (PropMap.empty())
2074 llvm::DenseSet<ObjCPropertyDecl *> PropImplMap;
2076 PropImplMap.insert(I->getPropertyDecl());
2080 for (
const auto *I : IMPDecl->
methods())
2085 if (
C && !
C->IsClassExtension())
2086 if ((PrimaryClass =
C->getClassInterface()))
2092 for (
const auto *I : IMP->methods())
2096 for (ObjCContainerDecl::PropertyMap::iterator
2097 P = PropMap.begin(),
E = PropMap.end();
P !=
E; ++
P) {
2102 PropImplMap.count(Prop) ||
2108 IMPDecl, CDecl,
C, Prop, InsMap);
2119 const auto *
property = propertyImpl->getPropertyDecl();
2122 if (propertyImpl->getPropertyImplementation() ==
2124 (property->getPropertyAttributes() &
2126 property->getGetterMethodDecl() && property->getSetterMethodDecl()) {
2127 auto *getterImpl = propertyImpl->getGetterMethodDecl();
2128 auto *setterImpl = propertyImpl->getSetterMethodDecl();
2129 if ((!getterImpl || getterImpl->isSynthesizedAccessorStub()) &&
2130 (!setterImpl || setterImpl->isSynthesizedAccessorStub())) {
2135 Diag(loc, diag::warn_null_resettable_setter)
2136 << setterImpl->getSelector() <<
property->getDeclName();
2149 PM[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] = Prop;
2151 for (
auto *Prop : Ext->properties())
2152 PM[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] = Prop;
2154 for (ObjCContainerDecl::PropertyMap::iterator I = PM.begin(),
E = PM.end();
2160 unsigned Attributes =
Property->getPropertyAttributes();
2161 unsigned AttributesAsWritten =
Property->getPropertyAttributesAsWritten();
2165 GetterMethod =
Property->isClassProperty() ?
2168 SetterMethod =
Property->isClassProperty() ?
2172 GetterMethod =
nullptr;
2174 SetterMethod =
nullptr;
2177 diag::warn_default_atomic_custom_getter_setter)
2179 Diag(
Property->getLocation(), diag::note_property_declare);
2183 diag::warn_default_atomic_custom_getter_setter)
2185 Diag(
Property->getLocation(), diag::note_property_declare);
2197 GetterMethod = PIDecl->getGetterMethodDecl();
2198 SetterMethod = PIDecl->getSetterMethodDecl();
2200 GetterMethod =
nullptr;
2202 SetterMethod =
nullptr;
2203 if ((
bool)GetterMethod ^ (
bool)SetterMethod) {
2206 : SetterMethod->getLocation());
2207 Diag(MethodLoc, diag::warn_atomic_property_rule)
2208 <<
Property->getIdentifier() << (GetterMethod !=
nullptr)
2209 << (SetterMethod !=
nullptr);
2211 if (
Property->getLParenLoc().isValid() &&
2216 StringRef NonatomicStr = AttributesAsWritten?
"nonatomic, "
2219 diag::note_atomic_property_fixup_suggest)
2221 }
else if (
Property->getLParenLoc().isInvalid()) {
2224 Property->getTypeSourceInfo()->getTypeLoc().getBeginLoc();
2226 diag::note_atomic_property_fixup_suggest)
2229 Diag(MethodLoc, diag::note_atomic_property_fixup_suggest);
2230 Diag(
Property->getLocation(), diag::note_property_declare);
2241 for (
const auto *PID :
D->property_impls()) {
2243 if (PD && !PD->
hasAttr<NSReturnsNotRetainedAttr>() &&
2263 for (
auto *getterRedecl : method->
redecls()) {
2264 if (getterRedecl->isImplicit())
2268 noteLoc = getterRedecl->getLocation();
2269 fixItLoc = getterRedecl->getEndLoc();
2274 tok::kw___attribute, tok::l_paren, tok::l_paren,
2277 tok::r_paren, tok::r_paren
2279 StringRef spelling =
"__attribute__((objc_method_family(none)))";
2281 if (!macroName.empty())
2282 spelling = macroName;
2284 auto noteDiag =
Diag(noteLoc, diag::note_cocoa_naming_declare_family)
2288 fixItText += spelling;
2305 if (I->getMethodFamily() ==
OMF_init)
2306 InitSelSet.insert(I->getSelector());
2311 I = DesignatedInits.begin(),
E = DesignatedInits.end(); I !=
E; ++I) {
2316 bool Ignore =
false;
2322 if (
auto *IMD = Ext->getInstanceMethod(MD->
getSelector())) {
2323 Ignore = IMD->isUnavailable();
2329 diag::warn_objc_implementation_missing_designated_init_override)
2342 for (
const auto *A :
Property->attrs()) {
2343 if (isa<DeprecatedAttr>(A) ||
2344 isa<UnavailableAttr>(A) ||
2345 isa<AvailabilityAttr>(A))
2361 bool IsClassProperty =
property->isClassProperty();
2362 GetterMethod = IsClassProperty ?
2370 if (CatDecl->IsClassExtension())
2373 CatDecl->getClassInterface()->
2376 SetterMethod = IsClassProperty ?
2381 if (CatDecl->IsClassExtension())
2384 CatDecl->getClassInterface()->
2391 if (!GetterMethod) {
2393 auto *ExistingGetter = CatDecl->getClassInterface()->lookupMethod(
2394 property->
getGetterName(), !IsClassProperty,
true,
false, CatDecl);
2395 if (ExistingGetter) {
2398 <<
property->isDirectProperty() << 1
2399 << ExistingGetter->isDirectMethod()
2400 << ExistingGetter->getDeclName();
2401 Diag(ExistingGetter->getLocation(), diag::note_previous_declaration);
2407 if (!property->
isReadOnly() && !SetterMethod) {
2409 auto *ExistingSetter = CatDecl->getClassInterface()->lookupMethod(
2410 property->
getSetterName(), !IsClassProperty,
true,
false, CatDecl);
2411 if (ExistingSetter) {
2414 <<
property->isDirectProperty() << 1
2415 << ExistingSetter->isDirectMethod()
2416 << ExistingSetter->getDeclName();
2417 Diag(ExistingSetter->getLocation(), diag::note_previous_declaration);
2423 if (!property->
isReadOnly() && SetterMethod) {
2429 (*SetterMethod->
param_begin())->getType().getNonReferenceType(),
2432 diag::warn_accessor_property_type_mismatch)
2433 <<
property->getDeclName()
2445 if (!GetterMethod) {
2453 QualType resultTy =
property->getType().getAtomicUnqualifiedType();
2462 modifiedTy, modifiedTy);
2468 !IsClassProperty,
false,
2479 GetterMethod->
addAttr(ObjCDirectAttr::CreateImplicit(Context,
Loc));
2481 if (property->
hasAttr<NSReturnsNotRetainedAttr>())
2482 GetterMethod->
addAttr(NSReturnsNotRetainedAttr::CreateImplicit(Context,
2485 if (property->
hasAttr<ObjCReturnsInnerPointerAttr>())
2487 ObjCReturnsInnerPointerAttr::CreateImplicit(Context,
Loc));
2489 if (
const SectionAttr *SA = property->
getAttr<SectionAttr>())
2490 GetterMethod->
addAttr(SectionAttr::CreateImplicit(
2491 Context, SA->getName(),
Loc, SectionAttr::GNU_section));
2504 property->setGetterMethodDecl(GetterMethod);
2509 if (!SetterMethod) {
2518 CD, !IsClassProperty,
2530 property->getType().getUnqualifiedType().getAtomicUnqualifiedType();
2540 modifiedTy, modifiedTy);
2558 SetterMethod->
addAttr(ObjCDirectAttr::CreateImplicit(Context,
Loc));
2561 if (
const SectionAttr *SA = property->
getAttr<SectionAttr>())
2562 SetterMethod->
addAttr(SectionAttr::CreateImplicit(
2563 Context, SA->getName(),
Loc, SectionAttr::GNU_section));
2578 property->setSetterMethodDecl(SetterMethod);
2592 if (!IsClassProperty) {
2605 if (!CurrentClass) {
2607 CurrentClass = Cat->getClassInterface();
2608 else if (
ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(CD))
2609 CurrentClass = Impl->getClassInterface();
2618 unsigned &Attributes,
2619 bool propertyInPrimaryClass) {
2626 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2627 <<
"readonly" <<
"readwrite";
2638 !PropertyDecl->
hasAttr<ObjCNSObjectAttr>()) {
2639 Diag(
Loc, diag::err_objc_property_requires_object)
2644 :
"retain (or strong)");
2657 Diag(
Loc, diag::warn_objc_property_assign_on_object);
2663 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2664 <<
"assign" <<
"copy";
2665 Attributes &= ~ObjCPropertyAttribute::kind_copy;
2668 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2669 <<
"assign" <<
"retain";
2670 Attributes &= ~ObjCPropertyAttribute::kind_retain;
2673 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2674 <<
"assign" <<
"strong";
2675 Attributes &= ~ObjCPropertyAttribute::kind_strong;
2679 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2680 <<
"assign" <<
"weak";
2681 Attributes &= ~ObjCPropertyAttribute::kind_weak;
2683 if (PropertyDecl->
hasAttr<IBOutletCollectionAttr>())
2684 Diag(
Loc, diag::warn_iboutletcollection_property_assign);
2687 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2688 <<
"unsafe_unretained" <<
"copy";
2689 Attributes &= ~ObjCPropertyAttribute::kind_copy;
2692 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2693 <<
"unsafe_unretained" <<
"retain";
2694 Attributes &= ~ObjCPropertyAttribute::kind_retain;
2697 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2698 <<
"unsafe_unretained" <<
"strong";
2699 Attributes &= ~ObjCPropertyAttribute::kind_strong;
2703 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2704 <<
"unsafe_unretained" <<
"weak";
2705 Attributes &= ~ObjCPropertyAttribute::kind_weak;
2709 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2710 <<
"copy" <<
"retain";
2711 Attributes &= ~ObjCPropertyAttribute::kind_retain;
2714 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2715 <<
"copy" <<
"strong";
2716 Attributes &= ~ObjCPropertyAttribute::kind_strong;
2719 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2720 <<
"copy" <<
"weak";
2721 Attributes &= ~ObjCPropertyAttribute::kind_weak;
2725 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive) <<
"retain"
2727 Attributes &= ~ObjCPropertyAttribute::kind_retain;
2730 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive) <<
"strong"
2732 Attributes &= ~ObjCPropertyAttribute::kind_weak;
2739 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2740 <<
"nonnull" <<
"weak";
2746 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive) <<
"atomic"
2748 Attributes &= ~ObjCPropertyAttribute::kind_atomic;
2767 else if (propertyInPrimaryClass) {
2772 Diag(
Loc, diag::warn_objc_property_no_assignment_attribute);
2776 Diag(
Loc, diag::warn_objc_property_default_assign_on_object);
2788 Diag(
Loc, diag::warn_objc_property_copy_missing_on_block);
2793 Diag(
Loc, diag::warn_objc_property_retain_of_block);
2797 Diag(
Loc, diag::warn_objc_readonly_property_has_setter);
llvm::DenseMap< const Stmt *, CFGBlock * > SMap
enum clang::sema::@1714::IndirectLocalPathEntry::EntryKind Kind
Defines the clang::Expr interface and subclasses for C++ expressions.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
Defines the clang::Preprocessor interface.
static bool SuperClassImplementsProperty(ObjCInterfaceDecl *IDecl, ObjCPropertyDecl *Prop)
static bool areIncompatiblePropertyAttributes(unsigned Attr1, unsigned Attr2, unsigned Kinds)
static Qualifiers::ObjCLifetime getImpliedARCOwnership(ObjCPropertyAttribute::Kind attrs, QualType type)
getImpliedARCOwnership - Given a set of property attributes and a type, infer an expected lifetime.
static void checkARCPropertyImpl(Sema &S, SourceLocation propertyImplLoc, ObjCPropertyDecl *property, ObjCIvarDecl *ivar)
static bool LocPropertyAttribute(ASTContext &Context, const char *attrName, SourceLocation LParenLoc, SourceLocation &Loc)
static void AddPropertyAttrs(Sema &S, ObjCMethodDecl *PropertyMethod, ObjCPropertyDecl *Property)
AddPropertyAttrs - Propagates attributes from a property to the implicitly-declared getter or setter ...
static void checkPropertyDeclWithOwnership(Sema &S, ObjCPropertyDecl *property)
Check the internal consistency of a property declaration with an explicit ownership qualifier.
static unsigned deducePropertyOwnershipFromType(Sema &S, QualType T)
static void CollectImmediateProperties(ObjCContainerDecl *CDecl, ObjCContainerDecl::PropertyMap &PropMap, ObjCContainerDecl::PropertyMap &SuperPropMap, bool CollectClassPropsOnly=false, bool IncludeProtocols=true)
CollectImmediateProperties - This routine collects all properties in the class and its conforming pro...
static void checkAtomicPropertyMismatch(Sema &S, ObjCPropertyDecl *OldProperty, ObjCPropertyDecl *NewProperty, bool PropagateAtomicity)
Check for a mismatch in the atomicity of the given properties.
static void setImpliedPropertyAttributeForReadOnlyProperty(ObjCPropertyDecl *property, ObjCIvarDecl *ivar)
setImpliedPropertyAttributeForReadOnlyProperty - This routine evaludates life-time attributes for a '...
static unsigned getOwnershipRule(unsigned attr)
static ObjCMethodDecl * RedeclarePropertyAccessor(ASTContext &Context, ObjCImplementationDecl *Impl, ObjCMethodDecl *AccessorDecl, SourceLocation AtLoc, SourceLocation PropertyLoc)
Create a synthesized property accessor stub inside the @implementation.
static bool hasWrittenStorageAttribute(ObjCPropertyDecl *Prop, ObjCPropertyQueryKind QueryKind)
Determine whether any storage attributes were written on the property.
static void CollectSuperClassPropertyImplementations(ObjCInterfaceDecl *CDecl, ObjCInterfaceDecl::PropertyMap &PropMap)
CollectSuperClassPropertyImplementations - This routine collects list of properties to be implemented...
static const unsigned OwnershipMask
static void DiagnoseUnimplementedAccessor(Sema &S, ObjCInterfaceDecl *PrimaryClass, Selector Method, ObjCImplDecl *IMPDecl, ObjCContainerDecl *CDecl, ObjCCategoryDecl *C, ObjCPropertyDecl *Prop, llvm::SmallPtrSet< const ObjCMethodDecl *, 8 > &SMap)
static ObjCPropertyDecl * SelectPropertyForSynthesisFromProtocols(Sema &S, SourceLocation AtLoc, ObjCInterfaceDecl *ClassDecl, ObjCPropertyDecl *Property)
SelectPropertyForSynthesisFromProtocols - Finds the most appropriate property declaration that should...
static void CheckPropertyAgainstProtocol(Sema &S, ObjCPropertyDecl *Prop, ObjCProtocolDecl *Proto, llvm::SmallPtrSetImpl< ObjCProtocolDecl * > &Known)
Check this Objective-C property against a property declared in the given protocol.
static ObjCPropertyAttribute::Kind makePropertyAttributesAsWritten(unsigned Attributes)
static bool isIncompatiblePropertyAttribute(unsigned Attr1, unsigned Attr2, ObjCPropertyAttribute::Kind Kind)
This file declares semantic analysis for Objective-C.
Defines the SourceManager interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
bool propertyTypesAreCompatible(QualType, QualType)
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
const LangOptions & getLangOpts() const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const
Return the uniqued reference to the type for an Objective-C gc-qualified type.
Attr - This represents one attribute.
static std::optional< NullabilityKind > stripOuterNullability(QualType &T)
Strip off the top-level nullability annotation on the given type, if it's there.
A call to an overloaded operator written using operator syntax.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
void addDecl(Decl *D)
Add the declaration D into this context.
A reference to a declared variable, function, enum, etc.
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.
void setAttrs(const AttrVec &Attrs)
bool isUnavailable(std::string *Message=nullptr) const
Determine whether this declaration is marked 'unavailable'.
AvailabilityResult getAvailability(std::string *Message=nullptr, VersionTuple EnclosingVersion=VersionTuple(), StringRef *RealizedPlatform=nullptr) const
Determine the availability of the given declaration.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isInvalidDecl() const
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
void setLexicalDeclContext(DeclContext *DC)
SourceLocation getIdentifierLoc() const
void setObjCWeakProperty(bool Val=true)
const IdentifierInfo * getIdentifier() const
This represents one expression.
Represents difference between two FPOptions values.
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 CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
static InitializedEntity InitializeResult(SourceLocation ReturnLoc, QualType Type)
Create the initialization entity for the result of a function.
clang::ObjCRuntime ObjCRuntime
Lexer - This provides a simple interface that turns a text buffer into a stream of tokens.
bool LexFromRawLexer(Token &Result)
LexFromRawLexer - Lex a token from a designated raw lexer (one with no associated preprocessor object...
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
ObjCCategoryDecl - Represents a category declaration.
ObjCInterfaceDecl * getClassInterface()
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCContainerDecl - Represents a container for method declarations.
ObjCMethodDecl * getMethod(Selector Sel, bool isInstance, bool AllowHidden=false) const
method_range methods() const
llvm::MapVector< std::pair< IdentifierInfo *, unsigned >, ObjCPropertyDecl * > PropertyMap
instmeth_range instance_methods() const
llvm::SmallDenseSet< const ObjCProtocolDecl *, 8 > ProtocolPropertySet
ObjCPropertyDecl * getProperty(const IdentifierInfo *Id, bool IsInstance) const
instprop_range instance_properties() const
ObjCPropertyDecl * FindPropertyDeclaration(const IdentifierInfo *PropertyId, ObjCPropertyQueryKind QueryKind) const
FindPropertyDeclaration - Finds declaration of the property given its name in 'PropertyId' and return...
ObjCMethodDecl * getClassMethod(Selector Sel, bool AllowHidden=false) const
prop_range properties() const
ObjCMethodDecl * getInstanceMethod(Selector Sel, bool AllowHidden=false) const
bool HasUserDeclaredSetterMethod(const ObjCPropertyDecl *P) const
This routine returns 'true' if a user declared setter method was found in the class,...
Captures information about "declaration specifiers" specific to Objective-C.
ObjCPropertyAttribute::Kind getPropertyAttributes() const
SourceLocation getGetterNameLoc() const
SourceLocation getSetterNameLoc() const
void addPropertyImplementation(ObjCPropertyImplDecl *property)
propimpl_range property_impls() const
ObjCPropertyImplDecl * FindPropertyImplDecl(IdentifierInfo *propertyId, ObjCPropertyQueryKind queryKind) const
FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl added to the list of thos...
const ObjCInterfaceDecl * getClassInterface() const
ObjCPropertyImplDecl * FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const
FindPropertyImplIvarDecl - This method lookup the ivar in the list of properties implemented in this ...
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
ObjCPropertyDecl * FindPropertyVisibleInPrimaryClass(const IdentifierInfo *PropertyId, ObjCPropertyQueryKind QueryKind) const
FindPropertyVisibleInPrimaryClass - Finds declaration of the property with name 'PropertyId' in the p...
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
all_protocol_range all_referenced_protocols() const
visible_extensions_range visible_extensions() const
ObjCCategoryDecl * FindCategoryDeclaration(const IdentifierInfo *CategoryId) const
FindCategoryDeclaration - Finds category declaration in the list of categories for this class and ret...
protocol_range protocols() const
const ObjCInterfaceDecl * isObjCRequiresPropertyDefs() const
isObjCRequiresPropertyDefs - Checks that a class or one of its super classes must not be auto-synthes...
ObjCMethodDecl * lookupPropertyAccessor(const Selector Sel, const ObjCCategoryDecl *Cat, bool IsClassProperty) const
Lookup a setter or getter in the class hierarchy, including in all categories except for category pas...
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,...
bool ClassImplementsProtocol(ObjCProtocolDecl *lProto, bool lookupCategory, bool RHSIsQualifiedID=false)
ClassImplementsProtocol - Checks that 'lProto' protocol has been implemented in IDecl class,...
ObjCImplementationDecl * getImplementation() const
bool hasDesignatedInitializers() const
Returns true if this interface decl contains at least one initializer marked with the 'objc_designate...
void getDesignatedInitializers(llvm::SmallVectorImpl< const ObjCMethodDecl * > &Methods) const
Returns the designated initializers for the interface.
void collectPropertiesToImplement(PropertyMap &PM) const override
This routine collects list of properties to be implemented in the class.
bool isArcWeakrefUnavailable() const
isArcWeakrefUnavailable - Checks for a class or one of its super classes to be incompatible with __we...
ObjCInterfaceDecl * getSuperClass() const
known_extensions_range known_extensions() const
ObjCIvarDecl - Represents an ObjC instance variable.
AccessControl getAccessControl() const
bool getSynthesize() const
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)
QualType getUsageType(QualType objectType) const
Retrieve the type of this instance variable when viewed as a member of a specific object type.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
ObjCMethodDecl - Represents an instance or class method declaration.
void setDefined(bool isDefined)
unsigned param_size() const
void setSelfDecl(ImplicitParamDecl *SD)
bool isPropertyAccessor() const
static ObjCMethodDecl * Create(ASTContext &C, SourceLocation beginLoc, SourceLocation endLoc, Selector SelInfo, QualType T, TypeSourceInfo *ReturnTInfo, DeclContext *contextDecl, bool isInstance=true, bool isVariadic=false, bool isPropertyAccessor=false, bool isSynthesizedAccessorStub=false, bool isImplicitlyDeclared=false, bool isDefined=false, ObjCImplementationControl impControl=ObjCImplementationControl::None, bool HasRelatedResultType=false)
param_const_iterator param_begin() const
void setCmdDecl(ImplicitParamDecl *CD)
Stmt * getBody() const override
Retrieve the body of this method, if it has one.
void setMethodParams(ASTContext &C, ArrayRef< ParmVarDecl * > Params, ArrayRef< SourceLocation > SelLocs={})
Sets the method's parameters and selector source locations.
bool isSynthesizedAccessorStub() const
void setPropertyAccessor(bool isAccessor)
Selector getSelector() const
bool isInstanceMethod() const
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
bool isClassMethod() const
ObjCInterfaceDecl * getClassInterface()
Represents a pointer to an Objective C object.
Represents one property declaration in an Objective-C interface.
ObjCPropertyQueryKind getQueryKind() const
bool isClassProperty() const
void setPropertyImplementation(PropertyControl pc)
void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())
ObjCMethodDecl * getGetterMethodDecl() const
bool isInstanceProperty() const
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)
bool isReadOnly() const
isReadOnly - Return true iff the property has a setter.
static ObjCPropertyDecl * findPropertyDecl(const DeclContext *DC, const IdentifierInfo *propertyID, ObjCPropertyQueryKind queryKind)
Lookup a property by name in the specified DeclContext.
bool isDirectProperty() const
Selector getSetterName() const
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)
void overwritePropertyAttributes(unsigned PRVal)
Selector getGetterName() const
ObjCPropertyAttribute::Kind getPropertyAttributesAsWritten() const
IdentifierInfo * getDefaultSynthIvarName(ASTContext &Ctx) const
Get the default name of the synthesized ivar.
ObjCPropertyAttribute::Kind getPropertyAttributes() const
static ObjCPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, SourceLocation AtLocation, SourceLocation LParenLocation, QualType T, TypeSourceInfo *TSI, PropertyControl propControl=None)
void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())
PropertyControl getPropertyImplementation() const
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Kind getPropertyImplementation() const
void setSetterMethodDecl(ObjCMethodDecl *MD)
ObjCPropertyDecl * getPropertyDecl() const
void setSetterCXXAssignment(Expr *setterCXXAssignment)
static ObjCPropertyImplDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation atLoc, SourceLocation L, ObjCPropertyDecl *property, Kind PK, ObjCIvarDecl *ivarDecl, SourceLocation ivarLoc)
void setGetterMethodDecl(ObjCMethodDecl *MD)
void setGetterCXXConstructor(Expr *getterCXXConstructor)
Represents an Objective-C protocol declaration.
ObjCProtocolDecl * getDefinition()
Retrieve the definition of this protocol, if any.
protocol_range protocols() const
The basic abstraction for the target Objective-C runtime.
bool isNonFragile() const
Does this runtime follow the set of implied behaviors for a "non-fragile" ABI?
bool allowsDirectDispatch() const
Does this runtime supports direct dispatch.
bool isFragile() const
The inverse of isNonFragile(): does this runtime follow the set of implied behaviors for a "fragile" ...
Represents a parameter to a function.
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
StringRef getLastMacroWithSpelling(SourceLocation Loc, ArrayRef< TokenValue > Tokens) const
Return the name of the macro defined before Loc that has spelling Tokens.
A (possibly-)qualified type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
bool isObjCGCStrong() const
true when Type is objc's strong.
bool isObjCGCWeak() const
true when Type is objc's weak.
The collection of all-type qualifiers we support.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
bool hasObjCLifetime() const
void addObjCLifetime(ObjCLifetime type)
void setObjCLifetime(ObjCLifetime type)
bool hasFlexibleArrayMember() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Scope - A scope is a transient data structure that is used while parsing the program.
Smart pointer class that efficiently represents Objective-C method names.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
void DefaultSynthesizeProperties(Scope *S, ObjCImplDecl *IMPDecl, ObjCInterfaceDecl *IDecl, SourceLocation AtEnd)
DefaultSynthesizeProperties - This routine default synthesizes all properties which must be synthesiz...
bool DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *PD, ObjCMethodDecl *Getter, SourceLocation Loc)
void ProcessPropertyDecl(ObjCPropertyDecl *property)
Process the specified property declaration and create decls for the setters and getters as needed.
ObjCPropertyDecl * HandlePropertyInClassExtension(Scope *S, SourceLocation AtLoc, SourceLocation LParenLoc, FieldDeclarator &FD, Selector GetterSel, SourceLocation GetterNameLoc, Selector SetterSel, SourceLocation SetterNameLoc, const bool isReadWrite, unsigned &Attributes, const unsigned AttributesAsWritten, QualType T, TypeSourceInfo *TSI, tok::ObjCKeywordKind MethodImplKind)
Called by ActOnProperty to handle @property declarations in class extensions.
void diagnoseNullResettableSynthesizedSetters(const ObjCImplDecl *impDecl)
Diagnose any null-resettable synthesized setters.
ObjCPropertyDecl * CreatePropertyDecl(Scope *S, ObjCContainerDecl *CDecl, SourceLocation AtLoc, SourceLocation LParenLoc, FieldDeclarator &FD, Selector GetterSel, SourceLocation GetterNameLoc, Selector SetterSel, SourceLocation SetterNameLoc, const bool isReadWrite, const unsigned Attributes, const unsigned AttributesAsWritten, QualType T, TypeSourceInfo *TSI, tok::ObjCKeywordKind MethodImplKind, DeclContext *lexicalDC=nullptr)
Called by ActOnProperty and HandlePropertyInClassExtension to handle creating the ObjcPropertyDecl fo...
bool CheckARCMethodDecl(ObjCMethodDecl *method)
Check a method declaration for compatibility with the Objective-C ARC conventions.
bool IvarBacksCurrentMethodAccessor(ObjCInterfaceDecl *IFace, ObjCMethodDecl *Method, ObjCIvarDecl *IV)
IvarBacksCurrentMethodAccessor - This routine returns 'true' if 'IV' is an ivar synthesized for 'Meth...
void DiagnoseOwningPropertyGetterSynthesis(const ObjCImplementationDecl *D)
Decl * ActOnProperty(Scope *S, SourceLocation AtLoc, SourceLocation LParenLoc, FieldDeclarator &FD, ObjCDeclSpec &ODS, Selector GetterSel, Selector SetterSel, tok::ObjCKeywordKind MethodImplKind, DeclContext *lexicalDC=nullptr)
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...
Decl * ActOnPropertyImplDecl(Scope *S, SourceLocation AtLoc, SourceLocation PropertyLoc, bool ImplKind, IdentifierInfo *PropertyId, IdentifierInfo *PropertyIvar, SourceLocation PropertyIvarLoc, ObjCPropertyQueryKind QueryKind)
ActOnPropertyImplDecl - This routine performs semantic checks and builds the AST node for a property ...
void DiagnoseMissingDesignatedInitOverrides(const ObjCImplementationDecl *ImplD, const ObjCInterfaceDecl *IFD)
ObjCProtocolDecl * LookupProtocol(IdentifierInfo *II, SourceLocation IdLoc, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Find the protocol with the given name, if any.
void CheckObjCPropertyAttributes(Decl *PropertyPtrTy, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass)
Ensure attributes are consistent with type.
void AddFactoryMethodToGlobalPool(ObjCMethodDecl *Method, bool impl=false)
AddFactoryMethodToGlobalPool - Same as above, but for factory methods.
void DiagnosePropertyMismatch(ObjCPropertyDecl *Property, ObjCPropertyDecl *SuperProperty, const IdentifierInfo *Name, bool OverridingProtocolProperty)
DiagnosePropertyMismatch - Compares two properties for their attributes and types and warns on a vari...
void CheckObjCMethodOverrides(ObjCMethodDecl *ObjCMethod, ObjCInterfaceDecl *CurrentClass, ResultTypeCompatibilityKind RTC)
void AddInstanceMethodToGlobalPool(ObjCMethodDecl *Method, bool impl=false)
AddInstanceMethodToGlobalPool - All instance methods in a translation unit are added to a global pool...
RAII object to handle the state changes required to synthesize a function body.
Sema - This implements semantic analysis and AST building for C.
Preprocessor & getPreprocessor() const
bool isObjCPointerConversion(QualType FromType, QualType ToType, QualType &ConvertedType, bool &IncompatibleObjC)
isObjCPointerConversion - Determines whether this is an Objective-C pointer conversion.
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() const
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
const LangOptions & LangOpts
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
@ Compatible
Compatible - the types are compatible according to the standard.
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
ExprResult BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)
@ AbstractSynthesizedIvarType
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
Stores token information for comparing actual tokens with predefined values.
Token - This structure provides full information about a lexed token.
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
bool isNot(tok::TokenKind K) const
StringRef getRawIdentifier() const
getRawIdentifier - For a raw identifier token (i.e., an identifier lexed in raw mode),...
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.
bool isBlockPointerType() const
bool isArithmeticType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isObjCObjectType() const
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isObjCARCImplicitlyUnretainedType() const
Determines if this type, which must satisfy isObjCLifetimeType(), is implicitly __unsafe_unretained r...
bool isRecordType() const
bool isObjCRetainableType() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
void setType(QualType newType)
@ kind_nullability
Indicates that the nullability of the type was spelled with a property attribute rather than a type q...
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
const internal::VariadicDynCastAllOfMatcher< Stmt, CallExpr > callExpr
Matches call expressions.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
ObjCKeywordKind
Provides a namespace for Objective-C keywords which start with an '@'.
The JSON file list parser is used to communicate input to InstallAPI.
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
ObjCMethodFamily
A family of Objective-C methods.
@ Property
The type of a property.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
This little struct is used to capture information about structure field declarators,...
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
Qualifiers Quals
The local qualifiers.