summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclAttr.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-01-13 23:34:40 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-01-13 23:34:40 +0000
commit255c0958ddc2d06c61160ea654260f146e79092e (patch)
tree6df78f6933ce20eae1c2cf0d851c40ef3dd45505 /clang/lib/Sema/SemaDeclAttr.cpp
parenta63bede3c6f6560e32c18b9917905db61bba3c98 (diff)
downloadbcm5719-llvm-255c0958ddc2d06c61160ea654260f146e79092e.tar.gz
bcm5719-llvm-255c0958ddc2d06c61160ea654260f146e79092e.zip
Implemenent objective-c's NSObject attribute as a way of ddeclaraing c-type
objects as an objective-c object. llvm-svn: 62197
Diffstat (limited to 'clang/lib/Sema/SemaDeclAttr.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 759ef0950b5..f444c71e4f5 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -578,6 +578,22 @@ static void HandleObjCGCAttr(Decl *d, const AttributeList &Attr, Sema &S) {
d->addAttr(new ObjCGCAttr(type));
}
+static void HandleObjCNSObject(Decl *d, const AttributeList &Attr, Sema &S) {
+ if (Attr.getNumArgs() != 0) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
+ return;
+ }
+ if (TypedefDecl *TD = dyn_cast<TypedefDecl>(d)) {
+ QualType T = TD->getUnderlyingType();
+ if (!T->isPointerType() ||
+ !T->getAsPointerType()->getPointeeType()->isRecordType()) {
+ S.Diag(TD->getLocation(), diag::err_nsobject_attribute);
+ return;
+ }
+ }
+ d->addAttr(new ObjCNSObjectAttr);
+}
+
static void HandleBlocksAttr(Decl *d, const AttributeList &Attr, Sema &S) {
if (!Attr.getParameterName()) {
S.Diag(Attr.getLoc(), diag::err_attribute_argument_n_not_string)
@@ -1228,6 +1244,7 @@ static void ProcessDeclAttribute(Decl *D, const AttributeList &Attr, Sema &S) {
HandleTransparentUnionAttr(D, Attr, S);
break;
case AttributeList::AT_objc_gc: HandleObjCGCAttr (D, Attr, S); break;
+ case AttributeList::AT_nsobject: HandleObjCNSObject (D, Attr, S); break;
case AttributeList::AT_blocks: HandleBlocksAttr (D, Attr, S); break;
case AttributeList::AT_sentinel: HandleSentinelAttr (D, Attr, S); break;
case AttributeList::AT_const: HandleConstAttr (D, Attr, S); break;
OpenPOWER on IntegriCloud