objc: introduce objc_suppress_autosynthesis class

attributes for later use.

llvm-svn: 147457
This commit is contained in:
Fariborz Jahanian 2012-01-03 18:45:41 +00:00
parent 2007dc8892
commit 9d4d20af55
5 changed files with 33 additions and 0 deletions

View File

@ -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<ObjCSuppressAutosynthesisAttr>())
return true;
Class = Class->getSuperClass();
}
return false;
}
ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *IVarName,
ObjCInterfaceDecl *&ClassDeclared);
ObjCIvarDecl *lookupInstanceVariable(IdentifierInfo *IVarName) {

View File

@ -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"];
}

View File

@ -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,

View File

@ -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)

View File

@ -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);