https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94082
Bug ID: 94082 Summary: __builtin_memcpy in constexpr context should compile Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: D.Bahadir at GMX dot de Target Milestone: --- Compilation fails with the following code: ``` #include <array> #include <cstdint> #include <cstring> constexpr std::uint32_t extract(const std::uint8_t* data) noexcept { std::uint32_t num; __builtin_memcpy(&num, data, sizeof(std::uint32_t)); return num; } int main() { constexpr std::array<std::uint8_t, 4> a1 {{ 0xff, 0xff, 0xff, 0xff }}; constexpr auto val = extract(a1.data()); // <--- Error in constexpr context return val; } ``` I would have expected that using `__builtin_memcpy` in a `constexpr` context would compile just fine and be probably completely optimized out. However, compilation fails. Interestingly, GCC is able to fully optimize the above code when omitting the `constexpr` in the marked line (and therefore not calling the function from a `constexpr` context). (Whether the function is marked `constexpr`, `inline` or neither does not matter. It will be fully optimized in non-`constexpr` context. However, writing some similar `constexpr` function with `__builtin_bswap32` in it and calling that from a `constexpr` context, succeeds and will be fully optimized. For demonstration of this issue and a nice comparison between `__builtin_bswap32` and `__builtin_memcpy` in `constexpr` context see Compiler Explorer: https://godbolt.org/z/qtMmqw Note: The following StackOverflow question touches the same issue: https://stackoverflow.com/q/60572199/3115457