зеркало из https://github.com/microsoft/clang-1.git
Alter the interface of GetTypeForDeclarator to return a TypeSourceInfo*.
This is never null, but the associated type might be. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105503 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
6deecb0d46
Коммит
bf1a028246
|
@ -162,6 +162,8 @@ class ASTContext {
|
|||
/// \brief Type for the Block descriptor for Blocks CodeGen.
|
||||
RecordDecl *BlockDescriptorExtendedType;
|
||||
|
||||
TypeSourceInfo NullTypeSourceInfo;
|
||||
|
||||
/// \brief Keeps track of all declaration attributes.
|
||||
///
|
||||
/// Since so few decls have attrs, we keep them in a hash map instead of
|
||||
|
@ -1272,6 +1274,8 @@ public:
|
|||
TypeSourceInfo *
|
||||
getTrivialTypeSourceInfo(QualType T, SourceLocation Loc = SourceLocation());
|
||||
|
||||
TypeSourceInfo *getNullTypeSourceInfo() { return &NullTypeSourceInfo; }
|
||||
|
||||
/// \brief Add a deallocation callback that will be invoked when the
|
||||
/// ASTContext is destroyed.
|
||||
///
|
||||
|
|
|
@ -44,6 +44,7 @@ ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM,
|
|||
NSConstantStringTypeDecl(0),
|
||||
ObjCFastEnumerationStateTypeDecl(0), FILEDecl(0), jmp_bufDecl(0),
|
||||
sigjmp_bufDecl(0), BlockDescriptorType(0), BlockDescriptorExtendedType(0),
|
||||
NullTypeSourceInfo(QualType()),
|
||||
SourceMgr(SM), LangOpts(LOpts), FreeMemory(FreeMem), Target(t),
|
||||
Idents(idents), Selectors(sels),
|
||||
BuiltinInfo(builtins),
|
||||
|
|
|
@ -736,9 +736,8 @@ public:
|
|||
DeclarationName Entity);
|
||||
QualType BuildBlockPointerType(QualType T, unsigned Quals,
|
||||
SourceLocation Loc, DeclarationName Entity);
|
||||
QualType GetTypeForDeclarator(Declarator &D, Scope *S,
|
||||
TypeSourceInfo **TInfo = 0,
|
||||
TagDecl **OwnedDecl = 0);
|
||||
TypeSourceInfo *GetTypeForDeclarator(Declarator &D, Scope *S,
|
||||
TagDecl **OwnedDecl = 0);
|
||||
TypeSourceInfo *GetTypeSourceInfoForDeclarator(Declarator &D, QualType T,
|
||||
TypeSourceInfo *ReturnTypeInfo);
|
||||
/// \brief Create a LocInfoType to hold the given QualType and TypeSourceInfo.
|
||||
|
|
|
@ -1795,8 +1795,7 @@ Sema::DeclPtrTy Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS,
|
|||
|
||||
// Mock up a declarator.
|
||||
Declarator Dc(DS, Declarator::TypeNameContext);
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
GetTypeForDeclarator(Dc, S, &TInfo);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(Dc, S);
|
||||
assert(TInfo && "couldn't build declarator info for anonymous struct/union");
|
||||
|
||||
// Create a declaration for this anonymous struct/union.
|
||||
|
@ -2091,8 +2090,8 @@ Sema::HandleDeclarator(Scope *S, Declarator &D,
|
|||
|
||||
NamedDecl *New;
|
||||
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
QualType R = GetTypeForDeclarator(D, S, &TInfo);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
|
||||
QualType R = TInfo->getType();
|
||||
|
||||
LookupResult Previous(*this, Name, D.getIdentifierLoc(), LookupOrdinaryName,
|
||||
ForRedeclaration);
|
||||
|
@ -4258,9 +4257,9 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
|
|||
if (getLangOptions().CPlusPlus)
|
||||
CheckExtraCXXDefaultArguments(D);
|
||||
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
TagDecl *OwnedDecl = 0;
|
||||
QualType parmDeclType = GetTypeForDeclarator(D, S, &TInfo, &OwnedDecl);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedDecl);
|
||||
QualType parmDeclType = TInfo->getType();
|
||||
|
||||
if (getLangOptions().CPlusPlus && OwnedDecl && OwnedDecl->isDefinition()) {
|
||||
// C++ [dcl.fct]p6:
|
||||
|
@ -5635,8 +5634,8 @@ FieldDecl *Sema::HandleField(Scope *S, RecordDecl *Record,
|
|||
SourceLocation Loc = DeclStart;
|
||||
if (II) Loc = D.getIdentifierLoc();
|
||||
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
QualType T = GetTypeForDeclarator(D, S, &TInfo);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
|
||||
QualType T = TInfo->getType();
|
||||
if (getLangOptions().CPlusPlus)
|
||||
CheckExtraCXXDefaultArguments(D);
|
||||
|
||||
|
@ -6009,8 +6008,8 @@ Sema::DeclPtrTy Sema::ActOnIvar(Scope *S,
|
|||
// FIXME: Unnamed fields can be handled in various different ways, for
|
||||
// example, unnamed unions inject all members into the struct namespace!
|
||||
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
QualType T = GetTypeForDeclarator(D, S, &TInfo);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
|
||||
QualType T = TInfo->getType();
|
||||
|
||||
if (BitWidth) {
|
||||
// 6.7.2.1p3, 6.7.2.1p4
|
||||
|
|
|
@ -5467,8 +5467,8 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S, QualType ExDeclType,
|
|||
/// ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch
|
||||
/// handler.
|
||||
Sema::DeclPtrTy Sema::ActOnExceptionDeclarator(Scope *S, Declarator &D) {
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
QualType ExDeclType = GetTypeForDeclarator(D, S, &TInfo);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
|
||||
QualType ExDeclType = TInfo->getType();
|
||||
|
||||
bool Invalid = D.isInvalidType();
|
||||
IdentifierInfo *II = D.getIdentifier();
|
||||
|
@ -5622,14 +5622,11 @@ Sema::DeclPtrTy Sema::ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
|
|||
// friend templates because ActOnTag never produces a ClassTemplateDecl
|
||||
// for a TUK_Friend.
|
||||
Declarator TheDeclarator(DS, Declarator::MemberContext);
|
||||
TypeSourceInfo *TSI;
|
||||
QualType T = GetTypeForDeclarator(TheDeclarator, S, &TSI);
|
||||
TypeSourceInfo *TSI = GetTypeForDeclarator(TheDeclarator, S);
|
||||
QualType T = TSI->getType();
|
||||
if (TheDeclarator.isInvalidType())
|
||||
return DeclPtrTy();
|
||||
|
||||
if (!TSI)
|
||||
TSI = Context.getTrivialTypeSourceInfo(T, DS.getSourceRange().getBegin());
|
||||
|
||||
// This is definitely an error in C++98. It's probably meant to
|
||||
// be forbidden in C++0x, too, but the specification is just
|
||||
// poorly written.
|
||||
|
@ -5691,8 +5688,8 @@ Sema::ActOnFriendFunctionDecl(Scope *S,
|
|||
assert(DS.getStorageClassSpec() == DeclSpec::SCS_unspecified);
|
||||
|
||||
SourceLocation Loc = D.getIdentifierLoc();
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
QualType T = GetTypeForDeclarator(D, S, &TInfo);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
|
||||
QualType T = TInfo->getType();
|
||||
|
||||
// C++ [class.friend]p1
|
||||
// A friend of a class is a function or class....
|
||||
|
@ -6056,9 +6053,9 @@ Sema::ActOnCXXConditionDeclaration(Scope *S, Declarator &D) {
|
|||
assert(D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
|
||||
"Parser allowed 'typedef' as storage class of condition decl.");
|
||||
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
TagDecl *OwnedTag = 0;
|
||||
QualType Ty = GetTypeForDeclarator(D, S, &TInfo, &OwnedTag);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedTag);
|
||||
QualType Ty = TInfo->getType();
|
||||
|
||||
if (Ty->isFunctionType()) { // The declarator shall not specify a function...
|
||||
// We exit without creating a CXXConditionDeclExpr because a FunctionDecl
|
||||
|
|
|
@ -1775,9 +1775,9 @@ Sema::DeclPtrTy Sema::ActOnObjCExceptionDecl(Scope *S, Declarator &D) {
|
|||
if (getLangOptions().CPlusPlus)
|
||||
CheckExtraCXXDefaultArguments(D);
|
||||
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
TagDecl *OwnedDecl = 0;
|
||||
QualType ExceptionType = GetTypeForDeclarator(D, S, &TInfo, &OwnedDecl);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedDecl);
|
||||
QualType ExceptionType = TInfo->getType();
|
||||
|
||||
if (getLangOptions().CPlusPlus && OwnedDecl && OwnedDecl->isDefinition()) {
|
||||
// Objective-C++: Types shall not be defined in exception types.
|
||||
|
|
|
@ -6996,9 +6996,9 @@ void Sema::ActOnBlockArguments(Declarator &ParamInfo, Scope *CurScope) {
|
|||
assert(ParamInfo.getIdentifier()==0 && "block-id should have no identifier!");
|
||||
BlockScopeInfo *CurBlock = getCurBlock();
|
||||
|
||||
TypeSourceInfo *Sig = 0;
|
||||
QualType T = GetTypeForDeclarator(ParamInfo, CurScope, &Sig);
|
||||
TypeSourceInfo *Sig = GetTypeForDeclarator(ParamInfo, CurScope);
|
||||
CurBlock->TheDecl->setSignatureAsWritten(Sig);
|
||||
QualType T = Sig->getType();
|
||||
|
||||
bool isVariadic;
|
||||
QualType RetTy;
|
||||
|
|
|
@ -666,8 +666,8 @@ Sema::ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
|
|||
}
|
||||
|
||||
//FIXME: Store TypeSourceInfo in CXXNew expression.
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
QualType AllocType = GetTypeForDeclarator(D, /*Scope=*/0, &TInfo);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, /*Scope=*/0);
|
||||
QualType AllocType = TInfo->getType();
|
||||
if (D.isInvalidType())
|
||||
return ExprError();
|
||||
|
||||
|
|
|
@ -41,8 +41,8 @@ Sema::DeclPtrTy Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
|
|||
!(Attributes & ObjCDeclSpec::DQ_PR_retain) &&
|
||||
!(Attributes & ObjCDeclSpec::DQ_PR_copy)));
|
||||
|
||||
TypeSourceInfo *TSI = 0;
|
||||
QualType T = GetTypeForDeclarator(FD.D, S, &TSI);
|
||||
TypeSourceInfo *TSI = GetTypeForDeclarator(FD.D, S);
|
||||
QualType T = TSI->getType();
|
||||
if (T->isReferenceType()) {
|
||||
Diag(AtLoc, diag::error_reference_property);
|
||||
return DeclPtrTy();
|
||||
|
|
|
@ -586,8 +586,8 @@ Sema::CheckNonTypeTemplateParameterType(QualType T, SourceLocation Loc) {
|
|||
Sema::DeclPtrTy Sema::ActOnNonTypeTemplateParameter(Scope *S, Declarator &D,
|
||||
unsigned Depth,
|
||||
unsigned Position) {
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
QualType T = GetTypeForDeclarator(D, S, &TInfo);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
|
||||
QualType T = TInfo->getType();
|
||||
|
||||
assert(S->isTemplateParamScope() &&
|
||||
"Non-type template parameter not in template parameter scope!");
|
||||
|
@ -4970,7 +4970,8 @@ Sema::DeclResult Sema::ActOnExplicitInstantiation(Scope *S,
|
|||
S = S->getParent();
|
||||
|
||||
// Determine the type of the declaration.
|
||||
QualType R = GetTypeForDeclarator(D, S, 0);
|
||||
TypeSourceInfo *T = GetTypeForDeclarator(D, S);
|
||||
QualType R = T->getType();
|
||||
if (R.isNull())
|
||||
return true;
|
||||
|
||||
|
|
|
@ -947,9 +947,11 @@ QualType Sema::GetTypeFromParser(TypeTy *Ty, TypeSourceInfo **TInfo) {
|
|||
/// If OwnedDecl is non-NULL, and this declarator's decl-specifier-seq
|
||||
/// owns the declaration of a type (e.g., the definition of a struct
|
||||
/// type), then *OwnedDecl will receive the owned declaration.
|
||||
QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
|
||||
TypeSourceInfo **TInfo,
|
||||
TagDecl **OwnedDecl) {
|
||||
///
|
||||
/// The result of this call will never be null, but the associated
|
||||
/// type may be a null type if there's an unrecoverable error.
|
||||
TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
|
||||
TagDecl **OwnedDecl) {
|
||||
// Determine the type of the declarator. Not all forms of declarator
|
||||
// have a type.
|
||||
QualType T;
|
||||
|
@ -980,22 +982,18 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
|
|||
// Constructors and destructors don't have return types. Use
|
||||
// "void" instead.
|
||||
T = Context.VoidTy;
|
||||
|
||||
if (TInfo)
|
||||
ReturnTypeInfo = Context.getTrivialTypeSourceInfo(T,
|
||||
D.getName().StartLocation);
|
||||
break;
|
||||
|
||||
case UnqualifiedId::IK_ConversionFunctionId:
|
||||
// The result type of a conversion function is the type that it
|
||||
// converts to.
|
||||
T = GetTypeFromParser(D.getName().ConversionFunctionId,
|
||||
TInfo? &ReturnTypeInfo : 0);
|
||||
&ReturnTypeInfo);
|
||||
break;
|
||||
}
|
||||
|
||||
if (T.isNull())
|
||||
return T;
|
||||
return Context.getNullTypeSourceInfo();
|
||||
|
||||
if (T == Context.UndeducedAutoTy) {
|
||||
int Error = -1;
|
||||
|
@ -1386,14 +1384,11 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
|
|||
|
||||
DiagnoseDelayedFnAttrs(*this, FnAttrsFromPreviousChunk);
|
||||
|
||||
if (TInfo) {
|
||||
if (D.isInvalidType())
|
||||
*TInfo = 0;
|
||||
else
|
||||
*TInfo = GetTypeSourceInfoForDeclarator(D, T, ReturnTypeInfo);
|
||||
}
|
||||
|
||||
return T;
|
||||
if (T.isNull())
|
||||
return Context.getNullTypeSourceInfo();
|
||||
else if (D.isInvalidType())
|
||||
return Context.getTrivialTypeSourceInfo(T);
|
||||
return GetTypeSourceInfoForDeclarator(D, T, ReturnTypeInfo);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
@ -1695,9 +1690,9 @@ Sema::TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
|
|||
// the parser.
|
||||
assert(D.getIdentifier() == 0 && "Type name should have no identifier!");
|
||||
|
||||
TypeSourceInfo *TInfo = 0;
|
||||
TagDecl *OwnedTag = 0;
|
||||
QualType T = GetTypeForDeclarator(D, S, &TInfo, &OwnedTag);
|
||||
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S, &OwnedTag);
|
||||
QualType T = TInfo->getType();
|
||||
if (D.isInvalidType())
|
||||
return true;
|
||||
|
||||
|
@ -1714,9 +1709,7 @@ Sema::TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
|
|||
<< Context.getTypeDeclType(OwnedTag);
|
||||
}
|
||||
|
||||
if (TInfo)
|
||||
T = CreateLocInfoType(T, TInfo);
|
||||
|
||||
T = CreateLocInfoType(T, TInfo);
|
||||
return T.getAsOpaquePtr();
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче