| /* { dg-do run } */ |
| /* { dg-options "-O3 -std=c++11" } */ |
| |
| |
| extern "C" int printf(const char *fmt, ...); |
| extern "C" void abort(void); |
| |
| struct Side { |
| enum _Value { Left, Right, Invalid }; |
| |
| constexpr Side() : _value(Invalid) {} |
| constexpr Side(_Value value) : _value(value) {} |
| operator _Value() const { return (_Value)_value; } |
| |
| private: |
| char _value; |
| }; |
| |
| struct A { |
| void init(); |
| void adjust(Side side, bool final); |
| void move(Side side); |
| }; |
| |
| void A::init() |
| { |
| adjust(Side::Invalid, false); |
| } |
| |
| static void __attribute__((noinline)) |
| check (int v, int final) |
| { |
| if (v != 0) |
| abort(); |
| } |
| |
| |
| __attribute__((noinline)) |
| void A::adjust(Side side, bool final) |
| { |
| check ((int)side, final); |
| } |
| |
| void A::move(Side side) |
| { |
| adjust(side, false); |
| adjust(side, true); |
| } |
| |
| int main() |
| { |
| A t; |
| t.move(Side::Left); |
| return 0; |
| } |