Compile the code below using g++ -g, load the object into gdb, and 'ptype foo'. You will see that the type of foo is 'int (Obj &)'. If this function is called from GDB, and the called function modifies its argument, it will end up modifying the original copy. It's supposed to get a temporary copy.
This changed sometime between g++ 3.3 and g++ 4.0. class Obj { public: Obj (); Obj (const Obj &); ~Obj (); int var[2]; }; int foo (Obj arg) { return arg.var[0] + arg.var[1]; } int main() { return 0; } Obj::Obj () { var[0] = 1; var[1] = 2; } Obj::Obj (const Obj &obj) { var[0] = obj.var[0]; var[1] = obj.var[1]; } Obj::~Obj () { } -- Summary: [4.0/4.1/4.2/4.3 regression] C++ arguments passed by invisible reference have wrong type Product: gcc Version: 4.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: debug AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: drow at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33537