http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54076
Bug #: 54076 Summary: wrong/misleading warning with -Wsign-promo and enums with underlying type Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: plasm...@gmx.net When compiling with -Wsign-promo #include <cstddef> void vs( const char*, long ) { } void vs( const char*, size_t ) { } template<size_t H, size_t L> struct dt { enum : size_t { h = H }; enum : size_t { l = L }; }; int main(int /*argc*/, const char * /*argv*/[]) { typedef dt<3,4> d_t; const char* x = "Hello World"; vs(x+d_t::h,d_t::l); } I get the warning: promo.cxx: In function 'int main(int, const char**)': promo.cxx:16:20: warning: passing 'dt<3ul, 4ul>::<anonymous enum>' chooses 'size_t {aka long unsigned int}' over 'long int' [-Wsign-promo] vs(x+d_t::h,d_t::l); ^ promo.cxx:16:20: warning: in call to 'void vs(const char*, size_t)' [-Wsign-promo] >From the manpage of gcc it says for -Wsign-promo : Warn when overload resolution chooses a promotion from unsigned or enumerated type to a signed type, over a conversion to an unsigned type of the same size. Previous versions of G++ would try to preserve unsignedness, but the standard mandates the current behavior. First of all, intuitively I would not at all expect such a warning, since the underlying type is set, the enum should behave like that underlying type for overload resoltion (I would think 4.5-4 applies here). Secondly the description says that it warns for "[...]a promotion from unsigned or enumerated type to a signed type, over a conversion to an unsigned type[...]" and here it did not chose to promote to a signed type. If the warning was intentional, then its documentation is misleading.