pabuhr@water.UUCP (10/11/87)
This bug took me another 4 hours to find. The conditional expression in the while loop requires the creation of 2 temporaries of type string. This is done properly. However, only the temporary on the right hand side of the relational operator is subsequently freed. This only seems to happen in a relational expression. All the temporaries in complex arithmetic expressions seem to be handled properly. Is it possible that we are using an old version of C++? I find it *VERY* difficult to believe that this problem has not appeared before now as it is a rather fundemental bug. ======================= class string { int *i; public: string(); string(string &); // string x = string ~string() { delete i; }; inline friend int operator!=(string &, string &); // != string rtn(); }; main() { string left, right; while ( left.rtn() != right.rtn() ) {} } =============================== #line 1 "bug1.cc" /* <<cfront 1.2.1 2/16/87>> */ /* < bug1.cc */ char *_new(); char _delete(); char *_vec_new(); char _vec_delete(); #line 1 "bug1.cc" struct string { /* sizeof string == 4 */ #line 2 "bug1.cc" int *_string_i ; }; #line 4 "bug1.cc" /* overload _ctor: */ struct string *_string__ctorF_ (); struct string *_string__ctorFRCstring___ (); #line 9 "bug1.cc" struct string _string_rtn (); #line 8 "bug1.cc" static int _neFRCstring__RCstring___ (); #line 12 "bug1.cc" int main (){ _main(); { #line 13 "bug1.cc" struct string _au1_left ; #line 13 "bug1.cc" struct string _au1_right ; #line 13 "bug1.cc" _string__ctorF_ ( & _au1_left ) ; #line 13 "bug1.cc" _string__ctorF_ ( & _au1_right ) ; #line 15 "bug1.cc" { #line 16 "bug1.cc" struct string _au0__R1 ; #line 16 "bug1.cc" struct string _au0__R2 ; #line 16 "bug1.cc" int _au0__Q3 ; #line 15 "bug1.cc" while (( (_au0__Q3 = (((int )_neFRCstring__RCstring___ ( (struct string *)( _string_rtn ( & _au1_left , & _au0__R1 ) , (& #line 15 "bug1.cc" _au0__R1 )) , (struct string *)( _string_rtn ( & _au1_right , & _au0__R2 ) , (& _au0__R2 )) ) ))), #line 15 "bug1.cc" ( ( (( _delete ( (char *)(& _au0__R2 )-> _string_i ) , (0 )) )) , _au0__Q3 ) ) <==== where is the other delete for _au0_R1?!!!! #line 15 "bug1.cc" ){ } #line 13 "bug1.cc" ( (( _delete ( (char *)(& _au1_right )-> _string_i ) , (0 )) )) ; #line 13 "bug1.cc" ( (( _delete ( (char *)(& _au1_left )-> _string_i ) , (0 )) )) ; } } }; /* the end */