1/* { dg-do compile } */
2
3typedef int PRInt32;
4class nsTreeRows {
5    class Subtree { };
6    enum { kMaxDepth = 32 };
7    struct Link {
8        Subtree* mParent;
9        PRInt32 mChildIndex;
10        Link&         operator=(const Link& aLink) {
11            mParent = aLink.mParent;
12            mChildIndex = aLink.mChildIndex;
13        }
14    };
15    class iterator {
16        PRInt32 mTop;
17        PRInt32 mRowIndex;
18        Link mLink[kMaxDepth];
19    public:
20        iterator() : mTop(-1), mRowIndex(-1) { }
21        iterator& operator=(const iterator& aIterator);
22    };
23    Subtree*     EnsureSubtreeFor(Subtree* aParent, PRInt32 aChildIndex);
24    Subtree*     GetSubtreeFor(const Subtree* aParent,
25PRInt32 aChildIndex,                   PRInt32* aSubtreeSize = 0);
26    void     InvalidateCachedRow() {
27        mLastRow = iterator();
28    }
29    iterator mLastRow;
30};
31nsTreeRows::Subtree* nsTreeRows::EnsureSubtreeFor(Subtree* aParent,
32                     PRInt32 aChildIndex) {
33    Subtree* subtree = GetSubtreeFor(aParent, aChildIndex);
34    if (! subtree) {
35        InvalidateCachedRow();
36    }
37}
38nsTreeRows::iterator& nsTreeRows::iterator::operator=(const iterator&
39aIterator) {
40    mTop = aIterator.mTop;
41    for (PRInt32 i = mTop;
42         i >= 0;
43         --i)         mLink[i] = aIterator.mLink[i];
44}
45