struct Processor {
bool initialized_;
std::map< std::string, void* > jump_table;
Processor () : initialized_(false) {}
long execute (Program& prog) {
if (! initialized_) {
jump_table["+"] = &&block_add;
jump_table["-"] = &&block_sub;
jump_table["*"] = &&block_mul;
jump_table["/"] = &&block_div;
jump_table[";"] = &&block_end;
initialized_ = true;
return execute (prog);
}
block_add:
prog.value (prog.arg (0) + prog.arg (1));
goto *jump_table[prog.next_op ()];
block_sub:
prog.value (prog.arg (0) - prog.arg (1));
goto *jump_table[prog.next_op ()];
block_div:
prog.value (prog.arg (0) / prog.arg (1));
goto *jump_table[prog.next_op ()];
block_mul:
prog.value (prog.arg (0) * prog.arg (1));
goto *jump_table[prog.next_op ()];
block_end:
return prog.result ();
}
};
Trying to compile that with g++ 4.6.3 leads to the following error:
calc.cc: In member function 'long int Processor::execute(Program&)';
calc.cc:75:1: internal compiler error: in lower_stmt, at gimple-low.c:432
This bug also manifests itself in 4.7.0 and 4.7.1 but in a another location (verify_gimple_stmt). The oldest copy of gcc I have is 4.3.2 and the bug is not evident in that version.
Granted I was using non-standard constructs in my code but it still felt pretty cool to uncover a bug in such a well-known piece of software.
You can find the bug report (and current status) here