// { dg-do assemble  }
// { dg-options "-O" }
// Bug: Synthesizing methods for the nested class screwed up current_class_decl
// for the outer class.

class A;
class AH
{
  public:
    AH (   A * p = 0 );
    AH ( const  AH & from )
    : pointer( from.pointer )   { inc(); }
    ~ AH ()  { dec(); }
  private:
    A * pointer;
    void inc() const;
    void dec() const;
};

class A 
{
  protected:
    struct AttrTable
    {
	struct Row
	{
	};
    };
    
  public:

    class Attributes
    {
      public:
	class iterator
	{
	  public:
	    iterator() : mo(0), attr(0) {}
	    iterator& operator++() { ++attr; return *this; }
	    iterator operator++(int)
	    { iterator tmp = *this; ++*this; return tmp; }

	  private:
	    AH mo;
	    const AttrTable::Row* attr;
	};

	Attributes(AH mo)
	: mo(mo) {}
	AH mo;
    };
};
