https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87389
Bug ID: 87389 Summary: if constexpr not working properly with static_assert Product: gcc Version: 8.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: tobias.bruell at gmail dot com Target Milestone: --- Shouldn't the following compile? Also, if one replaces the hash_value_t by the 32-bit variant? This is also rejected by Clang. ---------------------------------- #include <iostream> //using hash_value_t = uint32_t; using hash_value_t = uint64_t; template<typename T, T v> struct integer_ct {}; template<typename T, T v1, T v2> constexpr bool operator == (integer_ct<T, v1>, integer_ct<T, v2>) { return (v1 == v2); }; template<typename T, T v> constexpr auto hash (integer_ct<T, v>) { return integer_ct<T, 2 * v> {}; } int main () { if constexpr (sizeof (hash_value_t) == 4) { static_assert (hash (integer_ct<hash_value_t, 0x80000001> {}) == integer_ct<hash_value_t, 0x00000002> {}); } else if constexpr (sizeof (hash_value_t) == 8) { static_assert (hash (integer_ct<hash_value_t, 0x8000000000000001> {}) == integer_ct<hash_value_t, 0x0000000000000002> {}); } }