Add support for deprecating ObjC properties. Unlike GCC, we warn that the
property is deprecated, not the getter/setter if the attribute is on
the property.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64644 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 49bba1d..07079db 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1683,16 +1683,24 @@
ObjCInterfaceDecl *IFace = IFTy->getDecl();
// Search for a declared property first.
- if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(&Member))
+ if (ObjCPropertyDecl *PD = IFace->FindPropertyDeclaration(&Member)) {
+ // Check if referencing a property with __attribute__((deprecated)).
+ DiagnoseUseOfDeprecatedDecl(PD, MemberLoc);
+
return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(),
- MemberLoc, BaseExpr));
+ MemberLoc, BaseExpr));
+ }
// Check protocols on qualified interfaces.
for (ObjCInterfaceType::qual_iterator I = IFTy->qual_begin(),
E = IFTy->qual_end(); I != E; ++I)
- if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(&Member))
+ if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(&Member)) {
+ // Check if referencing a property with __attribute__((deprecated)).
+ DiagnoseUseOfDeprecatedDecl(PD, MemberLoc);
+
return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(),
- MemberLoc, BaseExpr));
+ MemberLoc, BaseExpr));
+ }
// If that failed, look for an "implicit" property by seeing if the nullary
// selector is implemented.
@@ -1719,6 +1727,9 @@
}
}
if (Getter) {
+ // Check if referencing a property with __attribute__((deprecated)).
+ DiagnoseUseOfDeprecatedDecl(Getter, MemberLoc);
+
// If we found a getter then this may be a valid dot-reference, we
// will look for the matching setter, in case it is needed.
IdentifierInfo *SetterName = constructSetterName(PP.getIdentifierTable(),
@@ -1742,6 +1753,11 @@
}
}
+ if (Setter)
+ // Check if referencing a property with __attribute__((deprecated)).
+ DiagnoseUseOfDeprecatedDecl(Setter, MemberLoc);
+
+
// FIXME: we must check that the setter has property type.
return Owned(new (Context) ObjCKVCRefExpr(Getter, Getter->getResultType(),
Setter, MemberLoc, BaseExpr));
@@ -1756,12 +1772,19 @@
// Check protocols on qualified interfaces.
for (ObjCQualifiedIdType::qual_iterator I = QIdTy->qual_begin(),
E = QIdTy->qual_end(); I != E; ++I) {
- if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(&Member))
+ if (ObjCPropertyDecl *PD = (*I)->FindPropertyDeclaration(&Member)) {
+ // Check if referencing a property with __attribute__((deprecated)).
+ DiagnoseUseOfDeprecatedDecl(PD, MemberLoc);
+
return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(),
- MemberLoc, BaseExpr));
+ MemberLoc, BaseExpr));
+ }
// Also must look for a getter name which uses property syntax.
Selector Sel = PP.getSelectorTable().getNullarySelector(&Member);
if (ObjCMethodDecl *OMD = (*I)->getInstanceMethod(Sel)) {
+ // Check if referencing a property with __attribute__((deprecated)).
+ DiagnoseUseOfDeprecatedDecl(OMD, MemberLoc);
+
return Owned(new (Context) ObjCMessageExpr(BaseExpr, Sel,
OMD->getResultType(), OMD, OpLoc, MemberLoc, NULL, 0));
}