jeffl@berick.uucp (Jeff Lawhorn) (12/30/89)
I am attempting to port g++ 1.36.1 to the UnixPC. I have gotten it to compile, but when I feed it the following source, it gives me error messages. (The same version of g++ running on a sun gives the correct results.) class x { public: x() {} ~x() {} }; int main(int argc, char *argv[]) { x y; return(0); } When I run g++, I get the following results: berick!jeffl(users) 141> g++ -v testit.cc gcc version 1.36.1- (based on GCC 1.36) /usr/local/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68k -Dunix -Dunixpc -D__mc68k__ -D__unix__ -D__unixpc__ testit.cc /usr/tmp/cca13036.cpp GNU CPP version 1.36 /usr/local/lib/gcc-cc1plus /usr/tmp/cca13036.cpp -quiet -dumpbase testit.cc -version -o /usr/tmp/cca13036.s GNU C++ version 1.36.1- (based on GCC 1.36) (68k, SGS/AT&T unixpc syntax) compiled by GNU C version 1.36. default target switches: testit.cc: In method x::x (): testit.cc:4: parse error at null character testit.cc:12: return from a constructor: use `this = ...' instead berick!jeffl(users) 142> Anyone have sugestions on where to start looking for the cause of this? Also, if I change the constructor/destructor to be forward references, and define the actual functions somewhere else, then it seems to work. Any light anyone can shed on this would be greatly appreciated since I can not get sdb to work on an executable the size of g++. -- Jeff Lawhorn I know I had a pithy quote sitting jeffl@berick.uucp around here somewhere... ucsd!sdsu!berick!jeffl -- Jeff Lawhorn I know I had a pithy quote sitting jeffl@berick.uucp around here somewhere... ucsd!sdsu!berick!jeffl
rfg@ics.uci.edu (Ron Guilmette) (12/31/89)
In article <JEFFL.89Dec29225441@berick.uucp> jeffl@berick.uucp writes: >I am attempting to port g++ 1.36.1 to the UnixPC. I have gotten >it to compile, but when I feed it the following source, it gives >me error messages. (The same version of g++ running on a sun >gives the correct results.) > > > class x { > public: > x() {} > ~x() {} > }; > > int main(int argc, char *argv[]) > { > x y; > > return(0); > } > >When I run g++, I get the following results: > >berick!jeffl(users) 141> g++ -v testit.cc >gcc version 1.36.1- (based on GCC 1.36) > /usr/local/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68k -Dunix -Dunixpc -D__mc68k__ -D__unix__ -D__unixpc__ testit.cc /usr/tmp/cca13036.cpp >GNU CPP version 1.36 > /usr/local/lib/gcc-cc1plus /usr/tmp/cca13036.cpp -quiet -dumpbase testit.cc -version -o /usr/tmp/cca13036.s >GNU C++ version 1.36.1- (based on GCC 1.36) (68k, SGS/AT&T unixpc syntax) compiled by GNU C version 1.36. >default target switches: >testit.cc: In method x::x (): >testit.cc:4: parse error at null character ... First let me point out that gnu.g++ is *not* the right place to be posting bug reports! Please post bug reports (or questions about possible bugs) to gnu.g++.bug instead. Now on to your problem. There is a general problem with SystemV-based systems which tends to result in error messages of the form `parse error at null character'. The problem is that the standard SystemV setvbuf() routine is brain- dammaged. This *only* causes problems when the compiler is attempting to inline-expand very small function bodies (such as the constructor for class x shown above, which is being quietly inlined at the point at which the object `y' is declared). I have tried to fix-up the code in cplus-lex.c in a general way that should prevent this problem from arising on most types of SystemV-based systems. The following patches implement my fixes for a hacked-up version of g++ 1.36.1. (Your line numbers may vary). I hope that these patches will be incorporated into g++ 1.36.2. This is fairly important because right now, g++ is broken for most SystemV's. Somebody should check however to see that I didn't break the code for hp9000's (which appear to be a special case). Thanks to Andrew Klossner @ Tektronix for pointing out the brain-dammage in setvbuf() on USG. Comments in the patches describe the nature of the brain-dammage in more detail. Enjoy, // rfg diff -rc2 1.36.1-/cplus-lex.c 1.36.1+/cplus-lex.c *** 1.36.1-/cplus-lex.c Thu Nov 2 23:14:34 1989 --- 1.36.1+/cplus-lex.c Fri Nov 24 17:53:57 1989 *************** *** 980,1000 **** pending_inlines = pending_inlines->next; finput = finput2; ! #if defined(i386) && !defined(sequent) && !defined(sun386) ! finput2->_ptr = finput2->_base = t->buf; ! _bufend(finput2) = t->buf + t->len; ! finput2->_flag = _IOFBF | _IOREAD; ! finput2->_cnt = t->len - 1; ! #else ! #ifndef hp9000s300 ! #ifdef USG_STDIO setvbuf(finput2,t->buf,_IOFBF,t->len); finput2->_cnt = t->len-1; #else setbuffer (finput2, t->buf, t->len); finput2->_cnt = finput2->_bufsiz - 1; - #endif /* USG_STDIO */ - #else - setvbuf(finput2,t->buf,_IOFBF,t->len); - finput2->_cnt = t->len-1; #endif #endif --- 980,1003 ---- pending_inlines = pending_inlines->next; finput = finput2; ! ! #if defined(hp9000s300) ! /* The hp9000 has a working setvbuf() routine. */ setvbuf(finput2,t->buf,_IOFBF,t->len); finput2->_cnt = t->len-1; #else + #if defined(USG) || defined(DGUX) + /* The standard SystemV code has a broken version of the setvbuf() + routine. IF you try to setvbuf to a buffer which is shorter + than 8 bytes, then the standard USG setvbuf() will ignore the + request and malloc its own buffer. This totally screws up things + for g++, so don't use setvbuf() on USG systems. */ + finput2->_ptr = finput2->_base = (unsigned char *) t->buf; + _bufend(finput2) = (unsigned char *) t->buf + t->len; + finput2->_flag = _IOFBF | _IOREAD; + finput2->_cnt = t->len - 1; + #else + /* Typical BSD systems can use setbuffer. */ setbuffer (finput2, t->buf, t->len); finput2->_cnt = finput2->_bufsiz - 1; #endif #endif *************** *** 2078,2098 **** end of this function. */ pending_inlines = pending_inlines->next; ! #if defined(i386) && !defined(sequent) && !defined(sun386) ! finput2->_ptr = finput2->_base = t->buf; ! _bufend(finput2) = t->buf + t->len; ! finput2->_flag = _IOFBF | _IOREAD; ! finput2->_cnt = t->len - 1; ! #else ! #ifndef hp9000s300 ! #ifdef USG_STDIO setvbuf(finput2,t->buf,_IOFBF,t->len); finput2->_cnt = t->len-1; #else setbuffer (finput2, t->buf, t->len); finput2->_cnt = finput2->_bufsiz - 1; - #endif /* USG_STDIO */ - #else - setvbuf(finput2,t->buf,_IOFBF,t->len); - finput2->_cnt = t->len-1; #endif #endif --- 2081,2100 ---- end of this function. */ pending_inlines = pending_inlines->next; ! #if defined(hp9000s300) ! /* The hp900s300 has a working setvbuf() routine. */ setvbuf(finput2,t->buf,_IOFBF,t->len); finput2->_cnt = t->len-1; #else + #if defined(USG) || defined (DGUX) + /* The standard USG setvbuf() routine screws up if the buffer + you give it is smaller that 8 bytes, so don't use it. */ + finput2->_ptr = finput2->_base = (unsigned char *) t->buf; + _bufend(finput2) = (unsigned char *) t->buf + t->len; + finput2->_flag = _IOFBF | _IOREAD; + finput2->_cnt = t->len - 1; + #else + /* The typical BSD system can use setbuffer */ setbuffer (finput2, t->buf, t->len); finput2->_cnt = finput2->_bufsiz - 1; #endif #endif