diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-04-24 23:09:54 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-04-24 23:09:54 +0000 |
commit | 44e662cd4f911efaf2f645252ec1fe8577b3f52c (patch) | |
tree | 7d724e251e7129f5a61c7c301dcb94926e0c6896 /clang/lib | |
parent | defc644e065dd3d9adde7df7fdb658e271a37764 (diff) | |
download | bcm5719-llvm-44e662cd4f911efaf2f645252ec1fe8577b3f52c.tar.gz bcm5719-llvm-44e662cd4f911efaf2f645252ec1fe8577b3f52c.zip |
Add new checker-specific attribute 'objc_ownership_returns'. This isn't hooked
up to the checker yet, but essentially it allows a user to specify that an
Objective-C method or C function returns an owned an Objective-C object.
llvm-svn: 70001
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Frontend/PCHReader.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Frontend/PCHWriter.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Parse/AttributeList.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 21 |
4 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/Frontend/PCHReader.cpp b/clang/lib/Frontend/PCHReader.cpp index 2dfb7e0a0a0..bbe92a0329e 100644 --- a/clang/lib/Frontend/PCHReader.cpp +++ b/clang/lib/Frontend/PCHReader.cpp @@ -3045,6 +3045,7 @@ Attr *PCHReader::ReadAttributes() { SIMPLE_ATTR(ObjCException); SIMPLE_ATTR(ObjCNSObject); + SIMPLE_ATTR(ObjCOwnershipReturns); SIMPLE_ATTR(Overloadable); UNSIGNED_ATTR(Packed); SIMPLE_ATTR(Pure); diff --git a/clang/lib/Frontend/PCHWriter.cpp b/clang/lib/Frontend/PCHWriter.cpp index 782244c60ed..4d2f4092ef7 100644 --- a/clang/lib/Frontend/PCHWriter.cpp +++ b/clang/lib/Frontend/PCHWriter.cpp @@ -2181,6 +2181,7 @@ void PCHWriter::WriteAttributeRecord(const Attr *Attr) { case Attr::ObjCException: case Attr::ObjCNSObject: + case Attr::ObjCOwnershipReturns: case Attr::Overloadable: break; diff --git a/clang/lib/Parse/AttributeList.cpp b/clang/lib/Parse/AttributeList.cpp index 5797a154080..33715899c5c 100644 --- a/clang/lib/Parse/AttributeList.cpp +++ b/clang/lib/Parse/AttributeList.cpp @@ -133,6 +133,10 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) { case 18: if (!memcmp(Str, "warn_unused_result", 18)) return AT_warn_unused_result; break; + case 22: + if (!memcmp(Str, "objc_ownership_returns", 22)) + return AT_objc_ownership_returns; + break; } return UnknownAttribute; } diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index d05b99ac365..5a99fdccd16 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -1518,6 +1518,22 @@ static void HandleRegparmAttr(Decl *d, const AttributeList &Attr, Sema &S) { } //===----------------------------------------------------------------------===// +// Checker-specific attribute handlers. +//===----------------------------------------------------------------------===// + +static void HandleObjCOwnershipReturnsAttr(Decl *d, const AttributeList &Attr, + Sema &S) { + + if (!isa<ObjCMethodDecl>(d) && !isa<FunctionDecl>(d)) { + S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) << + "objc_ownership_returns" << 3 /* function or method */; + return; + } + + d->addAttr(::new (S.Context) ObjCOwnershipReturnsAttr()); +} + +//===----------------------------------------------------------------------===// // Top Level Sema Entry Points //===----------------------------------------------------------------------===// @@ -1553,6 +1569,11 @@ static void ProcessDeclAttribute(Decl *D, const AttributeList &Attr, Sema &S) { case AttributeList::AT_nonnull: HandleNonNullAttr (D, Attr, S); break; case AttributeList::AT_noreturn: HandleNoReturnAttr (D, Attr, S); break; case AttributeList::AT_nothrow: HandleNothrowAttr (D, Attr, S); break; + + // Checker-specific. + case AttributeList::AT_objc_ownership_returns: + HandleObjCOwnershipReturnsAttr(D, Attr, S); break; + case AttributeList::AT_packed: HandlePackedAttr (D, Attr, S); break; case AttributeList::AT_section: HandleSectionAttr (D, Attr, S); break; case AttributeList::AT_stdcall: HandleStdCallAttr (D, Attr, S); break; |