1/* { dg-do run } */ 2/* { dg-options "-O3 -std=c++11" } */ 3 4 5extern "C" int printf(const char *fmt, ...); 6extern "C" void abort(void); 7 8struct Side { 9 enum _Value { Left, Right, Invalid }; 10 11 constexpr Side() : _value(Invalid) {} 12 constexpr Side(_Value value) : _value(value) {} 13 operator _Value() const { return (_Value)_value; } 14 15 private: 16 char _value; 17}; 18 19struct A { 20 void init(); 21 void adjust(Side side, bool final); 22 void move(Side side); 23}; 24 25void A::init() 26{ 27 adjust(Side::Invalid, false); 28} 29 30static void __attribute__((noinline)) 31check (int v, int final) 32{ 33 if (v != 0) 34 abort(); 35} 36 37 38__attribute__((noinline)) 39void A::adjust(Side side, bool final) 40{ 41 check ((int)side, final); 42} 43 44void A::move(Side side) 45{ 46 adjust(side, false); 47 adjust(side, true); 48} 49 50int main() 51{ 52 A t; 53 t.move(Side::Left); 54 return 0; 55} 56