[cfe-commits] r134273 - in /cfe/trunk: include/clang/AST/ASTContext.h include/clang/Sema/Sema.h lib/AST/ASTContext.cpp lib/Parse/ParseExprCXX.cpp lib/Sema/SemaCXXCast.cpp lib/Sema/SemaType.cpp test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p5.cpp test/SemaObjCXX/arc-type-conversion.mm
Douglas Gregor
dgregor at apple.com
Fri Jul 1 15:39:24 PDT 2011
On Jul 1, 2011, at 3:22 PM, Argyrios Kyrtzidis wrote:
> Author: akirtzidis
> Date: Fri Jul 1 17:22:50 2011
> New Revision: 134273
>
> URL: http://llvm.org/viewvc/llvm-project?rev=134273&view=rev
> Log:
> [ARC] When casting from a pointer to an objective-c object with known ownership, if the
> cast type has no ownership specified, implicitly "transfer" the ownership of the cast'ed type
> to the cast type:
>
> id x;
> static_cast<NSString**>(&x); // Casting as (__strong NSString**).
>
> This currently only works for C++ named casts, C casts to follow.
Nice! One comment below.
> Modified:
> cfe/trunk/include/clang/AST/ASTContext.h
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/lib/AST/ASTContext.cpp
> cfe/trunk/lib/Parse/ParseExprCXX.cpp
> cfe/trunk/lib/Sema/SemaCXXCast.cpp
> cfe/trunk/lib/Sema/SemaType.cpp
> cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p5.cpp
> cfe/trunk/test/SemaObjCXX/arc-type-conversion.mm
>
> Modified: cfe/trunk/include/clang/AST/ASTContext.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=134273&r1=134272&r2=134273&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ASTContext.h (original)
> +++ cfe/trunk/include/clang/AST/ASTContext.h Fri Jul 1 17:22:50 2011
> @@ -1347,6 +1347,10 @@
> /// integer type.
> QualType getPromotedIntegerType(QualType PromotableType) const;
>
> + /// \brief Recurses in pointer/array types until it finds an objc retainable
> + /// type and returns its ownership.
> + Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const;
> +
> /// \brief Whether this is a promotable bitfield reference according
> /// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
> ///
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=134273&r1=134272&r2=134273&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Fri Jul 1 17:22:50 2011
> @@ -783,6 +783,7 @@
> QualType BuildParenType(QualType T);
>
> TypeSourceInfo *GetTypeForDeclarator(Declarator &D, Scope *S);
> + TypeSourceInfo *GetTypeForDeclaratorCast(Declarator &D, QualType FromTy);
> TypeSourceInfo *GetTypeSourceInfoForDeclarator(Declarator &D, QualType T,
> TypeSourceInfo *ReturnTypeInfo);
> /// \brief Package the given type and TSI into a ParsedType.
> @@ -2825,7 +2826,7 @@
> ExprResult ActOnCXXNamedCast(SourceLocation OpLoc,
> tok::TokenKind Kind,
> SourceLocation LAngleBracketLoc,
> - ParsedType Ty,
> + Declarator &D,
> SourceLocation RAngleBracketLoc,
> SourceLocation LParenLoc,
> Expr *E,
>
> Modified: cfe/trunk/lib/AST/ASTContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=134273&r1=134272&r2=134273&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> +++ cfe/trunk/lib/AST/ASTContext.cpp Fri Jul 1 17:22:50 2011
> @@ -3512,6 +3512,25 @@
> return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy;
> }
>
> +/// \brief Recurses in pointer/array types until it finds an objc retainable
> +/// type and returns its ownership.
> +Qualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const {
> + while (!T.isNull()) {
> + if (T.getObjCLifetime() != Qualifiers::OCL_None)
> + return T.getObjCLifetime();
> + if (T->isArrayType())
> + T = getBaseElementType(T);
> + else if (const PointerType *PT = T->getAs<PointerType>())
> + T = PT->getPointeeType();
> + else if (const ReferenceType *RT = T->getAs<ReferenceType>())
> + RT->getPointeeType();
You meant "T = RT->getPointeeType();" here.
- Doug
More information about the cfe-commits
mailing list