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;
}
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();
}
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);
/// 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())
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);
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());
/// 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);