190075Sobrien// 2002-05-13
290075Sobrien
390075Sobrienenum region { oriental, egyptian, greek, etruscan, roman };
490075Sobrien
590075Sobrien// Test one.
690075Sobrienclass gnu_obj_1
790075Sobrien{
890075Sobrienprotected:
990075Sobrien  typedef region antiquities;
1090075Sobrien  static const bool 	test = true;
1190075Sobrien  static const int 	key1 = 5;
1290075Sobrien  static long       	key2;
1390075Sobrien
1490075Sobrien  static antiquities 	value;
1590075Sobrien
1690075Sobrienpublic:
1790075Sobrien  gnu_obj_1(antiquities a, long l) {}
18169689Skan};
19169689Skan
2090075Sobrienconst bool gnu_obj_1::test;
2190075Sobrienconst int gnu_obj_1::key1;
2290075Sobrienlong gnu_obj_1::key2 = 77;
23169689Skangnu_obj_1::antiquities gnu_obj_1::value = oriental;
24169689Skan
25169689Skan
26169689Skan// Test two.
27169689Skantemplate<typename T>
2890075Sobrienclass gnu_obj_2: public virtual gnu_obj_1
2990075Sobrien{
3090075Sobrienpublic:
3190075Sobrien  static antiquities	value_derived;
3290075Sobrien
3390075Sobrienpublic:
3490075Sobrien  gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7) { }
3590075Sobrien};
3690075Sobrien
3790075Sobrientemplate<typename T>
3890075Sobrientypename gnu_obj_2<T>::antiquities gnu_obj_2<T>::value_derived = etruscan;
3990075Sobrien
4090075Sobrien// Test three.
4190075Sobrientemplate<typename T>
4290075Sobrienclass gnu_obj_3
4390075Sobrien{
4490075Sobrienpublic:
4590075Sobrien  typedef region antiquities;
4690075Sobrien  static gnu_obj_2<int> data;
4790075Sobrien
4890075Sobrienpublic:
4990075Sobrien  gnu_obj_3(antiquities b) { }
5090075Sobrien};
5190075Sobrien
5290075Sobrientemplate<typename T>
5390075Sobriengnu_obj_2<int> gnu_obj_3<T>::data(etruscan);
5490075Sobrien
5590075Sobrien// 2002-08-16
5690075Sobrien// Test four.
5790075Sobrien#include "m-static.h"
5890075Sobrien
5990075Sobrien// instantiate templates explicitly so their static members will exist
6090075Sobrientemplate class gnu_obj_2<int>;
61169689Skantemplate class gnu_obj_2<long>;
62169689Skantemplate class gnu_obj_3<long>;
6390075Sobrien
6490075Sobrienint main()
6590075Sobrien{
6690075Sobrien  gnu_obj_1		test1(egyptian, 4589);
6790075Sobrien  gnu_obj_2<long>	test2(roman);
6890075Sobrien  gnu_obj_3<long>	test3(greek);
69169689Skan  gnu_obj_4		test4;
70169689Skan
7190075Sobrien  return 0;				// breakpoint: constructs-done
7290075Sobrien}
7390075Sobrien