]> granicus.if.org Git - clang/commitdiff
refactoring + objective-C specific test for my last patch.
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 6 Sep 2012 18:38:58 +0000 (18:38 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 6 Sep 2012 18:38:58 +0000 (18:38 +0000)
// rdar://12233989

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

include/clang/Sema/Sema.h
lib/Sema/SemaDecl.cpp
lib/Sema/SemaExpr.cpp
test/SemaObjC/unused.m

index 5fdb09caea984a6424f4dcf637647882770ce80e..919bd6883eeefddcd1f3e03b77f4198c3a99df4b 100644 (file)
@@ -7244,6 +7244,14 @@ public:
   }
 
   AvailabilityResult getCurContextAvailability() const;
+  
+  const DeclContext *getCurObjCLexicalContext() const {
+    const DeclContext *DC = getCurLexicalContext();
+    // A category implicitly has the attribute of the interface.
+    if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(DC))
+      DC = CatD->getClassInterface();
+    return DC;
+  }
 };
 
 /// \brief RAII object that enters a new expression evaluation context.
index 711ea4c7293a616183cae07f2f58566641c1abcd..b3db84039738542262f39ba07fd0214a12a5a988 100644 (file)
@@ -11101,10 +11101,6 @@ Decl *Sema::getObjCDeclContext() const {
 }
 
 AvailabilityResult Sema::getCurContextAvailability() const {
-  const Decl *D = cast<Decl>(getCurLexicalContext());
-  // A category implicitly has the availability of the interface.
-  if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(D))
-    D = CatD->getClassInterface();
-  
+  const Decl *D = cast<Decl>(getCurObjCLexicalContext());
   return D->getAvailability();
 }
index a67d5c6bd09a63e27d67bb35da4fcd43803daeae..cfa9ccbfc3347bf88cd397038971d54e091eda47 100644 (file)
@@ -69,10 +69,7 @@ bool Sema::CanUseDecl(NamedDecl *D) {
 static void DiagnoseUnusedOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc) {
   // Warn if this is used but marked unused.
   if (D->hasAttr<UnusedAttr>()) {
-    const Decl *DC = cast<Decl>(S.getCurLexicalContext());
-    // A category implicitly has the availability of the interface.
-    if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(DC))
-      DC = CatD->getClassInterface();
+    const Decl *DC = cast<Decl>(S.getCurObjCLexicalContext());
     if (!DC->hasAttr<UnusedAttr>())
       S.Diag(Loc, diag::warn_used_but_marked_unused) << D->getDeclName();
   }
index 5c7542bf4738a34d31e5ab4e1f7671592621695e..efaf9c8f3efcf7ae9e2c1d89e358e3aac87f35ae 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -verify -Wunused -Wunused-parameter -fsyntax-only -Wno-objc-root-class %s
+// RUN: %clang_cc1 -verify -Wused-but-marked-unused -Wno-objc-protocol-method-implementation -Wunused -Wunused-parameter -fsyntax-only -Wno-objc-root-class %s
 
 int printf(const char *, ...);
 
@@ -53,3 +53,17 @@ void test2() {
 
 // rdar://10777111
 static NSString *x = @"hi"; // expected-warning {{unused variable 'x'}}
+
+// rdar://12233989
+@interface TestTransitiveUnused
+- (void) a __attribute__((unused));
+- (void) b __attribute__((unused));
+@end
+
+@interface TestTransitiveUnused(CAT)
+@end
+
+@implementation TestTransitiveUnused(CAT)
+- (void) b {}
+- (void) a { [self b]; }
+@end