[gnu.g++.bug] Conversion temporaries problem?

hps@cs.brown.edu (10/27/89)

given following input file (different header file for g++)

#include <stream.h>
#include <string.h>
struct string {
  char* p;
  int size; // of vec pointed to by p

  string(int sz) { p = new char[size=sz]; cout<<"string(int) ctor\n";}

  string(char* a) {p = new char[size=strlen(a)+1]; strcpy(p,a);
                     cout << "string(char*) ctor\n"; }
 
  ~string(){delete p; cout << "~string() dtor\n";}

  operator char*() {char* a = new char[size]; strcpy(a,p);
                      cout << "string::operator char*()\n"; return a;}
};

main()
{
char* a="Hello world"; 
string b="This is a string";
b=a=b=a;
}

CC 2.0 produces this output:

string(char*) ctor
string(char*) ctor
string::operator char*()
string(char*) ctor
~string() dtor
~string() dtor
~string() dtor

However, given the following g++ compilation versions:

g++ -v -o p4 p4.cc
gcc version 1.36.0- (based on GCC 1.36)
 /usr/local/gnu/1.36/lib/gcc-cpp -+ -v -I/usr/local/gnu/1.36/lib/g++-include -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ p4.cc /usr/tmp/cca02667.cpp
GNU CPP version 1.36
 /usr/local/gnu/1.36/lib/gcc-cc1plus /usr/tmp/cca02667.cpp -quiet -dumpbase p4.cc -version -o /usr/tmp/cca02667.s
GNU C++ version 1.36.0- (based on GCC 1.36) (sparc) compiled by GNU C version 1.36.
default target switches: -mfpu -mepilogue
 as -o p4.o /usr/tmp/cca02667.s
 /usr/local/gnu/1.36/lib/gcc-ld -o p4 -e start -dc -dp /lib/crt0.o -L/usr/local/gnu/1.36/lib p4.o -lg++ /usr/local/gnu/1.36/lib/gcc-gnulib -lc

I get the following output:

string(char*) ctor
string(char*) ctor
string::operator char*()
string(char*) ctor
~string() dtor

indicating implicit conversion temporaries aren't being destroyed.
No, I don't defend this coding style...

-Page