// { dg-do run } // { dg-options "-fstrict-enums" } extern "C" void abort (void); class CCUTILS_KeyedScalarLevelPosition { public: typedef enum { UNINITED = 0, AT_BEGIN = 1, AT_END = 2, AT_KEY = 3 } position_t; bool is_init() const { return(m_timestamp != UNINITED); } bool is_at_begin() const { return(m_timestamp == AT_BEGIN); } position_t get_state() const { return((m_timestamp >= AT_KEY) ? AT_KEY : ((position_t)m_timestamp)); } void set_at_begin() { m_timestamp = AT_BEGIN; } unsigned int get_index() const { return(m_index); } void set_pos(unsigned int a_index, unsigned int a_timestmap) { m_index = a_index; m_timestamp = a_timestmap; } bool check_pos(unsigned int a_num_entries, unsigned int a_timestamp) const { if (get_state() != AT_KEY) return(false); if (m_timestamp != a_timestamp) return(false); return(m_index < a_num_entries); } void set_not_init() { m_timestamp = 0; } private: unsigned int m_timestamp; unsigned int m_index; }; class CCUTILS_KeyedScalarPosition { public: CCUTILS_KeyedScalarLevelPosition m_L1; CCUTILS_KeyedScalarLevelPosition m_L2; }; class baz { public: int *n[20]; unsigned int m_cur_array_len; unsigned int m_timestamp; unsigned int _get_timestamp() const { return(m_timestamp); } bool _check_L1_pos(const CCUTILS_KeyedScalarPosition &a_position) const { return(a_position.m_L1.check_pos( m_cur_array_len, _get_timestamp())); } void *next (CCUTILS_KeyedScalarPosition &); }; void * baz::next (CCUTILS_KeyedScalarPosition &a_position) { if (a_position.m_L1.is_at_begin() || (!a_position.m_L1.is_init())) { a_position.m_L1.set_pos(0, _get_timestamp()); a_position.m_L2.set_at_begin(); } else if (!_check_L1_pos(a_position)) return(0); return n[a_position.m_L1.get_index ()]; } int main (int, char **) { baz obj; CCUTILS_KeyedScalarPosition a_pos; void *ret; int n[5]; obj.n[0] = n; obj.m_cur_array_len = 1; obj.m_timestamp = 42; a_pos.m_L1.set_pos (0, 42); ret = obj.next (a_pos); if (ret == 0) abort (); return 0; }