// 2002-05-13

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

void keepalive(bool *var) { }
void keepalive_int (int *var) { }

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

  static antiquities 	value;

public:
  gnu_obj_1(antiquities a, long l) {}
  ~gnu_obj_1() {}

  long method ()
  {
    static int sintvar = 4;
    static bool svar = true;

    keepalive (&svar);
    keepalive_int (&sintvar);
    return key2;
  }
};

// An object with a single constructor.
class single_constructor
{
public:
  single_constructor () { }
  ~single_constructor () { }
};

const bool gnu_obj_1::test;
const int gnu_obj_1::key1;
long gnu_obj_1::key2 = 77;
gnu_obj_1::antiquities gnu_obj_1::value = oriental;


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

template<typename T>
typename gnu_obj_2<T>::antiquities gnu_obj_2<T>::value_derived = etruscan;

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

template<typename T>
gnu_obj_2<int> gnu_obj_3<T>::data(etruscan);

// 2002-08-16
// Test four.
#include "m-static.h"

// instantiate templates explicitly so their static members will exist
template class gnu_obj_2<int>;
template class gnu_obj_2<long>;
template class gnu_obj_3<long>;

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

  test4.dummy = test4.elsewhere;
  test4.dummy = 0;

  test1.method (); // breakpoint: constructs-done

  return test4.dummy;
}
