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

            Bug ID: 117382
           Summary: Conversion of integral to enumeration outside of range
                    is UB but works in consteval context
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: konstantin.vladimirov at gmail dot com
  Target Milestone: ---

Consider this code:

---
enum class MyPrettyEnum {
  Value = 0,  
};

consteval int process(int n) {
  MyPrettyEnum E = static_cast<MyPrettyEnum>(n);
  return static_cast<int>(E);
}

constexpr int x = process(10);
---

in C++23

[expr.static.cast] / 10

If the enumeration type does not have a fixed underlying type, the value is
unchanged if the original value is within the range of the enumeration values
(9.7.1), and otherwise, the behavior is undefined.

[expr.const] / 5

An expression E is a core constant expression unless the evaluation of E,
following the rules of the abstract machine (6.9.1), would evaluate one of the
following:
[...]
— an operation that would have undefined behavior

So this shall be prohibited.

Reply via email to