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