// PR c++/77467 // { dg-do compile { target c++14 } } constexpr int foo (const int x, const unsigned n) noexcept { switch (n) { case 0: return 1; case 1: return x; default: const auto m = (n >> 1); const auto y = foo (x, m); return ((m << 1) == n) ? y * y : x * y * y; } } static_assert (foo (3, 2) == 9, ""); static_assert (foo (2, 3) == 8, ""); constexpr int bar (int x) { int a = x; switch (x) a = x + 1; return a; } static_assert (bar (0) == 0, ""); static_assert (bar (1) == 1, ""); constexpr int baz (const int x, int y) noexcept { switch (x) { case 0: return 1; case 1: return x; case 2: if ((y += 2) == 0) { case 3: y += 4; break; } else { case 4: y += 8; break; } break; case 5: for (y = 0; y < 3; y++) { case 7: if (y == -4) y += 3; if (y == -3) continue; if (y == -2) { y += 18; break; } if (y == 2) { case 6: y += 12; default: y++; break; } } break; case -1: case -2: switch (y) { case 19: y += 2; break; case 20: y += 3; if (x == 2) case 21:; y += 2; if (x == 3) default:; y += 4; break; } return x + y + 1; } return x + y; } static_assert (baz (0, 7) == 1, ""); static_assert (baz (1, 7) == 1, ""); static_assert (baz (2, -2) == 6, ""); static_assert (baz (2, 0) == 12, ""); static_assert (baz (3, 1) == 8, ""); static_assert (baz (4, 2) == 14, ""); static_assert (baz (5, -20) == 20, ""); static_assert (baz (6, 5) == 24, ""); static_assert (baz (7, -5) == 22, ""); static_assert (baz (7, -4) == 22, ""); static_assert (baz (7, -3) == 23, ""); static_assert (baz (7, -2) == 23, ""); static_assert (baz (7, -1) == 22, ""); static_assert (baz (7, 0) == 22, ""); static_assert (baz (7, 2) == 22, ""); static_assert (baz (7, 6) == 14, ""); static_assert (baz (8, 9) == 18, ""); static_assert (baz (8, -2) == 7, ""); static_assert (baz (-1, 19) == 21, ""); static_assert (baz (-1, 20) == 29, ""); static_assert (baz (-1, 21) == 27, ""); static_assert (baz (-1, 5) == 9, ""); static_assert (baz (-2, 19) == 20, ""); static_assert (baz (-2, 20) == 28, ""); static_assert (baz (-2, 21) == 26, ""); static_assert (baz (-2, 5) == 8, "");