diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-02-16 18:35:08 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-02-16 18:35:08 +0000 | 
| commit | 43df556ab57d7358ee54685ec6a2807f30b84423 (patch) | |
| tree | c9f8a1fb97e59c32cf7ed3012a7a76d19a494f73 /clang | |
| parent | 41fd42e7824f01b6342f72a42a3f563ca4152ab3 (diff) | |
| download | bcm5719-llvm-43df556ab57d7358ee54685ec6a2807f30b84423.tar.gz bcm5719-llvm-43df556ab57d7358ee54685ec6a2807f30b84423.zip  | |
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.
llvm-svn: 64644
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 35 | ||||
| -rw-r--r-- | clang/test/SemaObjC/attr-deprecated.m | 15 | 
2 files changed, 44 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 49bba1d5b81..07079dbb7da 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -1683,16 +1683,24 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,      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 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,        }      }      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 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,          }        } +      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 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,      // 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));        } diff --git a/clang/test/SemaObjC/attr-deprecated.m b/clang/test/SemaObjC/attr-deprecated.m index 767206f88b7..e9ed3819a76 100644 --- a/clang/test/SemaObjC/attr-deprecated.m +++ b/clang/test/SemaObjC/attr-deprecated.m @@ -67,3 +67,18 @@ void t4(Class c)    [c F];  } + + +@interface Bar  + +@property (assign, setter = MySetter:) int FooBar __attribute__ ((deprecated)); +- (void) MySetter : (int) value; +@end + +int t5() { +  Bar *f; +  f.FooBar = 1;	   // expected-warning {{warning: 'FooBar' is deprecated}} +  return f.FooBar; // expected-warning {{warning: 'FooBar' is deprecated}} +} + +  | 

