]> granicus.if.org Git - clang/commitdiff
Propagate the deprecated and unavailable attributes from a
authorJohn McCall <rjmccall@apple.com>
Wed, 10 Nov 2010 07:01:40 +0000 (07:01 +0000)
committerJohn McCall <rjmccall@apple.com>
Wed, 10 Nov 2010 07:01:40 +0000 (07:01 +0000)
@property declaration to the autogenerated methods.  I'm uncertain
whether this should apply to attributes in general, but these are
a reasonable core.

Implements rdar://problem/8617301

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118676 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaObjCProperty.cpp
test/SemaObjC/attr-deprecated.m

index 1e7c1f85086cde259c21133eb7a4a2ba176667c3..37f9db1e5be765a95d32739e817b8a6756a3468a 100644 (file)
@@ -1076,6 +1076,17 @@ Sema::AtomicPropertySetterGetterRules (ObjCImplDecl* IMPDecl,
   }
 }
 
+/// AddPropertyAttrs - Propagates attributes from a property to the
+/// implicitly-declared getter or setter for that property.
+static void AddPropertyAttrs(Sema &S, ObjCMethodDecl *PropertyMethod,
+                             ObjCPropertyDecl *Property) {
+  // Should we just clone all attributes over?
+  if (DeprecatedAttr *A = Property->getAttr<DeprecatedAttr>())
+    PropertyMethod->addAttr(A->clone(S.Context));
+  if (UnavailableAttr *A = Property->getAttr<UnavailableAttr>())
+    PropertyMethod->addAttr(A->clone(S.Context));
+}
+
 /// ProcessPropertyDecl - Make sure that any user-defined setter/getter methods
 /// have the property type and issue diagnostics if they don't.
 /// Also synthesize a getter/setter method if none exist (and update the
@@ -1133,6 +1144,9 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
                              ObjCMethodDecl::Optional :
                              ObjCMethodDecl::Required);
     CD->addDecl(GetterMethod);
+
+    AddPropertyAttrs(*this, GetterMethod, property);
+
     // FIXME: Eventually this shouldn't be needed, as the lexical context
     // and the real context should be the same.
     if (lexicalDC)
@@ -1173,6 +1187,9 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
                                                   SC_None,
                                                   0);
       SetterMethod->setMethodParams(Context, &Argument, 1, 1);
+
+      AddPropertyAttrs(*this, SetterMethod, property);
+
       CD->addDecl(SetterMethod);
       // FIXME: Eventually this shouldn't be needed, as the lexical context
       // and the real context should be the same.
index a58068bf8324f0ec0339a1cfab04d0bce3673c29..d3d5f9537b738eaa16ccfc29dd86dab4b5ad63c9 100644 (file)
@@ -97,3 +97,14 @@ __attribute ((deprecated))
 @end
 
 
+@interface Test2
+@property int test2 __attribute__((deprecated));
+@end
+
+void test(Test2 *foo) {
+  int x;
+  x = foo.test2; // expected-warning {{'test2' is deprecated}}
+  x = [foo test2]; // expected-warning {{'test2' is deprecated}}
+  foo.test2 = x; // expected-warning {{'test2' is deprecated}}
+  [foo setTest2: x]; // expected-warning {{'setTest2:' is deprecated}}
+}