SZEDER Gábor <szeder.dev@xxxxxxxxx> writes: >> func(PROGRESS | REGRESS); >> func(PROGRESS + REGRESS); >> func(PROGRESS * 3); >> } >> >> how caller came about to give 3? > > No, they tend to show (PROGRESS | REGRESS), at least both gdb and lldb > do. OK. > If the enum has only constants with power-of-two values, then that > is the right way to write it, and the other two are asking for trouble If the programmer and the debugger knows the constants are used to represent bits that can be or'ed together, what you say is correct, but that is entirely irrelevant. What I was worried about is that the constants that are used to represent something that are *NOT* set of bits (hence "PROGRESS * 3" may be perfectly a reasonable thing for such an application) may be mistaken by an overly clever debugger and "3" may end up getting shown as "PROGRESS | REGRESS". When there are only two constants (PROGRESS=1 and REGRESS=2), we humans nor debuggers can tell if that is to represent two bits that can be or'ed together, or it is an enumeration. Until we gain the third constant, that is, at which time the third one may likely be 3 (if enumeration) or 4 (if bits).