]> granicus.if.org Git - clang/commitdiff
Actually distinguish between RecordDecl::field_iterator and RecordDecl::field_const_i...
authorDouglas Gregor <dgregor@apple.com>
Thu, 11 Dec 2008 17:59:21 +0000 (17:59 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 11 Dec 2008 17:59:21 +0000 (17:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60883 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/RewriteBlocks.cpp
Driver/RewriteObjC.cpp
include/clang/AST/Decl.h
lib/AST/ASTContext.cpp
lib/CodeGen/CGDebugInfo.cpp
lib/CodeGen/CodeGenTypes.cpp

index 5b6e1a988d8eeee7e8c318edb5ab3f4328f30382..1e7a6af91d0ac45f92f4749261e1956f1e7ccacf 100644 (file)
@@ -1134,7 +1134,7 @@ void RewriteBlocks::HandleDeclInMainFile(Decl *D) {
   }
   if (RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
     if (RD->isDefinition()) {
-      for (RecordDecl::field_const_iterator i = RD->field_begin(), 
+      for (RecordDecl::field_iterator i = RD->field_begin(), 
              e = RD->field_end(); i != e; ++i) {
         FieldDecl *FD = *i;
         if (isBlockPointerType(FD->getType()))
index 290a66856384b7935f1aba006092fa4208132ac0..2487d23759b036e00733ec329e0d67c6d8ee19b7 100644 (file)
@@ -4438,7 +4438,7 @@ void RewriteObjC::HandleDeclInMainFile(Decl *D) {
   }
   if (RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
     if (RD->isDefinition()) {
-      for (RecordDecl::field_const_iterator i = RD->field_begin(), 
+      for (RecordDecl::field_iterator i = RD->field_begin(), 
              e = RD->field_end(); i != e; ++i) {
         FieldDecl *FD = *i;
         if (isBlockPointerType(FD->getType()))
index 3b0eb551bb1d5fefd1879b9456ecc94556506c3b..3f7b53dfdcbaa3a99d0875fffcf6d6928da693a0 100644 (file)
@@ -1002,8 +1002,11 @@ public:
     return cast_or_null<RecordDecl>(TagDecl::getDefinition(C));
   }
   
-  // Iterator access to field members.
-  class field_iterator {
+  // Iterator access to field members. The field iterator only visits
+  // the non-static data members of this class, ignoring any static
+  // data members, functions, constructors, destructors, etc.
+  class field_const_iterator {
+  protected:
     /// Current - Current position within the sequence of declarations
     /// in this record. 
     DeclContext::decl_iterator Current;
@@ -1020,15 +1023,16 @@ public:
     }
 
   public:
-    typedef FieldDecl*                value_type;
-    typedef FieldDecl*                reference;
-    typedef FieldDecl*                pointer;
+    typedef FieldDecl const *         value_type;
+    typedef FieldDecl const *         reference;
+    typedef FieldDecl const *         pointer;
     typedef std::ptrdiff_t            difference_type;
     typedef std::forward_iterator_tag iterator_category;
 
-    field_iterator() : Current(), End() { }
+    field_const_iterator() : Current(), End() { }
 
-    field_iterator(DeclContext::decl_iterator C, DeclContext::decl_iterator E)
+    field_const_iterator(DeclContext::decl_iterator C, 
+                         DeclContext::decl_iterator E)
       : Current(C), End(E) {
       SkipToNextField();
     }
@@ -1037,36 +1041,71 @@ public:
 
     pointer operator->() const { return cast<FieldDecl>(*Current); }
 
-    field_iterator& operator++() {
+    field_const_iterator& operator++() {
       ++Current;
       SkipToNextField();
       return *this;
     }
 
-    field_iterator operator++(int) {
-      field_iterator tmp(*this);
+    field_const_iterator operator++(int) {
+      field_const_iterator tmp(*this);
       ++(*this);
       return tmp;
     }
 
-    friend bool operator==(const field_iterator& x, const field_iterator& y) {
+    friend bool
+    operator==(const field_const_iterator& x, const field_const_iterator& y) {
       return x.Current == y.Current;
     }
 
-    friend bool operator!=(const field_iterator& x, const field_iterator& y) {
+    friend bool 
+    operator!=(const field_const_iterator& x, const field_const_iterator& y) {
       return x.Current != y.Current;
     }
   };
 
-  typedef field_iterator field_const_iterator;
+  class field_iterator : public field_const_iterator {
+  public:
+    typedef FieldDecl*           value_type;
+    typedef FieldDecl*           reference;
+    typedef FieldDecl*           pointer;
+
+    field_iterator() : field_const_iterator() { }
+
+    field_iterator(DeclContext::decl_iterator C, DeclContext::decl_iterator E)
+      : field_const_iterator(C, E) { }    
+
+    reference operator*() const { return cast<FieldDecl>(*Current); }
+
+    pointer operator->() const { return cast<FieldDecl>(*Current); }
+
+    field_iterator& operator++() {
+      ++Current;
+      SkipToNextField();
+      return *this;
+    }
+
+    field_iterator operator++(int) {
+      field_iterator tmp(*this);
+      ++(*this);
+      return tmp;
+    }
+  };
 
-  field_iterator field_begin() const {
+  field_iterator field_begin() {
     return field_iterator(decls_begin(), decls_end());
   }
-  field_iterator field_end() const {
+  field_iterator field_end() {
     return field_iterator(decls_end(), decls_end());
   }
 
+  field_const_iterator field_begin() const {
+    return field_const_iterator(decls_begin(), decls_end());
+  }
+  field_const_iterator field_end() const {
+    return field_const_iterator(decls_end(), decls_end());
+  }
+
   /// completeDefinition - Notes that the definition of this type is
   /// now complete.
   void completeDefinition(ASTContext& C);
index 3455504fdb191ec92854355e48857dd94050c115..e62920f631f9c8f9d77715920a42dc86eb083991 100644 (file)
@@ -553,8 +553,8 @@ const ASTRecordLayout &ASTContext::getASTRecordLayout(const RecordDecl *D) {
   // Layout each field, for now, just sequentially, respecting alignment.  In
   // the future, this will need to be tweakable by targets.
   unsigned FieldIdx = 0;
-  for (RecordDecl::field_iterator Field = D->field_begin(),
-                               FieldEnd = D->field_end();
+  for (RecordDecl::field_const_iterator Field = D->field_begin(),
+                                     FieldEnd = D->field_end();
        Field != FieldEnd; (void)++Field, ++FieldIdx)
     NewEntry->LayoutField(*Field, FieldIdx, IsUnion, StructPacking, *this);
 
index 67c60aae07c342bc49efee615efe8ca1440ec30d..d6a1c6b8b3044c6c9e8ec6c1e8e990bd1c3cd489 100644 (file)
@@ -191,7 +191,7 @@ llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty,
 /// getOrCreateRecordType - get structure or union type.
 llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty,
                                      llvm::DICompileUnit Unit) {
-  const RecordDecl *Decl = Ty->getDecl();
+  RecordDecl *Decl = Ty->getDecl();
   
   unsigned Tag;
   if (Decl->isStruct())
@@ -236,8 +236,9 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty,
   const ASTRecordLayout &RL = M->getContext().getASTRecordLayout(Decl);
 
   unsigned FieldNo = 0;
-  for (RecordDecl::field_const_iterator I = Decl->field_begin(),
-       E = Decl->field_end(); I != E; ++I, ++FieldNo) {
+  for (RecordDecl::field_iterator I = Decl->field_begin(),
+                                  E = Decl->field_end(); 
+       I != E; ++I, ++FieldNo) {
     FieldDecl *Field = *I;
     llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit);
 
index 8918671332d24c8e22045ed3b6cfc67a7a0995ac..d9c9cb1336849102bc5d395ac4d084cbfbcbe68b 100644 (file)
@@ -480,8 +480,8 @@ void RecordOrganizer::layoutStructFields(const ASTRecordLayout &RL) {
   std::vector<const llvm::Type*> LLVMFields;
 
   unsigned curField = 0;
-  for (RecordDecl::field_iterator Field = RD.field_begin(),
-                               FieldEnd = RD.field_end();
+  for (RecordDecl::field_const_iterator Field = RD.field_begin(),
+                                     FieldEnd = RD.field_end();
        Field != FieldEnd; ++Field) {
     uint64_t offset = RL.getFieldOffset(curField);
     const llvm::Type *Ty = CGT.ConvertTypeRecursive(Field->getType());
@@ -531,8 +531,8 @@ void RecordOrganizer::layoutStructFields(const ASTRecordLayout &RL) {
 /// all fields are added.
 void RecordOrganizer::layoutUnionFields(const ASTRecordLayout &RL) {
   unsigned curField = 0;
-  for (RecordDecl::field_iterator Field = RD.field_begin(),
-                               FieldEnd = RD.field_end();
+  for (RecordDecl::field_const_iterator Field = RD.field_begin(),
+                                     FieldEnd = RD.field_end();
        Field != FieldEnd; ++Field) {
     // The offset should usually be zero, but bitfields could be strange
     uint64_t offset = RL.getFieldOffset(curField);