AaronBallman wrote:

> Just to confirm: is this the intentional outcome of this patch?

Before C++20, left shift of -1 does not produce a mathematical result that's 
within the range of representable values for the result type, so it's undefined 
behavior, and therefore not a core constant expression, and therefore invalid 
as the initializer for an enumeration constant. So I believe the behavior is 
expected and correct; you can see the UB diagnostic in other contexts: 
https://gcc.godbolt.org/z/bqj6xhzzr and GCC agrees with Clang in the 
enumeration case: https://gcc.godbolt.org/z/qjKzeaYTz

> the diagnostic - "expression is not an integral constant expression" - 
> doesn't sound helpful (how is it not constant or not integral?). And what's 
> worse, is that it's an error rather than a warning that can be disabled.

It has integral constants but it's not an integral constant expression as far 
as the language is concerned. The note tells you why it's not a valid integral 
constant expression. As for warning vs error; the standard makes the code 
ill-formed and we treat that as an error generally speaking.

If you can't enable C++20 mode, you can still get the same value in C++17 and 
earlier with well-formed code: https://gcc.godbolt.org/z/3ra83joqs

https://github.com/llvm/llvm-project/pull/70307
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to