Path: utzoo!attcan!utgpu!utstat!jarvis.csri.toronto.edu!mailrus!wuarchive!wugate!uunet!mcsun!sunic!liuida!mikpe From: mikpe@lillefix.ida.liu.se (Mikael Pettersson) Newsgroups: comp.lang.c++ Subject: two bugs in cfront 1.2.1 Summary: init of ref. members & calling a temp's virtual operator() Message-ID: <1409@lillefix.ida.liu.se> Date: 30 Oct 89 14:22:16 GMT Organization: CIS Dept, Univ of Linkoping, Sweden Lines: 82 We're still using cfront 1.2.1. An upgrade to 2.0 doesn't seem to be imminent :-( so spare me the "fixed in 2.0" comments. Anyway, I've come across two bugs and I'm kind of hoping for someone who knows their way around the source better than I do to give me some hints on how to fix them. 1) Reference members in a struct must be initialized by a constructor, but cfront dies with a SIGSEGV when compiling the initialization code. E.g: struct foo { int& bar; foo(int& fie) : bar(fie) {} // this line causes a SIGSEGV }; I tracked this one down to a NULL ptr dereference in expr::print() (print.c) where ASSIGN falls through to the usual case for binary operators and has just printed the left operand and the operator: if (e1->tp!=e2->tp && e2->base!=ZERO) { // cast, but beware of int!=long etc. Ptype t1 = e1->tp; cmp: switch (t1->base) { When initializing reference members, e1->tp is 0, causing a trap in the switch() head. My fix was to redo the test as: if (e1->tp && e1->tp!=e2->tp && e2->base!=ZERO) { // etc. Not a pretty patch, especially since I don't fully understand the _cause_ of the bug. 2) Under certain circumstances, the initialization of temporary values is done incorrectly: struct Cont { virtual int operator()(); }; struct Y : Cont { Y(); int operator()(); }; int P_While() { return Y()(); // apparently too complex } The code generated for that last function is (edited for readability): /* <> */ // stuff deleted int P_While (){ struct Y _au0__K2 ; // BUG { struct Y _au0__V1 ; return ( (_au0__K2 = ( _Y__ctor ( & _au0__V1 ) , (& _au0__V1 )) ), (*(((int (*)())(*_au0__K2 -> _Cont__vptr ))))(_au0__K2 ) ) ; } } Since, somehow, cfront "forgot" to turn _au0__K2 into a struct Y*, there are two errors in the return statement: first, the initialization tries to assign a struct Y* to a struct Y, and second: the argument to the virtual function (to become "this") should be a struct Y*, not a struct Y. If one simplifies the function to: int P_While() { Y teta; return teta(); } then everything works out as it should. Any ideas? I haven't got a clue on where to start looking.. /Mike -- Mikael Pettersson, Dept of Comp & Info Sci, University of Linkoping, Sweden email: mpe@ida.liu.se or ...!{mcsun,munnari,uunet,unido,...}!sunic!liuida!mpe