wasg@RICE.EDU (Eric Salituro) (09/16/89)
Here is a bug report from one of my users. Please respond directly to him. ----- Begin Included Message ----- From dougm Fri Sep 15 13:17:51 1989 Received: by titan.rice.edu (AA07570); Fri, 15 Sep 89 13:17:49 CDT Date: Fri, 15 Sep 89 13:17:49 CDT From: Doug Moore <dougm> Message-Id: <8909151817.AA07570@titan.rice.edu> To: wasg Subject: private const inited member bug Status: R Here is my bug report to bug-g++@prep.ai.mit.edu. I would appreciate it if you could answer the questions about the g++ installation that I can't. I don't know what was used for "tm.h" and "md", nor do I know what those refer to. These items are supposed to be in bug reports. I would appreciate it if you could add these details to the last paragraph and send it to the bug list. Thanks. Dougm ----- In the shell archive below is the program text and Makefile of a program that reveals a bug in the handling of const data members. The removal of the line "const int bigNum = 4000;" from Integer.h leaves a file that compiles and executes correctly. With the line included, however, the compile looks like: make -k g++ -g -I/usr/local/lib/g++-include -c Integer.cc g++ -g -I/usr/local/lib/g++-include -c gcd.cc In function struct Integer euclidGcd (struct Integer, struct Integer): gcd.cc:11: warning: assignment of read-only location gcd.cc:12: warning: assignment of read-only location In function int main (int, char **): gcd.cc:20: assignment of read-only variable `gcd' *** Error code 1 make: Warning: Target `gcd' not remade because of errors Compilation finished at Fri Sep 15 12:50:57 In response to a report in the gnu.g++.bugs newsgroup, I tried compiling with the -fno-defer-pop compiler option, but this changed nothing. The shell archive with all the relevant source follows. The default.mk file is just a modification of the standard default.mk to provide implicit C++ make rules. The compiler is g++ version 1.35.1-. The machine is a sun3, SunOS release 4.0.1 Thank you for your attention to this problem. Doug Moore (dougm@rice.edu) #!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # Integer.cc # Integer.h # Makefile # gcd.cc if test -f Integer.cc then echo shar: will not overwrite existing file " Integer.cc " else cat >Integer.cc <<'------ EOF ------' #include "Integer.h" Integer::Integer(const Integer& i) // Initialize one Integer to the value of another { number = i.number; } Integer::Integer(int theInt) // A new Integer can be given a value or // the value can default to zero { number = theInt; } Integer& Integer::operator%(const Integer& i) // divide two Integers and make the // remainder a new Integer { Integer *rem = new Integer; rem->number = number % i.number; return *rem; } int Integer::operator!=(const Integer& i) // compare two Integers for inequality { return number != i.number; } ostream& operator<<(ostream& os, const Integer& i) { os << i.number; return os; } ------ EOF ------ ls -l Integer.cc fi # End Integer.cc if test -f Integer.h then echo shar: will not overwrite existing file " Integer.h " else cat >Integer.h <<'------ EOF ------' #include <stream.h> class Integer { public: Integer(int value = 0); ~Integer() {;} Integer(const Integer&); Integer& operator%(const Integer&); int operator!=(const Integer&); friend ostream& operator<< (ostream& os, const Integer& num); private: int number; const int bigNum = 4000; }; ------ EOF ------ ls -l Integer.h fi # End Integer.h if test -f Makefile then echo shar: will not overwrite existing file " Makefile " else cat >Makefile <<'------ EOF ------' include /titan2/dougm/212/default.mk C++FLAGS = -g -I/usr/local/lib/g++-include INTEGER_OFILES = Integer.o gcd: $(INTEGER_OFILES) gcd.o g++ -o gcd $(C++FLAGS) gcd.o $(INTEGER_OFILES) $(INTEGER_OFILES): Integer.h gcd.o: Integer.h ------ EOF ------ ls -l Makefile fi # End Makefile if test -f gcd.cc then echo shar: will not overwrite existing file " gcd.cc " else cat >gcd.cc <<'------ EOF ------' #include <stream.h> #include "Integer.h" Integer euclidGcd(Integer a, Integer b) // Compute and return the greatest common divisor of a and b // using Euclid's algorithm { while (a != Integer(0)) // a respectable Integer class would allow { // me to write a != 0 instead Integer c = b % a; b = a; a = c; } return b; } main(int argc, char *argv[]) // Read several ints from the command line and print their gcd { Integer gcd = 0; while (--argc) { // argc numbers are still to be read and gcd is the greatest // common divisor of the ones read so far. int nextInt = atoi(*++argv); gcd = euclidGcd(gcd, nextInt); } cout << gcd << "\n"; } ------ EOF ------ ls -l gcd.cc fi # End gcd.cc echo '***** End of' bug.shar '*****' ----- End Included Message -----
dougm@rhea.rice.edu (Doug Moore) (09/17/89)
I apologize for reporting as a bug what is not a bug, but a C++ language deficiency. I couldn't kill off the bug report in time. Sorry. Doug Moore (dougm@rice.edu)