https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89080
Marek Polacek <mpolacek at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |mpolacek at gcc dot gnu.org --- Comment #3 from Marek Polacek <mpolacek at gcc dot gnu.org> --- Which is this. Curiously, I don't see an ICE with -std=c++2a -fconcepts. #include <array> template<auto s> struct make_7bit{ static constexpr auto v = s(); static constexpr unsigned required_bytes = ([](){ constexpr unsigned bits = (__builtin_strlen(v) * 7); constexpr unsigned bits_div = (bits) / 8; constexpr unsigned bits_rem = bits % 8; return bits_div + (bits_rem ==0 ?0:1); })(); static constexpr std::array<uint8_t, required_bytes> packed = ([](){ std::array<uint8_t, required_bytes> packed_data{}; unsigned currpos = 0; auto submit_bit = [&currpos, &packed_data] (unsigned bit){ packed_data[currpos / 8] |= (bit&1) << (currpos%8); }; auto submit_char = [&submit_bit](char c){ uint8_t cc = (uint8_t)c; for(unsigned i = 0; i < 7;++i){ submit_bit(cc>>i); } }; unsigned l = __builtin_strlen(v); for(unsigned i = 0; i < l; ++i){ submit_char(v[i]); } return packed_data; })(); }; #define static_string(...) []()constexpr{return __VA_ARGS__;} using nowdie = make_7bit<static_string("hi")>; const uint8_t* kills_compiler() { return &nowdie::packed[0]; }