https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103825

--- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-13 branch has been updated by Marek Polacek
<mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:22510e4a68aa9ca850db34ae62c21c58442d8ab3

commit r13-8560-g22510e4a68aa9ca850db34ae62c21c58442d8ab3
Author: Marek Polacek <pola...@redhat.com>
Date:   Fri Mar 29 16:59:37 2024 -0400

    c++: ICE with scoped enum in switch condition [PR103825]

    Here we ICE when gimplifying

      enum class Type { Pawn };
      struct Piece {
        Type type : 4;
      };
      void foo() {
        switch (Piece().type)
          case Type::Pawn:;
      }

    because we ended up with TYPE_PRECISION (cond) < TYPE_PRECISION (case).
    That's because the case expr type here is the unlowered type Type,
    whereas the conditional's type is the lowered <unnamed-signed:4>.  This
    is not supposed to happen: see the comment in pop_switch around the
    is_bitfield_expr_with_lowered_type check.

    But here we did not revert to the lowered SWITCH_STMT_TYPE, because
    the conditional contains a TARGET_EXPR, which has side-effects, which
    means that finish_switch_cond -> maybe_cleanup_point_expr wraps it
    in a CLEANUP_POINT_EXPR.  And is_bitfield_expr_with_lowered_type does
    not see through those.

            PR c++/103825

    gcc/cp/ChangeLog:

            * typeck.cc (is_bitfield_expr_with_lowered_type): Handle
            CLEANUP_POINT_EXPR.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp0x/enum44.C: New test.

    (cherry picked from commit daa2e7c7ffe49b788357f7f2c9ef1c9b125c1f8c)

Reply via email to