]> granicus.if.org Git - clang/commitdiff
Revert "Add new attribute 'objc_suppress_protocol' to suppress protocol conformance...
authorTed Kremenek <kremenek@apple.com>
Thu, 21 Nov 2013 07:57:53 +0000 (07:57 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 21 Nov 2013 07:57:53 +0000 (07:57 +0000)
After implementing this patch, a few concerns about the language
feature itself emerged in my head that I had previously not considered.
I want to resolve those design concerns first before having
a half-designed language feature in the tree.

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

include/clang/AST/DeclObjC.h
include/clang/Basic/Attr.td
lib/AST/DeclObjC.cpp
lib/Sema/SemaDeclAttr.cpp
lib/Sema/SemaDeclObjC.cpp
test/SemaObjC/protocols-suppress-conformance.m [deleted file]

index 10e5dc11ee67ac9d86c10dae9bfff97c4ca78c65..2e760d658e4368f8214582449622c0e686b53b80 100644 (file)
@@ -1142,17 +1142,14 @@ public:
   // found, we search referenced protocols and class categories.
   ObjCMethodDecl *lookupMethod(Selector Sel, bool isInstance,
                                bool shallowCategoryLookup= false,
-                               const ObjCCategoryDecl *C = 0,
-                               const ObjCProtocolDecl *P = 0) const;
+                               const ObjCCategoryDecl *C= 0) const;
   ObjCMethodDecl *lookupInstanceMethod(Selector Sel,
-                                       bool shallowCategoryLookup = false,
-                                       ObjCProtocolDecl *P = 0) const {
-    return lookupMethod(Sel, true/*isInstance*/, shallowCategoryLookup, 0, P);
+                            bool shallowCategoryLookup = false) const {
+    return lookupMethod(Sel, true/*isInstance*/, shallowCategoryLookup);
   }
   ObjCMethodDecl *lookupClassMethod(Selector Sel,
-                                    bool shallowCategoryLookup = false,
-                                    ObjCProtocolDecl *P = 0) const {
-    return lookupMethod(Sel, false/*isInstance*/, shallowCategoryLookup, 0, P);
+                     bool shallowCategoryLookup = false) const {
+    return lookupMethod(Sel, false/*isInstance*/, shallowCategoryLookup);
   }
   ObjCInterfaceDecl *lookupInheritedClass(const IdentifierInfo *ICName);
 
index a6be491c5a202cf09ed4e0539559062a774126bf..bcca1d25ef78caabce6e0a4884cade92c98aac77 100644 (file)
@@ -613,12 +613,6 @@ def ObjCRootClass : InheritableAttr {
   let Subjects = [ObjCInterface];
 }
 
-def ObjCSuppressProtocol : InheritableAttr {
-  let Spellings = [GNU<"objc_suppress_protocol">];
-  let Subjects = [ObjCInterface];
-  let Args = [IdentifierArgument<"Protocol", 1>];
-}
-
 def Overloadable : Attr {
   let Spellings = [GNU<"overloadable">];
 }
