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