зеркало из https://github.com/microsoft/clang-1.git
Keep track of whether a tag was defined in a declarator vs. being
defined by itself, from Enea Zaffanella! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95586 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
8878686242
Коммит
591bd3cb60
|
@ -1512,6 +1512,10 @@ private:
|
|||
/// it is a declaration ("struct foo;").
|
||||
bool IsDefinition : 1;
|
||||
|
||||
/// IsDefinedInDeclarator - True if this tag declaration is
|
||||
/// syntactically defined in a declarator.
|
||||
bool IsDefinedInDeclarator : 1;
|
||||
|
||||
/// TypedefForAnonDecl - If a TagDecl is anonymous and part of a typedef,
|
||||
/// this points to the TypedefDecl. Used for mangling.
|
||||
TypedefDecl *TypedefForAnonDecl;
|
||||
|
@ -1528,6 +1532,7 @@ protected:
|
|||
assert((DK != Enum || TK == TK_enum) &&"EnumDecl not matched with TK_enum");
|
||||
TagDeclKind = TK;
|
||||
IsDefinition = false;
|
||||
IsDefinedInDeclarator = false;
|
||||
setPreviousDeclaration(PrevDecl);
|
||||
}
|
||||
|
||||
|
@ -1561,6 +1566,13 @@ public:
|
|||
return IsDefinition;
|
||||
}
|
||||
|
||||
bool isDefinedInDeclarator() const {
|
||||
return IsDefinedInDeclarator;
|
||||
}
|
||||
void setDefinedInDeclarator(bool isInDeclarator) {
|
||||
IsDefinedInDeclarator = isInDeclarator;
|
||||
}
|
||||
|
||||
/// \brief Whether this declaration declares a type that is
|
||||
/// dependent, i.e., a type that somehow depends on template
|
||||
/// parameters.
|
||||
|
|
|
@ -117,6 +117,7 @@ void PCHDeclReader::VisitTagDecl(TagDecl *TD) {
|
|||
cast_or_null<TagDecl>(Reader.GetDecl(Record[Idx++])));
|
||||
TD->setTagKind((TagDecl::TagKind)Record[Idx++]);
|
||||
TD->setDefinition(Record[Idx++]);
|
||||
TD->setDefinedInDeclarator(Record[Idx++]);
|
||||
TD->setTypedefForAnonDecl(
|
||||
cast_or_null<TypedefDecl>(Reader.GetDecl(Record[Idx++])));
|
||||
TD->setRBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
|
|
|
@ -115,6 +115,7 @@ void PCHDeclWriter::VisitTagDecl(TagDecl *D) {
|
|||
Writer.AddDeclRef(D->getPreviousDeclaration(), Record);
|
||||
Record.push_back((unsigned)D->getTagKind()); // FIXME: stable encoding
|
||||
Record.push_back(D->isDefinition());
|
||||
Record.push_back(D->isDefinedInDeclarator());
|
||||
Writer.AddDeclRef(D->getTypedefForAnonDecl(), Record);
|
||||
Writer.AddSourceLocation(D->getRBraceLoc(), Record);
|
||||
Writer.AddSourceLocation(D->getTagKeywordLoc(), Record);
|
||||
|
|
|
@ -928,8 +928,11 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
|
|||
case UnqualifiedId::IK_TemplateId:
|
||||
T = ConvertDeclSpecToType(*this, D, FnAttrsFromDeclSpec);
|
||||
|
||||
if (!D.isInvalidType() && OwnedDecl && D.getDeclSpec().isTypeSpecOwned())
|
||||
*OwnedDecl = cast<TagDecl>((Decl *)D.getDeclSpec().getTypeRep());
|
||||
if (!D.isInvalidType() && D.getDeclSpec().isTypeSpecOwned()) {
|
||||
TagDecl* Owned = cast<TagDecl>((Decl *)D.getDeclSpec().getTypeRep());
|
||||
Owned->setDefinedInDeclarator(Owned->isDefinition());
|
||||
if (OwnedDecl) *OwnedDecl = Owned;
|
||||
}
|
||||
break;
|
||||
|
||||
case UnqualifiedId::IK_ConstructorName:
|
||||
|
|
Загрузка…
Ссылка в новой задаче