index d759c0795b8f3aa8dcb46eac6c1df98c933c5fd3..b2b5b70197b7eb8f2fa122a4b8e55aff4f3c716c 100644 (file)
@@ -457,11 +457,9 @@ ObjCInterfaceDecl::lookupNestedProtocol(IdentifierInfo *Name) {
 /// When argument category "C" is specified, any implicit method found
 /// in this category is ignored.
 ObjCMethodDecl *ObjCInterfaceDecl::lookupMethod(Selector Sel, 
-                                                bool isInstance,
-                                                bool shallowCategoryLookup,
-                                                const ObjCCategoryDecl *C,
-                                                const ObjCProtocolDecl *P) const
-{
+                                     bool isInstance,
+                                     bool shallowCategoryLookup,
+                                     const ObjCCategoryDecl *C) const {
   // FIXME: Should make sure no callers ever do this.
   if (!hasDefinition())
     return 0;
@@ -472,23 +470,7 @@ ObjCMethodDecl *ObjCInterfaceDecl::lookupMethod(Selector Sel,
   if (data().ExternallyCompleted)
     LoadExternalDefinition();
 
-  while (ClassDecl) {
-    // If we are looking for a method that is part of protocol conformance,
-    // check if the class has been marked to suppress conformance
-    // of that protocol.
-    if (P && ClassDecl->hasAttrs()) {
-      const AttrVec &V = ClassDecl->getAttrs();
-      const IdentifierInfo *PI = P->getIdentifier();
-      for (AttrVec::const_iterator I = V.begin(), E = V.end(); I != E; ++I) {
-        if (const ObjCSuppressProtocolAttr *A =
-            dyn_cast<ObjCSuppressProtocolAttr>(*I)){
-          if (A->getProtocol() == PI) {
-            return 0;
-          }
-        }
-      }
-    }
-
+  while (ClassDecl != NULL) {
     if ((MethodDecl = ClassDecl->getMethod(Sel, isInstance)))
       return MethodDecl;
 
index 0c025b784974e1d563aad2d814527d830af72b20..38bffa2f99e46b89a9f3e6acf5ffa52338b4b592 100644 (file)
@@ -2134,30 +2134,6 @@ static void handleObjCRootClassAttr(Sema &S, Decl *D,
                                Attr.getAttributeSpellingListIndex()));
 }
 
-static void handleObjCSuppresProtocolAttr(Sema &S, Decl *D,
-                                          const AttributeList &Attr) {
-  if (!isa<ObjCInterfaceDecl>(D)) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
-      << Attr.getName() << ExpectedObjectiveCInterface;
-    return;
-  }
-
-  IdentifierLoc *Parm = NULL;
-  if (Attr.getNumArgs() == 1) {
-    Parm = Attr.isArgIdent(0) ? Attr.getArgAsIdent(0) : 0;
-  }
-
-  if (!Parm) {
-    S.Diag(D->getLocStart(), diag::err_objc_attr_not_id) << Attr.getName() << 1;
-    return;
-  }
-
-  D->addAttr(::new (S.Context)
-             ObjCSuppressProtocolAttr(Attr.getRange(), S.Context, Parm->Ident,
-                                      Attr.getAttributeSpellingListIndex()));
-}
-
-
 static void handleObjCRequiresPropertyDefsAttr(Sema &S, Decl *D,
                                                const AttributeList &Attr) {
   if (!isa<ObjCInterfaceDecl>(D)) {
@@ -4714,10 +4690,7 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
   case AttributeList::AT_ObjCRootClass:
     handleObjCRootClassAttr(S, D, Attr);
     break;
-  case AttributeList::AT_ObjCSuppressProtocol:
-    handleObjCSuppresProtocolAttr(S, D, Attr);
-    break;
-  case AttributeList::AT_ObjCRequiresPropertyDefs:
+  case AttributeList::AT_ObjCRequiresPropertyDefs: 
     handleObjCRequiresPropertyDefsAttr (S, D, Attr); 
     break;
   case AttributeList::AT_Unused:      handleUnusedAttr      (S, D, Attr); break;
index 2a781b5bd7d245ec8437bfed2a63e9ea544aa6b2..f44fb3251141d7a86775b925355eef8dd61c890e 100644 (file)
@@ -1664,8 +1664,7 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc,
       if (method->getImplementationControl() != ObjCMethodDecl::Optional &&
           !method->isPropertyAccessor() &&
           !InsMap.count(method->getSelector()) &&
-          (!Super || !Super->lookupInstanceMethod(method->getSelector(),
-                                                  false, PDecl))) {
+          (!Super || !Super->lookupInstanceMethod(method->getSelector()))) {
             // If a method is not implemented in the category implementation but
             // has been declared in its primary class, superclass,
             // or in one of their protocols, no need to issue the warning. 
@@ -1677,8 +1676,7 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc,
             // uses the protocol.
             if (ObjCMethodDecl *MethodInClass =
                   IDecl->lookupInstanceMethod(method->getSelector(), 
-                                              true /*shallowCategoryLookup*/,
-                                              PDecl))
+                                              true /*shallowCategoryLookup*/))
               if (C || MethodInClass->isPropertyAccessor())
                 continue;
             unsigned DIAG = diag::warn_unimplemented_protocol_method;
@@ -1697,13 +1695,10 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc,
     ObjCMethodDecl *method = *I;
     if (method->getImplementationControl() != ObjCMethodDecl::Optional &&
         !ClsMap.count(method->getSelector()) &&
-        (!Super || !Super->lookupClassMethod(method->getSelector(),
-                                             /* shallowCategoryLookup */ false,
-                                             PDecl))) {
+        (!Super || !Super->lookupClassMethod(method->getSelector()))) {
       // See above comment for instance method lookups.
       if (C && IDecl->lookupClassMethod(method->getSelector(), 
-                                        true /*shallowCategoryLookup*/,
-                                        PDecl))
+                                        true /*shallowCategoryLookup*/))
         continue;
       unsigned DIAG = diag::warn_unimplemented_protocol_method;
       if (Diags.getDiagnosticLevel(DIAG, ImpLoc) !=
diff --git a/test/SemaObjC/protocols-suppress-conformance.m b/test/SemaObjC/protocols-suppress-conformance.m
deleted file mode 100644 (file)
index 77c7e25..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-// RUN: %clang_cc1  -fsyntax-only -verify %s -Wno-objc-root-class
-
-@protocol FooProto
-- (void) theBestOfTimes; // expected-note {{method 'theBestOfTimes' declared here}}
-@end
-
-__attribute__((objc_suppress_protocol(FooProto)))
-@interface Bar
-- (void) theBestOfTimes;
-@end
-
-@interface Bar2 : Bar
-@end
-
-@interface Baz : Bar2 <FooProto> // expected-note {{required for direct or indirect protocol 'FooProto'}}
-@end
-
-@interface Baz2 : Bar2 <FooProto>
-- (void) theBestOfTimes;
-@end
-
-@implementation Baz // expected-warning {{method 'theBestOfTimes' in protocol not implemented}}
-@end
-
-@implementation Baz2 // no-warning
-- (void) theBestOfTimes {}
-@end
\ No newline at end of file