eppstein@garfield (David Eppstein) (11/02/88)
This is in #ident "@(#)cfront:CC 1.11". The problem: CC neglects to rename the arguments of an inline method, creating a possible collision with global variables changed in the method. The following example illustrates this. The function x->pop() changes a global variable s, then references x->val. If called as s->pop(), the generated code incorrectly references s->val for the new value of s (which may be zero giving strange results) rather than the old value (which should still be pointed to by this). If I make the method non-inline, it works correctly. Correct output Output with inline bug 2 1 1 0 0 1125191424 ------------ #include <stream.h> class stack * s = 0; class stack { int val; stack * next; public: stack(int v) { val = v; next = s; } void pop() { s = s->next; // change stack top cout << val << "\n"; // print value of THIS (not stack top) } }; main() { s = new stack(0); s = new stack(1); s = new stack(2); s->pop(); s->pop(); s->pop(); } -- David Eppstein eppstein@garfield.cs.columbia.edu Columbia U. Computer Science