Improve representation of tag declarations first declared or defined
within the declarator of another declaration, from Enea Zaffanella! llvm-svn: 95991
This commit is contained in:
		
							parent
							
								
									5272c2574a
								
							
						
					
					
						commit
						5089c769bb
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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++]));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue