diff options
author | Douglas Gregor <dgregor@apple.com> | 2013-01-17 23:36:45 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2013-01-17 23:36:45 +0000 |
commit | cd78037ad117b12b549d7e7d1d1435f9803e678e (patch) | |
tree | 9022d221f8030c4bc2c9dea189da5e5432c3e9a1 /clang/lib/Sema | |
parent | 0e9c94199cbb814f3f8b88eef951e8880c0da9cc (diff) | |
download | bcm5719-llvm-cd78037ad117b12b549d7e7d1d1435f9803e678e.tar.gz bcm5719-llvm-cd78037ad117b12b549d7e7d1d1435f9803e678e.zip |
In Objective-C ARC, completely ignore ownership qualifiers on the
return type of a function by canonicalizing them away. They are
useless anyway, and conflict with our rules for template argument
deduction and __strong. Fixes <rdar://problem/12367446>.
llvm-svn: 172768
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 15aa39b7e4e..35816a42f33 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -2471,6 +2471,44 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, S); } + // Objective-C ARC ownership qualifiers are ignored on the function + // return type (by type canonicalization). Complain if this attribute + // was written here. + if (T.getQualifiers().hasObjCLifetime()) { + SourceLocation AttrLoc; + if (chunkIndex + 1 < D.getNumTypeObjects()) { + DeclaratorChunk ReturnTypeChunk = D.getTypeObject(chunkIndex + 1); + for (const AttributeList *Attr = ReturnTypeChunk.getAttrs(); + Attr; Attr = Attr->getNext()) { + if (Attr->getKind() == AttributeList::AT_ObjCOwnership) { + AttrLoc = Attr->getLoc(); + break; + } + } + } + if (AttrLoc.isInvalid()) { + for (const AttributeList *Attr + = D.getDeclSpec().getAttributes().getList(); + Attr; Attr = Attr->getNext()) { + if (Attr->getKind() == AttributeList::AT_ObjCOwnership) { + AttrLoc = Attr->getLoc(); + break; + } + } + } + + if (AttrLoc.isValid()) { + // The ownership attributes are almost always written via + // the predefined + // __strong/__weak/__autoreleasing/__unsafe_unretained. + if (AttrLoc.isMacroID()) + AttrLoc = S.SourceMgr.getImmediateExpansionRange(AttrLoc).first; + + S.Diag(AttrLoc, diag::warn_arc_lifetime_result_type) + << T.getQualifiers().getObjCLifetime(); + } + } + if (LangOpts.CPlusPlus && D.getDeclSpec().isTypeSpecOwned()) { // C++ [dcl.fct]p6: // Types shall not be defined in return or parameter types. |