;
54 type->isObjCRetainableType()) {
69=
property->getType().getObjCLifetime();
75 if(!expectedLifetime) {
89 property->setPropertyAttributes(
attr);
93 if(propertyLifetime == expectedLifetime)
return;
95 property->setInvalidDecl();
97diag::err_arc_inconsistent_property_ownership)
98<<
property->getDeclName()
108llvm::SmallPtrSetImpl<ObjCProtocolDecl *> &Known) {
110 if(!Known.insert(Proto).second)
128 if(S.
getLangOpts().getGC() != LangOptions::NonGC) {
129 if(
T.isObjCGCWeak())
134}
else if(
autoownership =
T.getObjCLifetime()) {
146llvm_unreachable(
"bad qualifier");
194 if(CDecl->IsClassExtension()) {
199isReadWrite, Attributes,
201 T, TSI, MethodImplKind);
219(isa<ObjCInterfaceDecl>(ClassDecl) ||
220isa<ObjCProtocolDecl>(ClassDecl)));
229 boolFoundInSuper =
false;
235FoundInSuper =
true;
238CurrentInterfaceDecl = Super;
243 for(
auto*
P: CurrentInterfaceDecl->
protocols()) {
248 for(
auto*
P: IFace->all_referenced_protocols()) {
252}
else if(
ObjCCategoryDecl*Cat = dyn_cast<ObjCCategoryDecl>(ClassDecl)) {
256 if(!Cat->IsClassExtension())
257 for(
auto*
P: Cat->protocols())
271 unsignedattributesAsWritten = 0;
310std::pair<FileID, unsigned> locInfo =
SM.getDecomposedLoc(LParenLoc);
312 boolinvalidTemp =
false;
313StringRef file =
SM.getBufferData(locInfo.first, &invalidTemp);
316 const char*tokenBegin = file.data() + locInfo.second;
319 Lexerlexer(
SM.getLocForStartOfFile(locInfo.first),
321file.begin(), tokenBegin, file.end());
329}
while(Tok.
isNot(tok::r_paren));
337 boolPropagateAtomicity) {
343 if(OldIsAtomic == NewIsAtomic)
return;
349 autoAttrs =
Property->getPropertyAttributes();
358 if(
Property->getPropertyAttributesAsWritten() &
369 if(PropagateAtomicity &&
372Attrs = Attrs & ~AtomicityMask;
384 if((OldIsAtomic && isImplicitlyReadonlyAtomic(OldProperty)) ||
385(NewIsAtomic && isImplicitlyReadonlyAtomic(NewProperty)))
391 if(
auto Category= dyn_cast<ObjCCategoryDecl>(OldDC))
392OldContextName =
Category->getClassInterface()->getIdentifier();
394OldContextName = cast<ObjCContainerDecl>(OldDC)->getIdentifier();
406 unsigned&Attributes,
const unsignedAttributesAsWritten,
QualType T,
421 boolisClassProperty =
431 if(PIDecl && isa<ObjCCategoryDecl>(PIDecl->
getDeclContext())) {
432 Diag(AtLoc, diag::err_duplicate_property);
442 if(!(PIDecl->
isReadOnly() && isReadWrite)) {
451? diag::err_use_continuation_class_redeclaration_readwrite
452: diag::err_use_continuation_class;
463 Diag(AtLoc, diag::warn_property_redecl_getter_mismatch)
474 unsignedExistingOwnership
477 if(ExistingOwnership && NewOwnership != ExistingOwnership) {
480 Diag(AtLoc, diag::warn_property_attr_mismatch);
485Attributes = (Attributes & ~OwnershipMask) | ExistingOwnership;
494 Diag(AtLoc, diag::warn_property_implicitly_mismatched);
502FD, GetterSel, GetterNameLoc,
503SetterSel, SetterNameLoc,
505Attributes, AttributesAsWritten,
506 T, TSI, MethodImplKind, DC);
516 boolIncompatibleObjC =
false;
526 if(!isa<ObjCObjectPointerType>(PrimaryClassPropertyT) ||
527!isa<ObjCObjectPointerType>(ClassExtPropertyT) ||
529PrimaryClassPropertyT, ConvertedType,
530IncompatibleObjC)) ||
533diag::err_type_mismatch_continuation_class) << PDecl->
getType();
553 const unsignedAttributes,
const unsignedAttributesAsWritten,
QualType T,
583 Diag(AtLoc, diag::warn_implements_nscopying) << PropertyId;
601LParenLoc,
T, TInfo);
603 boolisClassProperty =
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)
690CDecl->
hasAttr<ObjCDirectMembersAttr>()) {
691 if(isa<ObjCProtocolDecl>(CDecl)) {
692 Diag(PDecl->
getLocation(), diag::err_objc_direct_on_protocol) <<
true;
718 if(propertyLifetime == ivarLifetime)
return;
744 switch(propertyLifetime) {
746S.
Diag(ivar->
getLocation(), diag::err_arc_strong_property_ownership)
747<<
property->getDeclName()
754<<
property->getDeclName()
759S.
Diag(ivar->
getLocation(), diag::err_arc_assign_property_ownership)
760<<
property->getDeclName() << ivar->
getDeclName()
761<< ((
property->getPropertyAttributesAsWritten() &
766llvm_unreachable(
"properties cannot be autoreleasing");
774 if(propertyImplLoc.
isValid())
775S.
Diag(propertyImplLoc, diag::note_property_synthesize);
807 return(Attr1 & Kind) != (Attr2 & Kind);
812 return((Attr1 & Kinds) != 0) != ((Attr2 & Kinds) != 0);
824assert(isa<ObjCProtocolDecl>(
Property->getDeclContext()) &&
825 "Expected a property from a protocol");
830PDecl->collectInheritedProtocolProperties(
Property, ProtocolSet,
835 for(
const auto*PI : SDecl->all_referenced_protocols()) {
837PDecl->collectInheritedProtocolProperties(
Property, ProtocolSet,
840SDecl = SDecl->getSuperClass();
844 if(Properties.empty())
848 size_tSelectedIndex = 0;
849 for(
const auto&Prop : llvm::enumerate(Properties)) {
851 if(
Property->isReadOnly() && !Prop.value()->isReadOnly()) {
853SelectedIndex = Prop.index();
856 if(
Property!= OriginalProperty) {
858Properties[SelectedIndex] = OriginalProperty;
862 unsignedOriginalAttributes =
Property->getPropertyAttributesAsWritten();
864IncompatibleType = 0,
865HasNoExpectedAttribute,
866HasUnexpectedAttribute,
872 structMismatchingProperty {
875StringRef AttributeName;
880 unsigned Attr= Prop->getPropertyAttributesAsWritten();
881 if(
Attr!= OriginalAttributes) {
882 auto Diag= [&](
boolOriginalHasAttribute, StringRef AttributeName) {
883MismatchKind Kind = OriginalHasAttribute ? HasNoExpectedAttribute
884: HasUnexpectedAttribute;
885Mismatches.push_back({Prop, Kind, AttributeName});
903OriginalAttributes,
Attr,
908 "retain (or strong)");
917 if(
Property->getGetterName() != Prop->getGetterName()) {
918Mismatches.push_back({Prop, DifferentGetter,
""});
921 if(!
Property->isReadOnly() && !Prop->isReadOnly() &&
922 Property->getSetterName() != Prop->getSetterName()) {
923Mismatches.push_back({Prop, DifferentSetter,
""});
928 boolIncompatibleObjC =
false;
931|| IncompatibleObjC) {
932Mismatches.push_back({Prop, IncompatibleType,
""});
938 if(Mismatches.empty())
943 boolHasIncompatibleAttributes =
false;
944 for(
const auto&
Note: Mismatches)
945HasIncompatibleAttributes =
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 caseIncompatibleType:
958 caseHasNoExpectedAttribute:
959 caseHasUnexpectedAttribute:
960 Diag<< Mismatches[0].AttributeName;
962 caseDifferentGetter:
965 caseDifferentSetter:
970 for(
const auto&
Note: Mismatches) {
972S.
Diag(
Note.Prop->getLocation(), diag::note_protocol_property_declare)
974 switch(
Note.Kind) {
975 caseIncompatibleType:
978 caseHasNoExpectedAttribute:
979 caseHasUnexpectedAttribute:
982 caseDifferentGetter:
983 Diag<<
Note.Prop->getGetterName();
985 caseDifferentSetter:
986 Diag<<
Note.Prop->getSetterName();
991S.
Diag(AtLoc, diag::note_property_synthesize);
1013 autoOrigClass =
Category->getClassInterface();
1016 returnOrigProp->getPropertyAttributesAsWritten() &
OwnershipMask;
1020 for(
const auto*Proto : OrigClass->all_referenced_protocols()) {
1023 returnOrigProp->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);
1073PropertyIvarLoc = 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 unsignedPIkind =
property->getPropertyAttributesAsWritten();
1104 Diag(AtLoc, diag::warn_implicit_atomic_property);
1107 Diag(property->getLocation(), diag::note_property_declare);
1111dyn_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);
1119property->hasAttr<IBOutletAttr>() && !AtLoc.
isValid()) {
1120 boolReadWriteProperty =
false;
1126PIkind = ExtProp->getPropertyAttributesAsWritten();
1128ReadWriteProperty =
true;
1134 if(!ReadWriteProperty) {
1135 Diag(property->getLocation(), diag::warn_auto_readonly_iboutlet_property)
1139property->getLParenLoc(), readonlyLoc)) {
1142 SourceRangeReadonlySourceRange(readonlyLoc, endLoc);
1143 Diag(property->getLocation(),
1144diag::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 boolCompleteTypeErr =
false;
1183 boolcompat =
true;
1188PropertyIvar = PropertyId;
1192 QualTypePropType =
property->getType();
1196diag::err_incomplete_synthesized_property,
1197property->getDeclName())) {
1198 Diag(property->getLocation(), diag::note_property_declare);
1199CompleteTypeErr =
true;
1203(property->getPropertyAttributesAsWritten() &
1211 boolisARCWeak =
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);
1236CompleteTypeErr =
true;
1243 Diag(property->getLocation(),
1244diag::err_arc_weak_unavailable_property)
1245<< PropertyIvarType;
1264 Diag(PropertyDiagLoc,
1265diag::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,
1285diag::err_arc_objc_property_default_assign_on_object);
1286 Diag(property->getLocation(), diag::note_property_declare);
1290assert(lifetime &&
"no lifetime for property?");
1299PropertyIvarLoc,PropertyIvarLoc, PropertyIvar,
1300PropertyIvarType,
nullptr,
1302(
Expr*)
nullptr,
true);
1304diag::err_abstract_type_in_decl,
1306 Diag(property->getLocation(), diag::note_property_declare);
1308CompleteTypeErr =
true;
1310 if(!CompleteTypeErr) {
1313 Diag(PropertyIvarLoc, diag::err_synthesize_variable_sized_ivar)
1314<< PropertyIvarType;
1315CompleteTypeErr =
true;
1318 if(CompleteTypeErr)
1320ClassImpDecl->
addDecl(Ivar);
1324 Diag(PropertyDiagLoc, diag::err_missing_property_ivar_decl)
1330 Diag(PropertyDiagLoc, diag::err_ivar_in_superclass_use)
1331<<
property->getDeclName() << Ivar->
getDeclName()
1337 property->setPropertyIvarDecl(Ivar);
1342 if(!Context.
hasSameType(PropertyIvarType, IvarType)) {
1343 if(isa<ObjCObjectPointerType>(PropertyIvarType)
1344&& isa<ObjCObjectPointerType>(IvarType))
1350PropertyIvarLoc, 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);
1400assert (property &&
"ActOnPropertyImplDecl - property declaration missing");
1405Ivar, PropertyIvarLoc);
1407 if(CompleteTypeErr || !compat)
1410 if(
ObjCMethodDecl*getterMethod = property->getGetterMethodDecl()) {
1411getterMethod->createImplicitParams(Context, IDecl);
1417getterMethod->getSelector(), getterMethod->isInstanceMethod());
1436Context, SelfDecl->
getType(), CK_LValueToRValue, SelfExpr,
nullptr,
1443LoadSelfExpr,
true,
true);
1446getterMethod->getReturnType()),
1447PropertyDiagLoc, IvarRefExpr);
1455 if(property->hasAttr<NSReturnsNotRetainedAttr>() &&
1456!getterMethod->hasAttr<NSReturnsNotRetainedAttr>()) {
1457 Diag(getterMethod->getLocation(),
1458diag::warn_property_getter_owning_mismatch);
1459 Diag(property->getLocation(), diag::note_property_declare);
1461 if(
getLangOpts().ObjCAutoRefCount && Synthesize)
1462 switch(getterMethod->getMethodFamily()) {
1467 Diag(getterMethod->getLocation(), diag::err_arc_illegal_method_def)
1468<< 1 << getterMethod->getSelector();
1475 if(
ObjCMethodDecl*setterMethod = property->getSetterMethodDecl()) {
1476setterMethod->createImplicitParams(Context, IDecl);
1481setterMethod->getSelector(), setterMethod->isInstanceMethod());
1484AtLoc, PropertyLoc);
1498Context, SelfDecl->
getType(), CK_LValueToRValue, SelfExpr,
nullptr,
1505LoadSelfExpr,
true,
true);
1514 if(property->getPropertyAttributes() &
1518dyn_cast_or_null<CXXOperatorCallExpr>(
callExpr))
1519 if(
const FunctionDecl*FuncDecl = CXXCE->getDirectCallee())
1520 if(!FuncDecl->isTrivial())
1521 if(property->getType()->isReferenceType()) {
1522 Diag(PropertyDiagLoc,
1523diag::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);
1596diag::note_previous_declaration);
1613 boolOverridingProtocolProperty) {
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 boolCStrong = (CAttrRetain != 0);
1639 boolSStrong = (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 boolIncompatibleObjC =
false;
1676IncompatibleObjC) ||
1678 Diag(
Property->getLocation(), diag::warn_property_types_are_incompatible)
1679<<
Property->getType() << SuperProperty->
getType() << inheritedName;
1693 property->getType().getNonReferenceType().getAtomicUnqualifiedType();
1694 boolcompat = 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 boolCollectClassPropsOnly =
false,
1736 boolIncludeProtocols =
true) {
1738 for(
auto*Prop : IDecl->properties()) {
1739 if(CollectClassPropsOnly && !Prop->isClassProperty())
1741PropMap[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] =
1746 for(
auto*Ext : IDecl->visible_extensions())
1748CollectClassPropsOnly, IncludeProtocols);
1750 if(IncludeProtocols) {
1752 for(
auto*PI : IDecl->all_referenced_protocols())
1754CollectClassPropsOnly);
1758 for(
auto*Prop : CATDecl->properties()) {
1759 if(CollectClassPropsOnly && !Prop->isClassProperty())
1761PropMap[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] =
1764 if(IncludeProtocols) {
1766 for(
auto*PI : CATDecl->protocols())
1768CollectClassPropsOnly);
1772 for(
auto*Prop : PDecl->properties()) {
1773 if(CollectClassPropsOnly && !Prop->isClassProperty())
1776SuperPropMap[std::make_pair(Prop->getIdentifier(),
1777Prop->isClassProperty())];
1780 if(!PropertyFromSuper ||
1781PropertyFromSuper->
getIdentifier() != Prop->getIdentifier()) {
1783PropMap[std::make_pair(Prop->getIdentifier(),
1784Prop->isClassProperty())];
1790 for(
auto*PI : PDecl->protocols())
1792CollectClassPropsOnly);
1803SDecl->collectPropertiesToImplement(PropMap);
1804SDecl = SDecl->getSuperClass();
1827(
Property->getPropertyIvarDecl() == IV))
1833 for(
const auto*
Property: Ext->instance_properties())
1836(
Property->getPropertyIvarDecl() == IV))
1843 boolSuperClassImplementsGetter =
false;
1844 boolSuperClassImplementsSetter =
false;
1846SuperClassImplementsSetter =
true;
1851SuperClassImplementsGetter =
true;
1854SuperClassImplementsSetter =
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);
1913diag::warn_auto_synthesizing_protocol_property)
1917(Twine(
"@synthesize ") + Prop->
getName() +
";\n\n").str();
1918 Diag(AtEnd, diag::note_add_synthesize_directive)
1924 if(PropInSuperClass) {
1933 Diag(PropInSuperClass->
getLocation(), diag::note_property_declare);
1935 Diag(Prop->
getLocation(), diag::warn_autosynthesis_property_in_superclass)
1937 Diag(PropInSuperClass->
getLocation(), diag::note_property_declare);
1961 if(!
getLangOpts().ObjCDefaultSynthProperties ||
1968 if(!IDecl->isObjCRequiresPropertyDefs())
1987 if(I ==
SMap.end() &&
1988(PrimaryClass ==
nullptr||
1992isa<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 &&
2005S.
Diag(RID->getLocation(), diag::note_suppressed_class_declare);
2011 boolSynthesizeProperties) {
2025 if((IDecl =
C->getClassInterface())) {
2034SynthesizeProperties
);
2040std::unique_ptr<ObjCContainerDecl::PropertyMap> LazyMap;
2043 if(!PDecl->hasAttr<ObjCExplicitProtocolImplAttr>())
2061 for(
auto*PropDecl : PDecl->properties()) {
2062 if((*LazyMap)[std::make_pair(PropDecl->getIdentifier(),
2063PropDecl->isClassProperty())])
2065PropMap[std::make_pair(PropDecl->getIdentifier(),
2066PropDecl->isClassProperty())] = PropDecl;
2071 if(PropMap.empty())
2074llvm::DenseSet<ObjCPropertyDecl *> PropImplMap;
2076PropImplMap.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) {
2102PropImplMap.count(Prop) ||
2108IMPDecl, CDecl,
C, Prop, InsMap);
2119 const auto*
property= propertyImpl->getPropertyDecl();
2122 if(propertyImpl->getPropertyImplementation() ==
2124(property->getPropertyAttributes() &
2126property->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();
2149PM[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] = Prop;
2151 for(
auto*Prop : Ext->properties())
2152PM[std::make_pair(Prop->getIdentifier(), Prop->isClassProperty())] = Prop;
2154 for(ObjCContainerDecl::PropertyMap::iterator I = PM.begin(),
E= PM.end();
2160 unsignedAttributes =
Property->getPropertyAttributes();
2161 unsignedAttributesAsWritten =
Property->getPropertyAttributesAsWritten();
2165GetterMethod =
Property->isClassProperty() ?
2168SetterMethod =
Property->isClassProperty() ?
2172GetterMethod =
nullptr;
2174SetterMethod =
nullptr;
2177diag::warn_default_atomic_custom_getter_setter)
2178<<
Property->getIdentifier() << 0;
2179 Diag(
Property->getLocation(), diag::note_property_declare);
2183diag::warn_default_atomic_custom_getter_setter)
2184<<
Property->getIdentifier() << 1;
2185 Diag(
Property->getLocation(), diag::note_property_declare);
2197GetterMethod = PIDecl->getGetterMethodDecl();
2198SetterMethod = PIDecl->getSetterMethodDecl();
2200GetterMethod =
nullptr;
2202SetterMethod =
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() &&
2216StringRef NonatomicStr = AttributesAsWritten?
"nonatomic, " 2219diag::note_atomic_property_fixup_suggest)
2221}
else if(
Property->getLParenLoc().isInvalid()) {
2224 Property->getTypeSourceInfo()->getTypeLoc().getBeginLoc();
2226diag::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())
2268noteLoc = getterRedecl->getLocation();
2269fixItLoc = getterRedecl->getEndLoc();
2274tok::kw___attribute, tok::l_paren, tok::l_paren,
2277tok::r_paren, tok::r_paren
2279StringRef spelling =
"__attribute__((objc_method_family(none)))";
2281 if(!macroName.empty())
2282spelling = macroName;
2284 autonoteDiag =
Diag(noteLoc, diag::note_cocoa_naming_declare_family)
2288fixItText += spelling;
2305 if(I->getMethodFamily() ==
OMF_init)
2306InitSelSet.insert(I->getSelector());
2311I = DesignatedInits.begin(),
E= DesignatedInits.end(); I !=
E; ++I) {
2316 boolIgnore =
false;
2322 if(
auto*IMD = Ext->getInstanceMethod(MD->
getSelector())) {
2323Ignore = IMD->isUnavailable();
2329diag::warn_objc_implementation_missing_designated_init_override)
2331 Diag(MD->
getLocation(), diag::note_objc_designated_init_marked_here);
2342 for(
const auto*A :
Property->attrs()) {
2343 if(isa<DeprecatedAttr>(A) ||
2344isa<UnavailableAttr>(A) ||
2345isa<AvailabilityAttr>(A))
2361 boolIsClassProperty =
property->isClassProperty();
2362GetterMethod = IsClassProperty ?
2370 if(CatDecl->IsClassExtension())
2373CatDecl->getClassInterface()->
2376SetterMethod = IsClassProperty ?
2381 if(CatDecl->IsClassExtension())
2384CatDecl->getClassInterface()->
2391 if(!GetterMethod) {
2393 auto*ExistingGetter = CatDecl->getClassInterface()->lookupMethod(
2394property->
getGetterName(), !IsClassProperty,
true,
false, CatDecl);
2395 if(ExistingGetter) {
2397 Diag(property->
getLocation(), diag::err_objc_direct_duplicate_decl)
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(
2410property->
getSetterName(), !IsClassProperty,
true,
false, CatDecl);
2411 if(ExistingSetter) {
2413 Diag(property->
getLocation(), diag::err_objc_direct_duplicate_decl)
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(),
2432diag::warn_accessor_property_type_mismatch)
2433<<
property->getDeclName()
2445 if(!GetterMethod) {
2453 QualTyperesultTy =
property->getType().getAtomicUnqualifiedType();
2462modifiedTy, modifiedTy);
2468!IsClassProperty,
false,
2479GetterMethod->
addAttr(ObjCDirectAttr::CreateImplicit(Context,
Loc));
2481 if(property->
hasAttr<NSReturnsNotRetainedAttr>())
2482GetterMethod->
addAttr(NSReturnsNotRetainedAttr::CreateImplicit(Context,
2485 if(property->
hasAttr<ObjCReturnsInnerPointerAttr>())
2487ObjCReturnsInnerPointerAttr::CreateImplicit(Context,
Loc));
2489 if(
constSectionAttr *SA = property->
getAttr<SectionAttr>())
2490GetterMethod->
addAttr(SectionAttr::CreateImplicit(
2491Context, SA->getName(),
Loc, SectionAttr::GNU_section));
2504 property->setGetterMethodDecl(GetterMethod);
2509 if(!SetterMethod) {
2518CD, !IsClassProperty,
2530 property->getType().getUnqualifiedType().getAtomicUnqualifiedType();
2540modifiedTy, modifiedTy);
2558SetterMethod->
addAttr(ObjCDirectAttr::CreateImplicit(Context,
Loc));
2561 if(
constSectionAttr *SA = property->
getAttr<SectionAttr>())
2562SetterMethod->
addAttr(SectionAttr::CreateImplicit(
2563Context, SA->getName(),
Loc, SectionAttr::GNU_section));
2578 property->setSetterMethodDecl(SetterMethod);
2592 if(!IsClassProperty) {
2605 if(!CurrentClass) {
2607CurrentClass = Cat->getClassInterface();
2608 else if(
ObjCImplDecl*Impl = dyn_cast<ObjCImplDecl>(CD))
2609CurrentClass = Impl->getClassInterface();
2618 unsigned&Attributes,
2619 boolpropertyInPrimaryClass) {
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";
2665Attributes &= ~ObjCPropertyAttribute::kind_copy;
2668 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2669<<
"assign"<<
"retain";
2670Attributes &= ~ObjCPropertyAttribute::kind_retain;
2673 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2674<<
"assign"<<
"strong";
2675Attributes &= ~ObjCPropertyAttribute::kind_strong;
2679 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2680<<
"assign"<<
"weak";
2681Attributes &= ~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";
2689Attributes &= ~ObjCPropertyAttribute::kind_copy;
2692 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2693<<
"unsafe_unretained"<<
"retain";
2694Attributes &= ~ObjCPropertyAttribute::kind_retain;
2697 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2698<<
"unsafe_unretained"<<
"strong";
2699Attributes &= ~ObjCPropertyAttribute::kind_strong;
2703 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2704<<
"unsafe_unretained"<<
"weak";
2705Attributes &= ~ObjCPropertyAttribute::kind_weak;
2709 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2710<<
"copy"<<
"retain";
2711Attributes &= ~ObjCPropertyAttribute::kind_retain;
2714 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2715<<
"copy"<<
"strong";
2716Attributes &= ~ObjCPropertyAttribute::kind_strong;
2719 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive)
2720<<
"copy"<<
"weak";
2721Attributes &= ~ObjCPropertyAttribute::kind_weak;
2725 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive) <<
"retain" 2727Attributes &= ~ObjCPropertyAttribute::kind_retain;
2730 Diag(
Loc, diag::err_objc_property_attr_mutually_exclusive) <<
"strong" 2732Attributes &= ~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" 2748Attributes &= ~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::@1704::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.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4