]> granicus.if.org Git - clang/commitdiff
Keep track of whether a tag was defined in a declarator vs. being
authorDouglas Gregor <dgregor@apple.com>
Mon, 8 Feb 2010 22:07:33 +0000 (22:07 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 8 Feb 2010 22:07:33 +0000 (22:07 +0000)
defined by itself, from Enea Zaffanella!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95586 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Decl.h
lib/Frontend/PCHReaderDecl.cpp
lib/Frontend/PCHWriterDecl.cpp
lib/Sema/SemaType.cpp

index 8166316fccc38afdff2b1ec1e0a100f2a2ce08d8..58fb01d4fca7252f0b219ef04f83d4418f5b0e60 100644 (file)
@@ -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.
index 4dc1318a3ee8699d114361d53429fd80a71afb17..56cdfc6192344c9b8e14ac6dbbbab672390f3e7b 100644 (file)
@@ -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++]));
index 020f69b3e6696781c386d76285c86dbb0460ebbe..1901b2fad6856e0582e7071ed60d8bce172f833e 100644 (file)
@@ -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);
index 3ef13a2abaab240c1a00f5ea2b38a668ee764274..ceec5f226ff32452414a5fd4727a73cb93548b1e 100644 (file)
@@ -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: