https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61531
--- Comment #3 from Ulrich Windl <Ulrich.Windl at rz dot uni-regensburg.de> ---
Here's (for completeness) the code when I use "-O0":
~/src/C++/bitsettest> make
g++ -Wall -Wextra -Wshadow -O0 -g --save-temps -c -o bstest.o bstest.cc
bstest.cc:4: warning: unused parameter ‘argc’
bstest.cc:4: warning: unused parameter ‘argv’
g++ -o bstest bstest.o
~/src/C++/bitsettest> gdb bstest
GNU gdb (GDB) SUSE (7.5.1-0.7.29)
[...]
Dump of assembler code for function main(int, char**):
4 int main(int argc, char *argv[])
0x000000000040095e <+0>: push %rbp
0x000000000040095f <+1>: mov %rsp,%rbp
0x0000000000400962 <+4>: push %rbx
0x0000000000400963 <+5>: sub $0x38,%rsp
0x0000000000400967 <+9>: mov %edi,-0x34(%rbp)
0x000000000040096a <+12>: mov %rsi,-0x40(%rbp)
5 {
6 std::bitset<32> b;
0x000000000040096e <+16>: lea -0x30(%rbp),%rdi
0x0000000000400972 <+20>: callq 0x400a7a <std::bitset<32ul>::bitset()>
7
8 #if 0
9 std::cout << "size " << b.size() << std::endl;
10 #endif
11 b.set(2);
0x0000000000400977 <+25>: lea -0x30(%rbp),%rdi
0x000000000040097b <+29>: mov $0x1,%edx
0x0000000000400980 <+34>: mov $0x2,%esi
0x0000000000400985 <+39>: callq 0x400bf0
<std::bitset<32ul>::set(unsigned long, bool)>
12 if (b.test(2))
0x000000000040098a <+44>: lea -0x30(%rbp),%rdi
0x000000000040098e <+48>: mov $0x2,%esi
0x0000000000400993 <+53>: callq 0x400c28
<std::bitset<32ul>::test(unsigned long) const>
0x0000000000400998 <+58>: test %al,%al
0x000000000040099a <+60>: je 0x4009b8 <main(int, char**)+90>
13 std::cout << "set 2" << std::endl;
0x000000000040099c <+62>: mov $0x400d6d,%esi
0x00000000004009a1 <+67>: mov $0x602080,%edi
0x00000000004009a6 <+72>: callq 0x4007e0
<_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x00000000004009ab <+77>: mov %rax,%rdi
0x00000000004009ae <+80>: mov $0x400800,%esi
0x00000000004009b3 <+85>: callq 0x4007f0 <_ZNSolsEPFRSoS_E@plt>
14 if (b[3])
0x00000000004009b8 <+90>: lea -0x20(%rbp),%rdi
0x00000000004009bc <+94>: lea -0x30(%rbp),%rsi
0x00000000004009c0 <+98>: mov $0x3,%edx
0x00000000004009c5 <+103>: callq 0x400bbe
<std::bitset<32ul>::operator[](unsigned long)>
0x00000000004009ca <+108>: lea -0x20(%rbp),%rdi
0x00000000004009ce <+112>: callq 0x400a9c
<std::bitset<32ul>::reference::operator bool() const>
0x00000000004009d3 <+117>: mov %eax,%ebx
0x00000000004009d5 <+119>: lea -0x20(%rbp),%rdi
0x00000000004009d9 <+123>: callq 0x400a92
<std::bitset<32ul>::reference::~reference()>
0x00000000004009de <+128>: test %bl,%bl
0x00000000004009e0 <+130>: je 0x4009fe <main(int, char**)+160>
15 std::cout << "set 3" << std::endl;
0x00000000004009e2 <+132>: mov $0x400d73,%esi
0x00000000004009e7 <+137>: mov $0x602080,%edi
0x00000000004009ec <+142>: callq 0x4007e0
<_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x00000000004009f1 <+147>: mov %rax,%rdi
0x00000000004009f4 <+150>: mov $0x400800,%esi
0x00000000004009f9 <+155>: callq 0x4007f0 <_ZNSolsEPFRSoS_E@plt>
16 return 0;
0x00000000004009fe <+160>: mov $0x0,%eax
17 }
0x0000000000400a03 <+165>: add $0x38,%rsp
0x0000000000400a07 <+169>: pop %rbx
0x0000000000400a08 <+170>: leaveq
0x0000000000400a09 <+171>: retq
End of assembler dump.
(gdb)