[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