// 2002-05-13

enum region { oriental, egyptian, greek, etruscan, roman };

// Test one.
class gnu_obj_1
{
protected:
  typedef region antiquities;
  const bool 		test;
  const int 		key1;
  long       		key2;

  antiquities 	value;

public:
  gnu_obj_1(antiquities a, long l): test(true), key1(5), key2(l), value(a) {}
};

// Test two.
template<typename T>
class gnu_obj_2: public virtual gnu_obj_1
{
protected:
  antiquities	value_derived;
      
public:
  gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7), value_derived(b) { }
}; 

// Test three.
template<typename T>
class gnu_obj_3
{
protected:
  typedef region antiquities;
  gnu_obj_2<int>   	data;
      
public:
  gnu_obj_3(antiquities b): data(etruscan) { }
}; 

int shadow = 0;

class C
{
public:
  C (int x) : shadow (x) {}
  void marker () {}
private:
  int shadow;
};

int main()
{
  gnu_obj_1		test1(egyptian, 4589);
  gnu_obj_2<long>	test2(roman);
  gnu_obj_3<long>	test3(greek);

  C theC (1);				// breakpoint: first-constructs-done
  theC.marker ();
  
  return shadow;
}
