diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-02-12 17:40:34 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-02-12 17:40:34 +0000 |
commit | 5089c769bb986e21f63a0ec2fb48a03ac946415c (patch) | |
tree | 670b7f528afd63ddf763a831a2e7955157d73a68 | |
parent | 5272c2574a99a0b245bf71f7c0137178e9374b57 (diff) | |
download | bcm5719-llvm-5089c769bb986e21f63a0ec2fb48a03ac946415c.tar.gz bcm5719-llvm-5089c769bb986e21f63a0ec2fb48a03ac946415c.zip |
Improve representation of tag declarations first declared or defined
within the declarator of another declaration, from Enea Zaffanella!
llvm-svn: 95991
-rw-r--r-- | clang/include/clang/AST/Decl.h | 17 | ||||
-rw-r--r-- | clang/lib/Frontend/PCHReaderDecl.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Frontend/PCHWriterDecl.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 5 |
4 files changed, 15 insertions, 11 deletions
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index b9c9d9eb2c7..07442896dc4 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -1511,9 +1511,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; + /// IsEmbeddedInDeclarator - True if this tag declaration is + /// "embedded" (i.e., defined or declared for the very first time) + /// in the syntax of a declarator, + bool IsEmbeddedInDeclarator : 1; /// TypedefForAnonDecl - If a TagDecl is anonymous and part of a typedef, /// this points to the TypedefDecl. Used for mangling. @@ -1531,7 +1532,7 @@ protected: assert((DK != Enum || TK == TK_enum) &&"EnumDecl not matched with TK_enum"); TagDeclKind = TK; IsDefinition = false; - IsDefinedInDeclarator = false; + IsEmbeddedInDeclarator = false; setPreviousDeclaration(PrevDecl); } @@ -1565,11 +1566,11 @@ public: return IsDefinition; } - bool isDefinedInDeclarator() const { - return IsDefinedInDeclarator; + bool isEmbeddedInDeclarator() const { + return IsEmbeddedInDeclarator; } - void setDefinedInDeclarator(bool isInDeclarator) { - IsDefinedInDeclarator = isInDeclarator; + void setEmbeddedInDeclarator(bool isInDeclarator) { + IsEmbeddedInDeclarator = isInDeclarator; } /// \brief Whether this declaration declares a type that is diff --git a/clang/lib/Frontend/PCHReaderDecl.cpp b/clang/lib/Frontend/PCHReaderDecl.cpp index 6a93e6c265d..625997cac23 100644 --- a/clang/lib/Frontend/PCHReaderDecl.cpp +++ b/clang/lib/Frontend/PCHReaderDecl.cpp @@ -117,7 +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->setEmbeddedInDeclarator(Record[Idx++]); TD->setTypedefForAnonDecl( cast_or_null<TypedefDecl>(Reader.GetDecl(Record[Idx++]))); TD->setRBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); diff --git a/clang/lib/Frontend/PCHWriterDecl.cpp b/clang/lib/Frontend/PCHWriterDecl.cpp index 1901b2fad68..d105382b435 100644 --- a/clang/lib/Frontend/PCHWriterDecl.cpp +++ b/clang/lib/Frontend/PCHWriterDecl.cpp @@ -115,7 +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()); + Record.push_back(D->isEmbeddedInDeclarator()); Writer.AddDeclRef(D->getTypedefForAnonDecl(), Record); Writer.AddSourceLocation(D->getRBraceLoc(), Record); Writer.AddSourceLocation(D->getTagKeywordLoc(), Record); diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index ceec5f226ff..7911e76d446 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -930,7 +930,10 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S, if (!D.isInvalidType() && D.getDeclSpec().isTypeSpecOwned()) { TagDecl* Owned = cast<TagDecl>((Decl *)D.getDeclSpec().getTypeRep()); - Owned->setDefinedInDeclarator(Owned->isDefinition()); + // Owned is embedded if it was defined here, or if it is the + // very first (i.e., canonical) declaration of this tag type. + Owned->setEmbeddedInDeclarator(Owned->isDefinition() || + Owned->isCanonicalDecl()); if (OwnedDecl) *OwnedDecl = Owned; } break; |