]> granicus.if.org Git - clang/commitdiff
Objective-C: Issue deprecated warning when using a
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 4 Apr 2013 18:45:52 +0000 (18:45 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 4 Apr 2013 18:45:52 +0000 (18:45 +0000)
deprecated typedef to subclass or invoke a class method.
// rdar://13569424

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

lib/Sema/SemaDeclObjC.cpp
lib/Sema/SemaExprObjC.cpp
test/SemaObjC/attr-deprecated.m

index 96a432a108e2e797fdcf95d8a4f2ca5b63542fa2..5c26d7ff8e033d8bc3faf4dafdef42207ae8dee6 100644 (file)
@@ -521,8 +521,14 @@ ActOnStartClassInterface(SourceLocation AtInterfaceLoc,
               dyn_cast_or_null<TypedefNameDecl>(PrevDecl)) {
           QualType T = TDecl->getUnderlyingType();
           if (T->isObjCObjectType()) {
-            if (NamedDecl *IDecl = T->getAs<ObjCObjectType>()->getInterface())
+            if (NamedDecl *IDecl = T->getAs<ObjCObjectType>()->getInterface()) {
               SuperClassDecl = dyn_cast<ObjCInterfaceDecl>(IDecl);
+              // This handles the following case:
+              // @interface NewI @end
+              // typedef NewI DeprI __attribute__((deprecated("blah")))
+              // @interface SI : DeprI /* warn here */ @end
+              (void)DiagnoseUseOfDecl(const_cast<TypedefNameDecl*>(TDecl), SuperLoc);
+            }
           }
         }
 
index 51a190651e97819f62c342a433e5c99dc22a80d3..e7b5ec9b0168889c2218746d7debba91c136f2c8 100644 (file)
@@ -1786,9 +1786,11 @@ Sema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S,
     QualType T;
     if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(ND))
       T = Context.getObjCInterfaceType(Class);
-    else if (TypeDecl *Type = dyn_cast<TypeDecl>(ND))
+    else if (TypeDecl *Type = dyn_cast<TypeDecl>(ND)) {
       T = Context.getTypeDeclType(Type);
-    else 
+      DiagnoseUseOfDecl(Type, NameLoc);
+    }
+    else
       return ObjCInstanceMessage;
 
     //  We have a class message, and T is the type we're
index c0aa9fc07071d7dd899368617549206da2ae1ca7..aa4b479e002285f2d6164a280da07fcfc942852d 100644 (file)
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
+// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify -Wno-objc-root-class %s
 
 @interface A {
   int X __attribute__((deprecated)); // expected-note 2 {{declared here}}
@@ -135,3 +136,21 @@ typedef struct {
 @property footype c; // expected-warning {{'footype' is deprecated}}
 @property footype d __attribute((deprecated));
 @end
+
+// rdar://13569424
+@interface NewI
++(void)cmeth;
+@end
+
+typedef NewI DeprI __attribute__((deprecated("blah"))); // expected-note 4 {{'DeprI' declared here}}
+
+@interface SI : DeprI // expected-warning {{'DeprI' is deprecated: blah}}
+-(DeprI*)meth; // expected-warning {{'DeprI' is deprecated: blah}}
+@end
+
+@implementation SI
+-(DeprI*)meth { // expected-warning {{'DeprI' is deprecated: blah}}
+  [DeprI cmeth]; // expected-warning {{'DeprI' is deprecated: blah}}
+  return 0;
+}
+@end