forked from OSchip/llvm-project
Address comments from Doug - Add a Sema::SemaRef.BuildBlockPointerType and use it.
llvm-svn: 73264
This commit is contained in:
parent
170bc42547
commit
15f1dd1c88
|
@ -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);
|
||||
|
|
|
@ -497,6 +497,8 @@ DeduceTemplateArguments(ASTContext &Context,
|
|||
Info, Deduced);
|
||||
}
|
||||
|
||||
// (clang extension)
|
||||
//
|
||||
// type(^)(T)
|
||||
// T(^)()
|
||||
// T(^)(T)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue