On 4 May 2017 at 07:32, Xi Ruoyao wrote: > On 2017-05-03 11:26 +0100, Jonathan Wakely wrote: >> On 3 May 2017 at 05:41, Xi Ruoyao wrote: >> > In template metaprogramming, we may write something like >> > >> > ~~~~~ >> > template <typename A, typename B> >> > struct BetterType >> > { >> > typedef If<(Priority<A>::value > Priority<B>::value), A, B>::type type; >> > }; >> > ~~~~~ >> > >> > However, GCC -Wenum-compare (enabled by default) would complain >> > at each POT of BetterType. It seems annoying. >> > >> > Of course we can cast the operands of compare to int. But should we >> > make GCC more clever and not to complain this causal idiom? >> >> You're comparing unrelated enumeration types, which is what the >> warning is designed to warn about. Why should it not warn just because >> it's in a template? > > No. My point is, in this "enum hack" case we just use the enum values as > integer constants, not because they are in templates. > > Maybe we could silence the warning for the enums has only one > enumerator with assigned value. I suppose it could, but that would mean we fail to warn in cases where we should be warning e.g. enum Kilograms { kg_max = 0xffff }; enum Metres { m_max = 0xff }; constexpr Kilograms 10kg = Kilograms{10}; constexpr Metres 10m = Metres{10}; if (10kg > 10m) ... The comparison is exactly the kind of thing the warning is designed for. > I got thousands of warnings yesterday compiling a package with many > enum hacks... Because the code has hacks :-) It should be using constexpr variables not enumeration types with a single value.