From: Anders Carlsson Date: Fri, 12 Jun 2009 22:56:54 +0000 (+0000) Subject: Address comments from Doug - Add a Sema::SemaRef.BuildBlockPointerType and use it. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9a917e4fac79aba20fbd25983c78396475078918;p=clang Address comments from Doug - Add a Sema::SemaRef.BuildBlockPointerType and use it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73264 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index c54b5947f1..09b316286d 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -352,6 +352,8 @@ public: QualType BuildMemberPointerType(QualType T, QualType Class, unsigned Quals, SourceLocation Loc, DeclarationName Entity); + QualType BuildBlockPointerType(QualType T, unsigned Quals, + SourceLocation Loc, DeclarationName Entity); QualType GetTypeForDeclarator(Declarator &D, Scope *S, unsigned Skip = 0, TagDecl **OwnedDecl = 0); DeclarationName GetNameForDeclarator(Declarator &D); diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index 48e38ddf14..4bbfd048c2 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -497,6 +497,8 @@ DeduceTemplateArguments(ASTContext &Context, Info, Deduced); } + // (clang extension) + // // type(^)(T) // T(^)() // T(^)(T) diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 6814b36ada..1fd11147ed 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -278,9 +278,7 @@ TemplateTypeInstantiator::InstantiateBlockPointerType(const BlockPointerType *T, if (PointeeType.isNull()) return QualType(); - QualType BlockTy = SemaRef.Context.getBlockPointerType(PointeeType); - - return BlockTy.getQualifiedType(Quals); + return SemaRef.BuildBlockPointerType(PointeeType, Quals, Loc, Entity); } QualType diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 6c2a4dc2d0..70a9270607 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -660,7 +660,33 @@ QualType Sema::BuildMemberPointerType(QualType T, QualType Class, return Context.getMemberPointerType(T, Class.getTypePtr()) .getQualifiedType(Quals); } - + +/// \brief Build a block pointer type. +/// +/// \param T The type to which we'll be building a block pointer. +/// +/// \param Quals The cvr-qualifiers to be applied to the block pointer type. +/// +/// \param Loc The location of the entity whose type involves this +/// block pointer type or, if there is no such entity, the location of the +/// type that will have block pointer type. +/// +/// \param Entity The name of the entity that involves the block pointer +/// type, if known. +/// +/// \returns A suitable block pointer type, if there are no +/// errors. Otherwise, returns a NULL type. +QualType Sema::BuildBlockPointerType(QualType T, unsigned Quals, + SourceLocation Loc, + DeclarationName Entity) { + if (!T.getTypePtr()->isFunctionType()) { + Diag(Loc, diag::err_nonfunction_block_type); + return QualType(); + } + + return Context.getBlockPointerType(T).getQualifiedType(Quals); +} + /// GetTypeForDeclarator - Convert the type for the specified /// declarator to Type instances. Skip the outermost Skip type /// objects. @@ -735,11 +761,8 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S, unsigned Skip, if (!LangOpts.Blocks) Diag(DeclType.Loc, diag::err_blocks_disable); - if (!T.getTypePtr()->isFunctionType()) - Diag(D.getIdentifierLoc(), diag::err_nonfunction_block_type); - else - T = (Context.getBlockPointerType(T) - .getQualifiedType(DeclType.Cls.TypeQuals)); + T = BuildBlockPointerType(T, DeclType.Cls.TypeQuals, D.getIdentifierLoc(), + Name); break; case DeclaratorChunk::Pointer: // Verify that we're not building a pointer to pointer to function with