From: Fariborz Jahanian Date: Tue, 3 Jan 2012 18:45:41 +0000 (+0000) Subject: objc: introduce objc_suppress_autosynthesis class X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e23dcf3524fe01208cc79e707412f0a5dd8eed7b;p=clang objc: introduce objc_suppress_autosynthesis class attributes for later use. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147457 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 7837b2b2f2..491453ee19 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -864,6 +864,18 @@ public: return false; } + /// isObjCSuppressAutosynthesis - Checks that a class or one of its super + /// classes must not be auto-synthesized. Returns true if it must not be. + bool isObjCSuppressAutosynthesis() const { + const ObjCInterfaceDecl *Class = this; + while (Class) { + if (Class->hasAttr()) + return true; + Class = Class->getSuperClass(); + } + return false; + } + ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared); ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *IVarName) { diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index 0839df8baf..bf9a6ce147 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -524,6 +524,10 @@ def ArcWeakrefUnavailable : InheritableAttr { let Spellings = ["objc_arc_weak_reference_unavailable"]; } +def ObjCSuppressAutosynthesis : InheritableAttr { + let Spellings = ["objc_suppress_autosynhesis"]; +} + def Unused : InheritableAttr { let Spellings = ["unused"]; } diff --git a/include/clang/Sema/AttributeList.h b/include/clang/Sema/AttributeList.h index 0c64e2c487..a0d7c4a565 100644 --- a/include/clang/Sema/AttributeList.h +++ b/include/clang/Sema/AttributeList.h @@ -169,6 +169,7 @@ public: AT_analyzer_noreturn, AT_annotate, AT_arc_weakref_unavailable, + AT_objc_suppress_autosynthesis, AT_availability, // Clang-specific AT_base_check, AT_blocks, diff --git a/lib/Sema/AttributeList.cpp b/lib/Sema/AttributeList.cpp index 13a0edec28..a8ccbb1f56 100644 --- a/lib/Sema/AttributeList.cpp +++ b/lib/Sema/AttributeList.cpp @@ -108,6 +108,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) { .Case("weak", AT_weak) .Case("weakref", AT_weakref) .Case("objc_arc_weak_reference_unavailable", AT_arc_weakref_unavailable) + .Case("objc_suppress_autosynthesis", AT_objc_suppress_autosynthesis) .Case("pure", AT_pure) .Case("mode", AT_mode) .Case("used", AT_used) diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 1626bf14b6..4074afee1c 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -1579,6 +1579,18 @@ static void handleArcWeakrefUnavailableAttr(Sema &S, Decl *D, Attr.getRange(), S.Context)); } +static void handleObjCSuppressAutosynthesisAttr(Sema &S, Decl *D, + const AttributeList &Attr) { + unsigned NumArgs = Attr.getNumArgs(); + if (NumArgs > 0) { + S.Diag(Attr.getLoc(), diag::err_attribute_too_many_arguments) << 0; + return; + } + + D->addAttr(::new (S.Context) ObjCSuppressAutosynthesisAttr( + Attr.getRange(), S.Context)); +} + static void handleAvailabilityAttr(Sema &S, Decl *D, const AttributeList &Attr) { IdentifierInfo *Platform = Attr.getParameterName(); @@ -3603,6 +3615,9 @@ static void ProcessInheritableDeclAttr(Sema &S, Scope *scope, Decl *D, case AttributeList::AT_arc_weakref_unavailable: handleArcWeakrefUnavailableAttr (S, D, Attr); break; + case AttributeList::AT_objc_suppress_autosynthesis: + handleObjCSuppressAutosynthesisAttr (S, D, Attr); + break; case AttributeList::AT_unused: handleUnusedAttr (S, D, Attr); break; case AttributeList::AT_returns_twice: handleReturnsTwiceAttr(S, D, Attr);