https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95009
Bug ID: 95009 Summary: decltype of increment or decrement bitfield expressions are wrong and causes assembler errors. Product: gcc Version: 10.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: okannen at gmail dot com Target Milestone: --- This bug exists since gcc version 6 The code bellow should not compile: #include <type_traits> struct A { int i:31; }; A a; //I am not sure the standard require that (a.i) and ++a.i have the same type. static_assert(!std::is_same_v <decltype ((a.i)), decltype(++a.i)>); // int& int:31& //but I do believe that decltype(a.i+=1) and decltype(++a.i) shall have the same type static_assert(!std::is_same_v <decltype ((a.i+=1)), decltype(++a.i)>); // int& int:31& [expr.pre.incr]/1 "The expression ++x is equivalent to x+=1." Actualy those weird "int:N" types cause a lot of trouble. This code cause assembler error: //test.cpp struct A{ int i:31; }; template <class T> void f(){ } int main(){ A a; f<decltype(a.i+=1)>(); f<decltype(++a.i)>(); return 0; } `c++ test.cpp` outputs: /tmp/ccTayNZZ.s: Assembler messages: /tmp/ccTayNZZ.s:43: Error: symbol `_Z1fIRiEvv' is already defined