This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Aha, I've forgatten the attachments, here they come. (Not tgz as the are small though as I can see it looks ugly on the bug report site. Not sure about the std. ways so sending anuway) Sandor
/**
* Compile:
* - to eat up memory:
* g++ -c bug.cpp
* g++ bug.o -o bug
* - work properly:
* g++ -fno-elide-constructors -c bug.cpp
* g++ bug.o -o bug
*/
#define ALLOC(N) (char*) new char[sizeof(char)*(N)]
#define DELETE(P) delete[] ((char*)(P))
class String {
public:
String() {
data = 0;
}
String(const char *str) {
data = ALLOC(strlen(str) + 1);
strcpy(data, str);
}
String(const String &str){
data = 0;
operator=(str.data);
}
~String() {
if (data) DELETE(data);
}
String &operator=(const String &str) {
return operator=(str.data);
}
String &operator=(const char *str) {
if (data) DELETE(data);
if (str) {
data = ALLOC(strlen(str) + 1);
strcpy(data, str);
} else data = 0;
return *this;
}
String &operator+=(const String &str);
String &operator+=(const char *str);
int length() {
return strlen(data);
}
static int strlen(const char *str);
static void strcpy(char *dest, const char *src);
protected:
char *data;
};
String &String::operator+=(const String &str) {
return operator+=(str.data);
}
String &String::operator+=(const char *str) {
int len1 = length(), len2 = strlen(str);
if (len2) {
char *newdata = ALLOC(len1 + len2 + 1);
if (data) strcpy(newdata, data);
strcpy(newdata + len1, str);
if (data) DELETE(data);
data = newdata;
}
return *this;
}
inline const String operator+(const String &s1, const char *s2) {
String tmp(s1);
tmp += s2;
return tmp;
}
inline const String operator+(const char *s1, const String &s2) {
String tmp(s1);
tmp += s2;
return tmp;
}
int String::strlen(const char *str) {
if (!str) return 0;
const char *org = str;
while (*str) str++;
return str - org;
}
void String::strcpy(char *dest, const char *src) {
while ((*dest++ = *src++));
}
void tester(String str) {
}
int main(int argc, char** argv) {
String str("bug");
while (true) tester("ops: " + str);
}
# 1 "bug.cpp"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bug.cpp"
# 14 "bug.cpp"
class String {
public:
String() {
data = 0;
}
String(const char *str) {
data = (char*) new char[sizeof(char)*(strlen(str) + 1)];
strcpy(data, str);
}
String(const String &str){
data = 0;
operator=(str.data);
}
~String() {
if (data) delete[] ((char*)(data));
}
String &operator=(const String &str) {
return operator=(str.data);
}
String &operator=(const char *str) {
if (data) delete[] ((char*)(data));
if (str) {
data = (char*) new char[sizeof(char)*(strlen(str) + 1)];
strcpy(data, str);
} else data = 0;
return *this;
}
String &operator+=(const String &str);
String &operator+=(const char *str);
int length() {
return strlen(data);
}
static int strlen(const char *str);
static void strcpy(char *dest, const char *src);
protected:
char *data;
};
String &String::operator+=(const String &str) {
return operator+=(str.data);
}
String &String::operator+=(const char *str) {
int len1 = length(), len2 = strlen(str);
if (len2) {
char *newdata = (char*) new char[sizeof(char)*(len1 + len2 + 1)];
if (data) strcpy(newdata, data);
strcpy(newdata + len1, str);
if (data) delete[] ((char*)(data));
data = newdata;
}
return *this;
}
inline const String operator+(const String &s1, const char *s2) {
String tmp(s1);
tmp += s2;
return tmp;
}
inline const String operator+(const char *s1, const String &s2) {
String tmp(s1);
tmp += s2;
return tmp;
}
int String::strlen(const char *str) {
if (!str) return 0;
const char *org = str;
while (*str) str++;
return str - org;
}
void String::strcpy(char *dest, const char *src) {
while ((*dest++ = *src++));
}
void tester(String str) {
}
int main(int argc, char** argv) {
String str("bug");
while (true) tester("ops: " + str);
}
Attachment:
bug.with-felide.s
Description: Binary data
Attachment:
bug.without-felide.s
Description: Binary data
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |