1 // { dg-do run }
2 // { dg-options "-fstrict-enums" }
3 
4 extern "C" void abort (void);
5 class CCUTILS_KeyedScalarLevelPosition
6 {
7 public:
8 
9     typedef enum
10     {
11         UNINITED = 0,
12         AT_BEGIN = 1,
13         AT_END = 2,
14         AT_KEY = 3
15 
16     } position_t;
17 
is_init()18     bool is_init() const
19     { return(m_timestamp != UNINITED); }
20 
is_at_begin()21     bool is_at_begin() const
22     { return(m_timestamp == AT_BEGIN); }
23 
get_state()24     position_t get_state() const
25     {
26         return((m_timestamp >= AT_KEY)
27              ? AT_KEY
28              : ((position_t)m_timestamp));
29     }
30 
set_at_begin()31     void set_at_begin()
32     { m_timestamp = AT_BEGIN; }
33 
get_index()34     unsigned int get_index() const
35     { return(m_index); }
36 
set_pos(unsigned int a_index,unsigned int a_timestmap)37     void set_pos(unsigned int a_index, unsigned int a_timestmap)
38     {
39         m_index = a_index;
40         m_timestamp = a_timestmap;
41     }
42 
check_pos(unsigned int a_num_entries,unsigned int a_timestamp)43     bool check_pos(unsigned int a_num_entries, unsigned int a_timestamp) const
44     {
45         if (get_state() != AT_KEY)
46             return(false);
47 
48         if (m_timestamp != a_timestamp)
49             return(false);
50 
51         return(m_index < a_num_entries);
52     }
53 
set_not_init()54     void set_not_init()
55     { m_timestamp = 0; }
56 
57 private:
58 
59     unsigned int m_timestamp;
60     unsigned int m_index;
61 
62 };
63 
64 class CCUTILS_KeyedScalarPosition
65 {
66 public:
67 
68     CCUTILS_KeyedScalarLevelPosition m_L1;
69     CCUTILS_KeyedScalarLevelPosition m_L2;
70 };
71 
72 class baz
73 {
74 public:
75     int *n[20];
76     unsigned int m_cur_array_len;
77     unsigned int m_timestamp;
78 
_get_timestamp()79     unsigned int _get_timestamp() const
80     { return(m_timestamp); }
81 
_check_L1_pos(const CCUTILS_KeyedScalarPosition & a_position)82     bool _check_L1_pos(const CCUTILS_KeyedScalarPosition &a_position) const
83     {
84         return(a_position.m_L1.check_pos(
85                    m_cur_array_len, _get_timestamp()));
86     }
87 
88     void *next (CCUTILS_KeyedScalarPosition &);
89 };
90 
next(CCUTILS_KeyedScalarPosition & a_position)91 void * baz::next (CCUTILS_KeyedScalarPosition &a_position)
92 {
93     if (a_position.m_L1.is_at_begin() || (!a_position.m_L1.is_init()))
94     {
95         a_position.m_L1.set_pos(0, _get_timestamp());
96         a_position.m_L2.set_at_begin();
97     }
98     else if (!_check_L1_pos(a_position))
99         return(0);
100 
101     return n[a_position.m_L1.get_index ()];
102 }
103 
main(int,char **)104 int main (int, char **)
105 {
106     baz obj;
107     CCUTILS_KeyedScalarPosition a_pos;
108     void *ret;
109     int n[5];
110 
111     obj.n[0] = n;
112     obj.m_cur_array_len = 1;
113     obj.m_timestamp = 42;
114 
115     a_pos.m_L1.set_pos (0, 42);
116 
117     ret = obj.next (a_pos);
118     if (ret == 0)
119       abort ();
120     return 0;
121 }
122