public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: c++/9872: temporary destructor not called?
@ 2003-02-28  1:56 Sandor Kovacs
  0 siblings, 0 replies; 6+ messages in thread
From: Sandor Kovacs @ 2003-02-28  1:56 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/9872; it has been noted by GNATS.

From: Sandor Kovacs <sandor@ctjapan.com>
To: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
Cc: gcc-bugs@gcc.gnu.org,
 <sakovacs@freemail.hu>,
 <gcc-gnats@gcc.gnu.org>
Subject: Re: c++/9872: temporary destructor not called?
Date: Fri, 28 Feb 2003 01:54:43 +0000

 Ok, standalone, no library dependent test code is here: I've basically 
 stripped down the QT QString implementation.
 
 Compile:
 - to eat up memory:
    g++ -c bug.cpp
    g++ bug.o -o bug
 - works properly:
    g++ -fno-elide-constructors -c bug.cpp
    g++ bug.o -o bug
 
 Find .cpp, .ii, .s attached: bug.without-felide.s is the one which eats up 
 memory, the other one bug.with-felide.s is the properly working one.
 
 If this is indeed a bug in gcc then if would explain why I have increasing 
 swap usage after running KDE for weeks, even thoug no app. is running. In 
 such cases I to restart KDE and swap usage disappeares. IF indeed it is a gcc 
 bug and SuSE compiled kde using gcc3.2...
 
 Regards,
 Sandor
 
 > Sandor,
 > I attached your preprocessed source. Thanks for sending them in.
 > However...
 >
 > > If I've missed something or you need further info please let me know;
 >
 > ...yes, we are missing something:
 > >   gcc -L/usr/lib/qt3/lib -lqt-mt bug.o -o bug
 >
 > You are linking with libqt-mt.so. What we need is a _self-contained_
 > testcase, i.e. something that we can test without additional libraries. If
 > we don't have that, it is impossible to find out whether the problem is in
 > the compiler itself, or in the code that is in the library that is being
 > linked in.
 >
 > Please try to pack everything into one file, including the necessary .cpp
 > files from qt, such that it can be compiled without linking together
 > several .o or .so files.
 >
 > Thanks
 >   Wolfgang
 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: c++/9872: temporary destructor not called?
@ 2003-02-28  2:06 Sandor Kovacs
  0 siblings, 0 replies; 6+ messages in thread
From: Sandor Kovacs @ 2003-02-28  2:06 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/9872; it has been noted by GNATS.

From: Sandor Kovacs <sandor@ctjapan.com>
To: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
Cc: gcc-bugs@gcc.gnu.org,
 <sakovacs@freemail.hu>,
 <gcc-gnats@gcc.gnu.org>
Subject: Re: c++/9872: temporary destructor not called?
Date: Fri, 28 Feb 2003 01:57:13 +0000

 --Boundary-00=_5HsX+OA+17g4atW
 Content-Type: text/plain;
   charset="iso-8859-1"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 
 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
 --Boundary-00=_5HsX+OA+17g4atW
 Content-Type: text/x-c++src;
   charset="iso-8859-1";
   name="bug.cpp"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename="bug.cpp"
 
 /**
  * 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);
 }
 
 --Boundary-00=_5HsX+OA+17g4atW
 Content-Type: text/x-csrc;
   charset="iso-8859-1";
   name="bug.ii"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename="bug.ii"
 
 # 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);
 }
 
 --Boundary-00=_5HsX+OA+17g4atW
 Content-Type: application/octet-stream;
   name="bug.with-felide.s"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename="bug.with-felide.s"
 
 	.file	"bug.cpp"
 	.text
 	.align 2
 .globl _ZN6StringpLERKS_
 	.type	_ZN6StringpLERKS_,@function
 _ZN6StringpLERKS_:
 .LFB1:
 	pushl	%ebp
 .LCFI0:
 	movl	%esp, %ebp
 .LCFI1:
 	subl	$8, %esp
 .LCFI2:
 	subl	$8, %esp
 	movl	12(%ebp), %eax
 	pushl	(%eax)
 	pushl	8(%ebp)
 .LCFI3:
 	call	_ZN6StringpLEPKc
 	addl	$16, %esp
 	leave
 	ret
 .LFE1:
 .Lfe1:
 	.size	_ZN6StringpLERKS_,.Lfe1-_ZN6StringpLERKS_
 	.align 2
 .globl _ZN6StringpLEPKc
 	.type	_ZN6StringpLEPKc,@function
 _ZN6StringpLEPKc:
 .LFB2:
 	pushl	%ebp
 .LCFI4:
 	movl	%esp, %ebp
 .LCFI5:
 	subl	$24, %esp
 .LCFI6:
 	subl	$12, %esp
 	pushl	8(%ebp)
 .LCFI7:
 	call	_ZN6String6lengthEv
 	addl	$16, %esp
 	movl	%eax, -4(%ebp)
 	subl	$12, %esp
 	pushl	12(%ebp)
 	call	_ZN6String6strlenEPKc
 	addl	$16, %esp
 	movl	%eax, -8(%ebp)
 	cmpl	$0, -8(%ebp)
 	je	.L3
 	subl	$12, %esp
 	movl	-8(%ebp), %eax
 	addl	-4(%ebp), %eax
 	incl	%eax
 	pushl	%eax
 	call	_Znaj
 	addl	$16, %esp
 	movl	%eax, -12(%ebp)
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L4
 	subl	$8, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 	pushl	-12(%ebp)
 	call	_ZN6String6strcpyEPcPKc
 	addl	$16, %esp
 .L4:
 	subl	$8, %esp
 	pushl	12(%ebp)
 	movl	-4(%ebp), %eax
 	addl	-12(%ebp), %eax
 	pushl	%eax
 	call	_ZN6String6strcpyEPcPKc
 	addl	$16, %esp
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L5
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L5
 	subl	$12, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 	call	_ZdaPv
 	addl	$16, %esp
 .L5:
 	movl	8(%ebp), %edx
 	movl	-12(%ebp), %eax
 	movl	%eax, (%edx)
 .L3:
 	movl	8(%ebp), %eax
 	leave
 	ret
 .LFE2:
 .Lfe2:
 	.size	_ZN6StringpLEPKc,.Lfe2-_ZN6StringpLEPKc
 	.align 2
 .globl _ZN6String6strlenEPKc
 	.type	_ZN6String6strlenEPKc,@function
 _ZN6String6strlenEPKc:
 .LFB3:
 	pushl	%ebp
 .LCFI8:
 	movl	%esp, %ebp
 .LCFI9:
 	subl	$8, %esp
 .LCFI10:
 	cmpl	$0, 8(%ebp)
 	jne	.L9
 	movl	$0, -8(%ebp)
 	jmp	.L8
 .L9:
 	movl	8(%ebp), %eax
 	movl	%eax, -4(%ebp)
 .L10:
 	movl	8(%ebp), %eax
 	cmpb	$0, (%eax)
 	jne	.L12
 	jmp	.L11
 .L12:
 	incl	8(%ebp)
 	jmp	.L10
 .L11:
 	movl	-4(%ebp), %eax
 	movl	8(%ebp), %edx
 	subl	%eax, %edx
 	movl	%edx, %eax
 	movl	%eax, -8(%ebp)
 .L8:
 	movl	-8(%ebp), %eax
 	leave
 	ret
 .LFE3:
 .Lfe3:
 	.size	_ZN6String6strlenEPKc,.Lfe3-_ZN6String6strlenEPKc
 	.align 2
 .globl _ZN6String6strcpyEPcPKc
 	.type	_ZN6String6strcpyEPcPKc,@function
 _ZN6String6strcpyEPcPKc:
 .LFB4:
 	pushl	%ebp
 .LCFI11:
 	movl	%esp, %ebp
 .LCFI12:
 	nop
 .L14:
 	movl	8(%ebp), %eax
 	movl	%eax, %ecx
 	movl	12(%ebp), %eax
 	movb	(%eax), %dl
 	movb	%dl, (%ecx)
 	leal	12(%ebp), %eax
 	incl	(%eax)
 	incl	8(%ebp)
 	testb	%dl, %dl
 	jne	.L14
 	popl	%ebp
 	ret
 .LFE4:
 .Lfe4:
 	.size	_ZN6String6strcpyEPcPKc,.Lfe4-_ZN6String6strcpyEPcPKc
 	.align 2
 .globl _Z6tester6String
 	.type	_Z6tester6String,@function
 _Z6tester6String:
 .LFB5:
 	pushl	%ebp
 .LCFI13:
 	movl	%esp, %ebp
 .LCFI14:
 	popl	%ebp
 	ret
 .LFE5:
 .Lfe5:
 	.size	_Z6tester6String,.Lfe5-_Z6tester6String
 .globl _Unwind_Resume
 	.section	.rodata
 .LC0:
 	.string	"bug"
 .LC1:
 	.string	"ops: "
 	.text
 	.align 2
 .globl main
 	.type	main,@function
 main:
 .LFB6:
 	pushl	%ebp
 .LCFI15:
 	movl	%esp, %ebp
 .LCFI16:
 	pushl	%ebx
 .LCFI17:
 	subl	$68, %esp
 .LCFI18:
 	andl	$-16, %esp
 	movl	$0, %eax
 	subl	%eax, %esp
 	subl	$8, %esp
 	pushl	$.LC0
 	leal	-24(%ebp), %eax
 	pushl	%eax
 .LEHB0:
 .LCFI19:
 	call	_ZN6StringC1EPKc
 .LEHE0:
 	addl	$16, %esp
 .L19:
 	subl	$12, %esp
 	subl	$12, %esp
 	leal	-56(%ebp), %edx
 	subl	$12, %esp
 	leal	-24(%ebp), %eax
 	pushl	%eax
 	pushl	$.LC1
 	pushl	%edx
 .LEHB1:
 .LCFI20:
 	call	_ZplPKcRK6String
 .LEHE1:
 	addl	$20, %esp
 	leal	-56(%ebp), %eax
 	pushl	%eax
 	leal	-40(%ebp), %eax
 	pushl	%eax
 .LEHB2:
 .LCFI21:
 	call	_ZN6StringC1ERKS_
 	addl	$20, %esp
 	leal	-40(%ebp), %eax
 	pushl	%eax
 .LCFI22:
 	call	_Z6tester6String
 	addl	$16, %esp
 	subl	$12, %esp
 	leal	-40(%ebp), %eax
 	pushl	%eax
 	call	_ZN6StringD1Ev
 .LEHE2:
 	addl	$16, %esp
 	jmp	.L27
 .L34:
 	movl	%eax, -60(%ebp)
 	movl	-60(%ebp), %ebx
 	subl	$12, %esp
 	leal	-56(%ebp), %eax
 	pushl	%eax
 	call	_ZN6StringD1Ev
 	addl	$16, %esp
 	movl	%ebx, -60(%ebp)
 	jmp	.L30
 .L27:
 	subl	$12, %esp
 	leal	-56(%ebp), %eax
 	pushl	%eax
 .LEHB3:
 	call	_ZN6StringD1Ev
 .LEHE3:
 	addl	$16, %esp
 	jmp	.L19
 .L35:
 	movl	%eax, -60(%ebp)
 .L30:
 	movl	-60(%ebp), %ebx
 	subl	$12, %esp
 	leal	-24(%ebp), %eax
 	pushl	%eax
 	call	_ZN6StringD1Ev
 	addl	$16, %esp
 	movl	%ebx, -60(%ebp)
 	subl	$12, %esp
 	pushl	-60(%ebp)
 .LEHB4:
 	call	_Unwind_Resume
 .LEHE4:
 .LFE6:
 .Lfe6:
 	.size	main,.Lfe6-main
 	.section	.gcc_except_table,"aw",@progbits
 .LLSDA6:
 	.byte	0xff
 	.byte	0xff
 	.byte	0x1
 	.uleb128 .LLSDACSE6-.LLSDACSB6
 .LLSDACSB6:
 	.uleb128 .LEHB0-.LFB6
 	.uleb128 .LEHE0-.LEHB0
 	.uleb128 0x0
 	.uleb128 0x0
 	.uleb128 .LEHB1-.LFB6
 	.uleb128 .LEHE1-.LEHB1
 	.uleb128 .L35-.LFB6
 	.uleb128 0x0
 	.uleb128 .LEHB2-.LFB6
 	.uleb128 .LEHE2-.LEHB2
 	.uleb128 .L34-.LFB6
 	.uleb128 0x0
 	.uleb128 .LEHB3-.LFB6
 	.uleb128 .LEHE3-.LEHB3
 	.uleb128 .L35-.LFB6
 	.uleb128 0x0
 	.uleb128 .LEHB4-.LFB6
 	.uleb128 .LEHE4-.LEHB4
 	.uleb128 0x0
 	.uleb128 0x0
 .LLSDACSE6:
 	.text
 	.section	.gnu.linkonce.t._ZN6StringC1EPKc,"ax",@progbits
 	.align 2
 	.weak	_ZN6StringC1EPKc
 	.type	_ZN6StringC1EPKc,@function
 _ZN6StringC1EPKc:
 .LFB7:
 	pushl	%ebp
 .LCFI23:
 	movl	%esp, %ebp
 .LCFI24:
 	pushl	%ebx
 .LCFI25:
 	subl	$4, %esp
 .LCFI26:
 	movl	8(%ebp), %ebx
 	subl	$12, %esp
 	pushl	12(%ebp)
 .LCFI27:
 	call	_ZN6String6strlenEPKc
 	addl	$4, %esp
 	incl	%eax
 	pushl	%eax
 .LCFI28:
 	call	_Znaj
 	addl	$16, %esp
 	movl	%eax, (%ebx)
 	subl	$8, %esp
 	pushl	12(%ebp)
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 	call	_ZN6String6strcpyEPcPKc
 	addl	$16, %esp
 	movl	-4(%ebp), %ebx
 	leave
 	ret
 .LFE7:
 .Lfe7:
 	.size	_ZN6StringC1EPKc,.Lfe7-_ZN6StringC1EPKc
 	.section	.gnu.linkonce.t._ZN6StringC1ERKS_,"ax",@progbits
 	.align 2
 	.weak	_ZN6StringC1ERKS_
 	.type	_ZN6StringC1ERKS_,@function
 _ZN6StringC1ERKS_:
 .LFB8:
 	pushl	%ebp
 .LCFI29:
 	movl	%esp, %ebp
 .LCFI30:
 	subl	$8, %esp
 .LCFI31:
 	movl	8(%ebp), %eax
 	movl	$0, (%eax)
 	subl	$8, %esp
 	movl	12(%ebp), %eax
 	pushl	(%eax)
 	pushl	8(%ebp)
 .LCFI32:
 	call	_ZN6StringaSEPKc
 	addl	$16, %esp
 	leave
 	ret
 .LFE8:
 .Lfe8:
 	.size	_ZN6StringC1ERKS_,.Lfe8-_ZN6StringC1ERKS_
 	.section	.gnu.linkonce.t._ZN6StringD1Ev,"ax",@progbits
 	.align 2
 	.weak	_ZN6StringD1Ev
 	.type	_ZN6StringD1Ev,@function
 _ZN6StringD1Ev:
 .LFB9:
 	pushl	%ebp
 .LCFI33:
 	movl	%esp, %ebp
 .LCFI34:
 	subl	$8, %esp
 .LCFI35:
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L38
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L38
 	subl	$12, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 .LCFI36:
 	call	_ZdaPv
 	addl	$16, %esp
 .L38:
 	leave
 	ret
 .LFE9:
 .Lfe9:
 	.size	_ZN6StringD1Ev,.Lfe9-_ZN6StringD1Ev
 	.section	.gnu.linkonce.t._ZN6String6lengthEv,"ax",@progbits
 	.align 2
 	.weak	_ZN6String6lengthEv
 	.type	_ZN6String6lengthEv,@function
 _ZN6String6lengthEv:
 .LFB10:
 	pushl	%ebp
 .LCFI37:
 	movl	%esp, %ebp
 .LCFI38:
 	subl	$8, %esp
 .LCFI39:
 	subl	$12, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 .LCFI40:
 	call	_ZN6String6strlenEPKc
 	addl	$16, %esp
 	leave
 	ret
 .LFE10:
 .Lfe10:
 	.size	_ZN6String6lengthEv,.Lfe10-_ZN6String6lengthEv
 	.section	.gnu.linkonce.t._ZplPKcRK6String,"ax",@progbits
 	.align 2
 	.weak	_ZplPKcRK6String
 	.type	_ZplPKcRK6String,@function
 _ZplPKcRK6String:
 .LFB11:
 	pushl	%ebp
 .LCFI41:
 	movl	%esp, %ebp
 .LCFI42:
 	pushl	%ebx
 .LCFI43:
 	subl	$36, %esp
 .LCFI44:
 	subl	$8, %esp
 	pushl	12(%ebp)
 	leal	-24(%ebp), %eax
 	pushl	%eax
 .LEHB5:
 .LCFI45:
 	call	_ZN6StringC1EPKc
 .LEHE5:
 	addl	$16, %esp
 	subl	$8, %esp
 	pushl	16(%ebp)
 	leal	-24(%ebp), %eax
 	pushl	%eax
 .LEHB6:
 	call	_ZN6StringpLERKS_
 	addl	$16, %esp
 	subl	$8, %esp
 	leal	-24(%ebp), %eax
 	pushl	%eax
 	pushl	8(%ebp)
 	call	_ZN6StringC1ERKS_
 .LEHE6:
 	addl	$16, %esp
 	subl	$12, %esp
 	leal	-24(%ebp), %eax
 	pushl	%eax
 	call	_ZN6StringD1Ev
 	addl	$16, %esp
 	jmp	.L45
 .L50:
 	movl	%eax, -28(%ebp)
 	movl	-28(%ebp), %ebx
 	subl	$12, %esp
 	leal	-24(%ebp), %eax
 	pushl	%eax
 	call	_ZN6StringD1Ev
 	addl	$16, %esp
 	movl	%ebx, -28(%ebp)
 	subl	$12, %esp
 	pushl	-28(%ebp)
 .LEHB7:
 	call	_Unwind_Resume
 .LEHE7:
 .L45:
 	movl	8(%ebp), %eax
 	movl	-4(%ebp), %ebx
 	leave
 	ret	$4
 .LFE11:
 .Lfe11:
 	.size	_ZplPKcRK6String,.Lfe11-_ZplPKcRK6String
 	.section	.gcc_except_table
 .LLSDA11:
 	.byte	0xff
 	.byte	0xff
 	.byte	0x1
 	.uleb128 .LLSDACSE11-.LLSDACSB11
 .LLSDACSB11:
 	.uleb128 .LEHB5-.LFB11
 	.uleb128 .LEHE5-.LEHB5
 	.uleb128 0x0
 	.uleb128 0x0
 	.uleb128 .LEHB6-.LFB11
 	.uleb128 .LEHE6-.LEHB6
 	.uleb128 .L50-.LFB11
 	.uleb128 0x0
 	.uleb128 .LEHB7-.LFB11
 	.uleb128 .LEHE7-.LEHB7
 	.uleb128 0x0
 	.uleb128 0x0
 .LLSDACSE11:
 	.section	.gnu.linkonce.t._ZplPKcRK6String
 	.section	.gnu.linkonce.t._ZN6StringaSEPKc,"ax",@progbits
 	.align 2
 	.weak	_ZN6StringaSEPKc
 	.type	_ZN6StringaSEPKc,@function
 _ZN6StringaSEPKc:
 .LFB12:
 	pushl	%ebp
 .LCFI46:
 	movl	%esp, %ebp
 .LCFI47:
 	pushl	%ebx
 .LCFI48:
 	subl	$4, %esp
 .LCFI49:
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L52
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L52
 	subl	$12, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 .LCFI50:
 	call	_ZdaPv
 	addl	$16, %esp
 .L52:
 	cmpl	$0, 12(%ebp)
 	je	.L55
 	movl	8(%ebp), %ebx
 	subl	$12, %esp
 	pushl	12(%ebp)
 .LCFI51:
 	call	_ZN6String6strlenEPKc
 	addl	$4, %esp
 	incl	%eax
 	pushl	%eax
 .LCFI52:
 	call	_Znaj
 	addl	$16, %esp
 	movl	%eax, (%ebx)
 	subl	$8, %esp
 	pushl	12(%ebp)
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 	call	_ZN6String6strcpyEPcPKc
 	addl	$16, %esp
 	jmp	.L56
 .L55:
 	movl	8(%ebp), %eax
 	movl	$0, (%eax)
 .L56:
 	movl	8(%ebp), %eax
 	movl	-4(%ebp), %ebx
 	leave
 	ret
 .LFE12:
 .Lfe12:
 	.size	_ZN6StringaSEPKc,.Lfe12-_ZN6StringaSEPKc
 	.section	.eh_frame,"aw",@progbits
 .Lframe1:
 	.long	.LECIE1-.LSCIE1
 .LSCIE1:
 	.long	0x0
 	.byte	0x1
 	.string	"zPL"
 	.uleb128 0x1
 	.sleb128 -4
 	.byte	0x8
 	.uleb128 0x6
 	.byte	0x0
 	.long	__gxx_personality_v0
 	.byte	0x0
 	.byte	0xc
 	.uleb128 0x4
 	.uleb128 0x4
 	.byte	0x88
 	.uleb128 0x1
 	.align 4
 .LECIE1:
 .LSFDE1:
 	.long	.LEFDE1-.LASFDE1
 .LASFDE1:
 	.long	.LASFDE1-.Lframe1
 	.long	.LFB1
 	.long	.LFE1-.LFB1
 	.uleb128 0x4
 	.long	0x0
 	.byte	0x4
 	.long	.LCFI0-.LFB1
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI1-.LCFI0
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI3-.LCFI1
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE1:
 .LSFDE3:
 	.long	.LEFDE3-.LASFDE3
 .LASFDE3:
 	.long	.LASFDE3-.Lframe1
 	.long	.LFB2
 	.long	.LFE2-.LFB2
 	.uleb128 0x4
 	.long	0x0
 	.byte	0x4
 	.long	.LCFI4-.LFB2
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI5-.LCFI4
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI7-.LCFI5
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE3:
 .LSFDE11:
 	.long	.LEFDE11-.LASFDE11
 .LASFDE11:
 	.long	.LASFDE11-.Lframe1
 	.long	.LFB6
 	.long	.LFE6-.LFB6
 	.uleb128 0x4
 	.long	.LLSDA6
 	.byte	0x4
 	.long	.LCFI15-.LFB6
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI16-.LCFI15
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI18-.LCFI16
 	.byte	0x83
 	.uleb128 0x3
 	.byte	0x4
 	.long	.LCFI19-.LCFI18
 	.byte	0x2e
 	.uleb128 0x10
 	.byte	0x4
 	.long	.LCFI20-.LCFI19
 	.byte	0x2e
 	.uleb128 0x18
 	.byte	0x4
 	.long	.LCFI21-.LCFI20
 	.byte	0x2e
 	.uleb128 0x14
 	.byte	0x4
 	.long	.LCFI22-.LCFI21
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE11:
 .LSFDE13:
 	.long	.LEFDE13-.LASFDE13
 .LASFDE13:
 	.long	.LASFDE13-.Lframe1
 	.long	.LFB7
 	.long	.LFE7-.LFB7
 	.uleb128 0x4
 	.long	0x0
 	.byte	0x4
 	.long	.LCFI23-.LFB7
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI24-.LCFI23
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI26-.LCFI24
 	.byte	0x83
 	.uleb128 0x3
 	.byte	0x4
 	.long	.LCFI27-.LCFI26
 	.byte	0x2e
 	.uleb128 0x4
 	.byte	0x4
 	.long	.LCFI28-.LCFI27
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE13:
 .LSFDE15:
 	.long	.LEFDE15-.LASFDE15
 .LASFDE15:
 	.long	.LASFDE15-.Lframe1
 	.long	.LFB8
 	.long	.LFE8-.LFB8
 	.uleb128 0x4
 	.long	0x0
 	.byte	0x4
 	.long	.LCFI29-.LFB8
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI30-.LCFI29
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI32-.LCFI30
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE15:
 .LSFDE21:
 	.long	.LEFDE21-.LASFDE21
 .LASFDE21:
 	.long	.LASFDE21-.Lframe1
 	.long	.LFB11
 	.long	.LFE11-.LFB11
 	.uleb128 0x4
 	.long	.LLSDA11
 	.byte	0x4
 	.long	.LCFI41-.LFB11
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI42-.LCFI41
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI44-.LCFI42
 	.byte	0x83
 	.uleb128 0x3
 	.byte	0x4
 	.long	.LCFI45-.LCFI44
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE21:
 .LSFDE23:
 	.long	.LEFDE23-.LASFDE23
 .LASFDE23:
 	.long	.LASFDE23-.Lframe1
 	.long	.LFB12
 	.long	.LFE12-.LFB12
 	.uleb128 0x4
 	.long	0x0
 	.byte	0x4
 	.long	.LCFI46-.LFB12
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI47-.LCFI46
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI49-.LCFI47
 	.byte	0x83
 	.uleb128 0x3
 	.byte	0x4
 	.long	.LCFI50-.LCFI49
 	.byte	0x2e
 	.uleb128 0x10
 	.byte	0x4
 	.long	.LCFI51-.LCFI50
 	.byte	0x2e
 	.uleb128 0x4
 	.byte	0x4
 	.long	.LCFI52-.LCFI51
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE23:
 	.ident	"GCC: (GNU) 3.2"
 
 --Boundary-00=_5HsX+OA+17g4atW
 Content-Type: application/octet-stream;
   name="bug.without-felide.s"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename="bug.without-felide.s"
 
 	.file	"bug.cpp"
 	.text
 	.align 2
 .globl _ZN6StringpLERKS_
 	.type	_ZN6StringpLERKS_,@function
 _ZN6StringpLERKS_:
 .LFB1:
 	pushl	%ebp
 .LCFI0:
 	movl	%esp, %ebp
 .LCFI1:
 	subl	$8, %esp
 .LCFI2:
 	subl	$8, %esp
 	movl	12(%ebp), %eax
 	pushl	(%eax)
 	pushl	8(%ebp)
 .LCFI3:
 	call	_ZN6StringpLEPKc
 	addl	$16, %esp
 	leave
 	ret
 .LFE1:
 .Lfe1:
 	.size	_ZN6StringpLERKS_,.Lfe1-_ZN6StringpLERKS_
 	.align 2
 .globl _ZN6StringpLEPKc
 	.type	_ZN6StringpLEPKc,@function
 _ZN6StringpLEPKc:
 .LFB2:
 	pushl	%ebp
 .LCFI4:
 	movl	%esp, %ebp
 .LCFI5:
 	subl	$24, %esp
 .LCFI6:
 	subl	$12, %esp
 	pushl	8(%ebp)
 .LCFI7:
 	call	_ZN6String6lengthEv
 	addl	$16, %esp
 	movl	%eax, -4(%ebp)
 	subl	$12, %esp
 	pushl	12(%ebp)
 	call	_ZN6String6strlenEPKc
 	addl	$16, %esp
 	movl	%eax, -8(%ebp)
 	cmpl	$0, -8(%ebp)
 	je	.L3
 	subl	$12, %esp
 	movl	-8(%ebp), %eax
 	addl	-4(%ebp), %eax
 	incl	%eax
 	pushl	%eax
 	call	_Znaj
 	addl	$16, %esp
 	movl	%eax, -12(%ebp)
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L4
 	subl	$8, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 	pushl	-12(%ebp)
 	call	_ZN6String6strcpyEPcPKc
 	addl	$16, %esp
 .L4:
 	subl	$8, %esp
 	pushl	12(%ebp)
 	movl	-4(%ebp), %eax
 	addl	-12(%ebp), %eax
 	pushl	%eax
 	call	_ZN6String6strcpyEPcPKc
 	addl	$16, %esp
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L5
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L5
 	subl	$12, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 	call	_ZdaPv
 	addl	$16, %esp
 .L5:
 	movl	8(%ebp), %edx
 	movl	-12(%ebp), %eax
 	movl	%eax, (%edx)
 .L3:
 	movl	8(%ebp), %eax
 	leave
 	ret
 .LFE2:
 .Lfe2:
 	.size	_ZN6StringpLEPKc,.Lfe2-_ZN6StringpLEPKc
 	.align 2
 .globl _ZN6String6strlenEPKc
 	.type	_ZN6String6strlenEPKc,@function
 _ZN6String6strlenEPKc:
 .LFB3:
 	pushl	%ebp
 .LCFI8:
 	movl	%esp, %ebp
 .LCFI9:
 	subl	$8, %esp
 .LCFI10:
 	cmpl	$0, 8(%ebp)
 	jne	.L9
 	movl	$0, -8(%ebp)
 	jmp	.L8
 .L9:
 	movl	8(%ebp), %eax
 	movl	%eax, -4(%ebp)
 .L10:
 	movl	8(%ebp), %eax
 	cmpb	$0, (%eax)
 	jne	.L12
 	jmp	.L11
 .L12:
 	incl	8(%ebp)
 	jmp	.L10
 .L11:
 	movl	-4(%ebp), %eax
 	movl	8(%ebp), %edx
 	subl	%eax, %edx
 	movl	%edx, %eax
 	movl	%eax, -8(%ebp)
 .L8:
 	movl	-8(%ebp), %eax
 	leave
 	ret
 .LFE3:
 .Lfe3:
 	.size	_ZN6String6strlenEPKc,.Lfe3-_ZN6String6strlenEPKc
 	.align 2
 .globl _ZN6String6strcpyEPcPKc
 	.type	_ZN6String6strcpyEPcPKc,@function
 _ZN6String6strcpyEPcPKc:
 .LFB4:
 	pushl	%ebp
 .LCFI11:
 	movl	%esp, %ebp
 .LCFI12:
 	nop
 .L14:
 	movl	8(%ebp), %eax
 	movl	%eax, %ecx
 	movl	12(%ebp), %eax
 	movb	(%eax), %dl
 	movb	%dl, (%ecx)
 	leal	12(%ebp), %eax
 	incl	(%eax)
 	incl	8(%ebp)
 	testb	%dl, %dl
 	jne	.L14
 	popl	%ebp
 	ret
 .LFE4:
 .Lfe4:
 	.size	_ZN6String6strcpyEPcPKc,.Lfe4-_ZN6String6strcpyEPcPKc
 	.align 2
 .globl _Z6tester6String
 	.type	_Z6tester6String,@function
 _Z6tester6String:
 .LFB5:
 	pushl	%ebp
 .LCFI13:
 	movl	%esp, %ebp
 .LCFI14:
 	popl	%ebp
 	ret
 .LFE5:
 .Lfe5:
 	.size	_Z6tester6String,.Lfe5-_Z6tester6String
 .globl _Unwind_Resume
 	.section	.rodata
 .LC0:
 	.string	"bug"
 .LC1:
 	.string	"ops: "
 	.text
 	.align 2
 .globl main
 	.type	main,@function
 main:
 .LFB6:
 	pushl	%ebp
 .LCFI15:
 	movl	%esp, %ebp
 .LCFI16:
 	pushl	%ebx
 .LCFI17:
 	subl	$52, %esp
 .LCFI18:
 	andl	$-16, %esp
 	movl	$0, %eax
 	subl	%eax, %esp
 	subl	$8, %esp
 	pushl	$.LC0
 	leal	-24(%ebp), %eax
 	pushl	%eax
 .LEHB0:
 .LCFI19:
 	call	_ZN6StringC1EPKc
 .LEHE0:
 	addl	$16, %esp
 .L19:
 	leal	-40(%ebp), %edx
 	subl	$4, %esp
 	leal	-24(%ebp), %eax
 	pushl	%eax
 	pushl	$.LC1
 	pushl	%edx
 .LEHB1:
 	call	_ZplPKcRK6String
 .LEHE1:
 	addl	$12, %esp
 	subl	$12, %esp
 	leal	-40(%ebp), %eax
 	pushl	%eax
 	call	_Z6tester6String
 	addl	$16, %esp
 	jmp	.L19
 .L26:
 	movl	%eax, -44(%ebp)
 	movl	-44(%ebp), %ebx
 	subl	$12, %esp
 	leal	-24(%ebp), %eax
 	pushl	%eax
 	call	_ZN6StringD1Ev
 	addl	$16, %esp
 	movl	%ebx, -44(%ebp)
 	subl	$12, %esp
 	pushl	-44(%ebp)
 .LEHB2:
 	call	_Unwind_Resume
 .LEHE2:
 .LFE6:
 .Lfe6:
 	.size	main,.Lfe6-main
 	.section	.gcc_except_table,"aw",@progbits
 .LLSDA6:
 	.byte	0xff
 	.byte	0xff
 	.byte	0x1
 	.uleb128 .LLSDACSE6-.LLSDACSB6
 .LLSDACSB6:
 	.uleb128 .LEHB0-.LFB6
 	.uleb128 .LEHE0-.LEHB0
 	.uleb128 0x0
 	.uleb128 0x0
 	.uleb128 .LEHB1-.LFB6
 	.uleb128 .LEHE1-.LEHB1
 	.uleb128 .L26-.LFB6
 	.uleb128 0x0
 	.uleb128 .LEHB2-.LFB6
 	.uleb128 .LEHE2-.LEHB2
 	.uleb128 0x0
 	.uleb128 0x0
 .LLSDACSE6:
 	.text
 	.section	.gnu.linkonce.t._ZN6StringC1EPKc,"ax",@progbits
 	.align 2
 	.weak	_ZN6StringC1EPKc
 	.type	_ZN6StringC1EPKc,@function
 _ZN6StringC1EPKc:
 .LFB7:
 	pushl	%ebp
 .LCFI20:
 	movl	%esp, %ebp
 .LCFI21:
 	pushl	%ebx
 .LCFI22:
 	subl	$4, %esp
 .LCFI23:
 	movl	8(%ebp), %ebx
 	subl	$12, %esp
 	pushl	12(%ebp)
 .LCFI24:
 	call	_ZN6String6strlenEPKc
 	addl	$4, %esp
 	incl	%eax
 	pushl	%eax
 .LCFI25:
 	call	_Znaj
 	addl	$16, %esp
 	movl	%eax, (%ebx)
 	subl	$8, %esp
 	pushl	12(%ebp)
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 	call	_ZN6String6strcpyEPcPKc
 	addl	$16, %esp
 	movl	-4(%ebp), %ebx
 	leave
 	ret
 .LFE7:
 .Lfe7:
 	.size	_ZN6StringC1EPKc,.Lfe7-_ZN6StringC1EPKc
 	.section	.gnu.linkonce.t._ZN6StringD1Ev,"ax",@progbits
 	.align 2
 	.weak	_ZN6StringD1Ev
 	.type	_ZN6StringD1Ev,@function
 _ZN6StringD1Ev:
 .LFB8:
 	pushl	%ebp
 .LCFI26:
 	movl	%esp, %ebp
 .LCFI27:
 	subl	$8, %esp
 .LCFI28:
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L28
 	movl	8(%ebp), %eax
 	cmpl	$0, (%eax)
 	je	.L28
 	subl	$12, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 .LCFI29:
 	call	_ZdaPv
 	addl	$16, %esp
 .L28:
 	leave
 	ret
 .LFE8:
 .Lfe8:
 	.size	_ZN6StringD1Ev,.Lfe8-_ZN6StringD1Ev
 	.section	.gnu.linkonce.t._ZN6String6lengthEv,"ax",@progbits
 	.align 2
 	.weak	_ZN6String6lengthEv
 	.type	_ZN6String6lengthEv,@function
 _ZN6String6lengthEv:
 .LFB9:
 	pushl	%ebp
 .LCFI30:
 	movl	%esp, %ebp
 .LCFI31:
 	subl	$8, %esp
 .LCFI32:
 	subl	$12, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 .LCFI33:
 	call	_ZN6String6strlenEPKc
 	addl	$16, %esp
 	leave
 	ret
 .LFE9:
 .Lfe9:
 	.size	_ZN6String6lengthEv,.Lfe9-_ZN6String6lengthEv
 	.section	.gnu.linkonce.t._ZplPKcRK6String,"ax",@progbits
 	.align 2
 	.weak	_ZplPKcRK6String
 	.type	_ZplPKcRK6String,@function
 _ZplPKcRK6String:
 .LFB10:
 	pushl	%ebp
 .LCFI34:
 	movl	%esp, %ebp
 .LCFI35:
 	pushl	%ebx
 .LCFI36:
 	subl	$4, %esp
 .LCFI37:
 	subl	$8, %esp
 	pushl	12(%ebp)
 	pushl	8(%ebp)
 .LEHB3:
 .LCFI38:
 	call	_ZN6StringC1EPKc
 .LEHE3:
 	addl	$16, %esp
 	subl	$8, %esp
 	pushl	16(%ebp)
 	pushl	8(%ebp)
 .LEHB4:
 	call	_ZN6StringpLERKS_
 .LEHE4:
 	addl	$16, %esp
 	jmp	.L35
 .L40:
 	movl	%eax, -8(%ebp)
 	movl	-8(%ebp), %ebx
 	subl	$12, %esp
 	pushl	8(%ebp)
 	call	_ZN6StringD1Ev
 	addl	$16, %esp
 	movl	%ebx, -8(%ebp)
 	subl	$12, %esp
 	pushl	-8(%ebp)
 .LEHB5:
 	call	_Unwind_Resume
 .LEHE5:
 .L35:
 	movl	8(%ebp), %eax
 	movl	-4(%ebp), %ebx
 	leave
 	ret	$4
 .LFE10:
 .Lfe10:
 	.size	_ZplPKcRK6String,.Lfe10-_ZplPKcRK6String
 	.section	.gcc_except_table
 .LLSDA10:
 	.byte	0xff
 	.byte	0xff
 	.byte	0x1
 	.uleb128 .LLSDACSE10-.LLSDACSB10
 .LLSDACSB10:
 	.uleb128 .LEHB3-.LFB10
 	.uleb128 .LEHE3-.LEHB3
 	.uleb128 0x0
 	.uleb128 0x0
 	.uleb128 .LEHB4-.LFB10
 	.uleb128 .LEHE4-.LEHB4
 	.uleb128 .L40-.LFB10
 	.uleb128 0x0
 	.uleb128 .LEHB5-.LFB10
 	.uleb128 .LEHE5-.LEHB5
 	.uleb128 0x0
 	.uleb128 0x0
 .LLSDACSE10:
 	.section	.gnu.linkonce.t._ZplPKcRK6String
 	.section	.eh_frame,"aw",@progbits
 .Lframe1:
 	.long	.LECIE1-.LSCIE1
 .LSCIE1:
 	.long	0x0
 	.byte	0x1
 	.string	"zPL"
 	.uleb128 0x1
 	.sleb128 -4
 	.byte	0x8
 	.uleb128 0x6
 	.byte	0x0
 	.long	__gxx_personality_v0
 	.byte	0x0
 	.byte	0xc
 	.uleb128 0x4
 	.uleb128 0x4
 	.byte	0x88
 	.uleb128 0x1
 	.align 4
 .LECIE1:
 .LSFDE1:
 	.long	.LEFDE1-.LASFDE1
 .LASFDE1:
 	.long	.LASFDE1-.Lframe1
 	.long	.LFB1
 	.long	.LFE1-.LFB1
 	.uleb128 0x4
 	.long	0x0
 	.byte	0x4
 	.long	.LCFI0-.LFB1
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI1-.LCFI0
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI3-.LCFI1
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE1:
 .LSFDE3:
 	.long	.LEFDE3-.LASFDE3
 .LASFDE3:
 	.long	.LASFDE3-.Lframe1
 	.long	.LFB2
 	.long	.LFE2-.LFB2
 	.uleb128 0x4
 	.long	0x0
 	.byte	0x4
 	.long	.LCFI4-.LFB2
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI5-.LCFI4
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI7-.LCFI5
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE3:
 .LSFDE11:
 	.long	.LEFDE11-.LASFDE11
 .LASFDE11:
 	.long	.LASFDE11-.Lframe1
 	.long	.LFB6
 	.long	.LFE6-.LFB6
 	.uleb128 0x4
 	.long	.LLSDA6
 	.byte	0x4
 	.long	.LCFI15-.LFB6
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI16-.LCFI15
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI18-.LCFI16
 	.byte	0x83
 	.uleb128 0x3
 	.byte	0x4
 	.long	.LCFI19-.LCFI18
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE11:
 .LSFDE13:
 	.long	.LEFDE13-.LASFDE13
 .LASFDE13:
 	.long	.LASFDE13-.Lframe1
 	.long	.LFB7
 	.long	.LFE7-.LFB7
 	.uleb128 0x4
 	.long	0x0
 	.byte	0x4
 	.long	.LCFI20-.LFB7
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI21-.LCFI20
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI23-.LCFI21
 	.byte	0x83
 	.uleb128 0x3
 	.byte	0x4
 	.long	.LCFI24-.LCFI23
 	.byte	0x2e
 	.uleb128 0x4
 	.byte	0x4
 	.long	.LCFI25-.LCFI24
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE13:
 .LSFDE19:
 	.long	.LEFDE19-.LASFDE19
 .LASFDE19:
 	.long	.LASFDE19-.Lframe1
 	.long	.LFB10
 	.long	.LFE10-.LFB10
 	.uleb128 0x4
 	.long	.LLSDA10
 	.byte	0x4
 	.long	.LCFI34-.LFB10
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI35-.LCFI34
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI37-.LCFI35
 	.byte	0x83
 	.uleb128 0x3
 	.byte	0x4
 	.long	.LCFI38-.LCFI37
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE19:
 	.ident	"GCC: (GNU) 3.2"
 
 --Boundary-00=_5HsX+OA+17g4atW--
 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: c++/9872: temporary destructor not called?
@ 2003-02-28  0:36 Wolfgang Bangerth
  0 siblings, 0 replies; 6+ messages in thread
From: Wolfgang Bangerth @ 2003-02-28  0:36 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/9872; it has been noted by GNATS.

From: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
To: Sandor Kovacs <sandor@ctjapan.com>
Cc: gcc-bugs@gcc.gnu.org, <sakovacs@freemail.hu>, <gcc-gnats@gcc.gnu.org>
Subject: Re: c++/9872: temporary destructor not called?
Date: Thu, 27 Feb 2003 18:35:21 -0600 (CST)

 Sandor,
 I attached your preprocessed source. Thanks for sending them in. 
 However...
 
 > If I've missed something or you need further info please let me know;
 
 ...yes, we are missing something:
 
 >   gcc -L/usr/lib/qt3/lib -lqt-mt bug.o -o bug
 
 You are linking with libqt-mt.so. What we need is a _self-contained_ 
 testcase, i.e. something that we can test without additional libraries. If 
 we don't have that, it is impossible to find out whether the problem is in 
 the compiler itself, or in the code that is in the library that is being 
 linked in.
 
 Please try to pack everything into one file, including the necessary .cpp 
 files from qt, such that it can be compiled without linking together 
 several .o or .so files.
 
 Thanks
   Wolfgang
 
 -------------------------------------------------------------------------
 Wolfgang Bangerth             email:            bangerth@ticam.utexas.edu
                               www: http://www.ticam.utexas.edu/~bangerth/
 
 
 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: c++/9872: temporary destructor not called?
@ 2003-02-28  0:26 Sandor Kovacs
  0 siblings, 0 replies; 6+ messages in thread
From: Sandor Kovacs @ 2003-02-28  0:26 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/9872; it has been noted by GNATS.

From: Sandor Kovacs <sandor@ctjapan.com>
To: bangerth@dealii.org,
 gcc-bugs@gcc.gnu.org,
 gcc-prs@gcc.gnu.org,
 nobody@gcc.gnu.org,
 sakovacs@freemail.hu,
 gcc-gnats@gcc.gnu.org
Cc:  
Subject: Re: c++/9872: temporary destructor not called?
Date: Fri, 28 Feb 2003 00:17:25 +0000

 --Boundary-00=_VqqX+2CdDYIEEST
 Content-Type: text/plain;
   charset="iso-8859-1"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 
 (Hopefully now complete) bug report for " temporary destructor not called?"
  (see 
 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=9872)
 
 
 Symptoms: simple test program eats up memory if not compiled with 
 -fno-elide-constructors. (simple program attached)
 
 
 1) ouput of gcc -v:
 
 Reading specs from /usr/lib/gcc-lib/i486-suse-linux/3.2/specs
 Configured with: ../configure --enable-threads=posix --prefix=/usr 
 --with-local-prefix=/usr/local --infodir=/usr/share/info 
 --mandir=/usr/share/man --libdir=/usr/lib 
 --enable-languages=c,c++,f77,objc,java,ada --enable-libgcj 
 --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib 
 --with-system-zlib --enable-shared --enable-__cxa_atexit 
 i486-suse-linuxThread model: posixgcc version 3.2- the system type: suse 8.1; 
 uname -a:Linux dragon 2.4.20-ck2 #6 Tue Feb 4 08:44:23 JST 2003 i686 unknown 
 - the options given when GCC was configured/built: see above (using the gcc3.2 
 shipped with suse8.1) 
 - the complete command line that triggers the bug: 
 
    gcc -I/usr/lib/qt3/include -c bug.cpp
    gcc -L/usr/lib/qt3/lib -lqt-mt bug.o -o bug
    ./bug
 
 
 2) the compiler output (error messages, warnings, etc.): no compiler output 
 ie. no error/warning messages
  
 
 3) the preprocessed file (*.i*) that triggers the bug, generated by adding 
 -save-temps... : gcc output: (see attachment for .ii file)
 
 > gcc -v -save-temps -I/usr/lib/qt3/include -c bug.cpp
 Reading specs from /usr/lib/gcc-lib/i486-suse-linux/3.2/specs
 Configured with: ../configure --enable-threads=posix --prefix=/usr 
 --with-local-prefix=/usr/local --infodir=/usr/share/info 
 --mandir=/usr/share/man --libdir=/usr/lib 
 --enable-languages=c,c++,f77,objc,java,ada --enable-libgcj 
 --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib 
 --with-system-zlib --enable-shared --enable-__cxa_atexit 
 i486-suse-linuxThread model: posixgcc version 3.2 
 /usr/lib/gcc-lib/i486-suse-linux/3.2/cpp0 -lang-c++ -D__GNUG__=3 
 -D__DEPRECATED -D__EXCEPTIONS -v -I/usr/lib/qt3/include -D__GNUC__=3 
 -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=0 -D__GXX_ABI_VERSION=102 -D__ELF__ 
 -Dunix -D__gnu_linux__ -Dlinux -D__ELF__ -D__unix__ -D__gnu_linux__ 
 -D__linux__ -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ 
 -D__STDC_HOSTED__=1 -D_GNU_SOURCE -Acpu=i386 -Amachine=i386 -Di386 -D__i386 
 -D__i386__ -D__tune_i486__ bug.cpp bug.iiGNU CPP version 3.2 (cpplib) (i386 
 Linux/ELF)#include "..." search starts here:#include <...> search starts 
 here: /usr/lib/qt3/include /usr/include/g++ /usr/include/g++/i486-suse-linux 
 /usr/include/g++/backward /usr/local/include 
 /usr/lib/gcc-lib/i486-suse-linux/3.2/include /usr/i486-suse-linux/include 
 /usr/includeEnd of search list. /usr/lib/gcc-lib/i486-suse-linux/3.2/cc1plus 
 -fpreprocessed bug.ii -quiet -dumpbase bug.cpp -version -o bug.sGNU CPP 
 version 3.2 (cpplib) (i386 Linux/ELF)GNU C++ version 3.2 (i486-suse-linux)
         compiled by GNU C version 3.2.
  /usr/lib/gcc-lib/i486-suse-linux/3.2/../../../../i486-suse-linux/bin/as -V 
 -Qy -o bug.o bug.sGNU assembler version 2.12.90.0.15 (i486-suse-linux) using 
 BFD version 2.12.90.0.15 20020717 (SuSE)
 
 
 4)... you may want to post parts of it to point out assembly code you consider 
 to be wrong:
 
 I attach the asm file as well, but have no idea which part of the code is 
 wrong
 
 
 If I've missed something or you need further info please let me know;
 
  Sandor
 
 
 > Synopsis: temporary destructor not called?
 >
 > State-Changed-From-To: open->feedback
 > State-Changed-By: bangerth
 > State-Changed-When: Thu Feb 27 15:32:14 2003
 > State-Changed-Why:
 >     We need the _preprocessed_ source to reproduce the problem.
 >     Please take a look at
 >       http://gcc.gnu.org/bugs.html
 >
 >     Thanks
 >       Wolfgang
 >
 > http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&
 >pr=9872
 
 --Boundary-00=_VqqX+2CdDYIEEST
 Content-Type: text/x-c++src;
   charset="iso-8859-1";
   name="bug.cpp"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename="bug.cpp"
 
 /**
  * Compile:
  * gcc -I/usr/lib/qt3/include -c bug.cpp
  * gcc -L/usr/lib/qt3/lib -lqt-mt bug.o -o bug
  */
 
 #include <qstring.h>
 
 void tester(QString str) {
 }
 
 int main(int argc, char** argv) {
     QString str("bug");
     while (true) tester("ops: " + str);
 }
 
 --Boundary-00=_VqqX+2CdDYIEEST
 Content-Type: text/x-csrc;
   charset="iso-8859-1";
   name="bug.ii"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename="bug.ii"
 
 # 1 "bug.cpp"
 # 1 "<built-in>"
 # 1 "<command line>"
 # 1 "bug.cpp"
 
 
 
 
 
 
 # 1 "/usr/lib/qt3/include/qstring.h" 1
 # 42 "/usr/lib/qt3/include/qstring.h"
 # 1 "/usr/lib/qt3/include/qcstring.h" 1
 # 43 "/usr/lib/qt3/include/qcstring.h"
 # 1 "/usr/lib/qt3/include/qmemarray.h" 1
 # 42 "/usr/lib/qt3/include/qmemarray.h"
 # 1 "/usr/lib/qt3/include/qgarray.h" 1
 # 42 "/usr/lib/qt3/include/qgarray.h"
 # 1 "/usr/lib/qt3/include/qshared.h" 1
 # 42 "/usr/lib/qt3/include/qshared.h"
 # 1 "/usr/lib/qt3/include/qglobal.h" 1
 # 573 "/usr/lib/qt3/include/qglobal.h"
 typedef unsigned char uchar;
 typedef unsigned short ushort;
 typedef unsigned uint;
 typedef unsigned long ulong;
 typedef char *pchar;
 typedef uchar *puchar;
 typedef const char *pcchar;
 
 
 
 
 
 
 
 const bool FALSE = 0;
 const bool TRUE = !0;
 # 630 "/usr/lib/qt3/include/qglobal.h"
 inline int qRound( double d )
 {
     return d >= 0.0 ? int(d + 0.5) : int( d - ((int)d-1) + 0.5 ) + ((int)d-1);
 }
 # 642 "/usr/lib/qt3/include/qglobal.h"
 typedef signed char INT8;
 typedef unsigned char UINT8;
 typedef short INT16;
 typedef unsigned short UINT16;
 typedef int INT32;
 typedef unsigned int UINT32;
 
 
 typedef signed char Q_INT8;
 typedef unsigned char Q_UINT8;
 typedef short Q_INT16;
 typedef unsigned short Q_UINT16;
 typedef int Q_INT32;
 typedef unsigned int Q_UINT32;
 
 
 
 
 
 
 typedef long Q_LONG;
 typedef unsigned long Q_ULONG;
 # 678 "/usr/lib/qt3/include/qglobal.h"
     typedef Q_ULONG QtOffset;
 
 
 
 
 
 
 
 class QDataStream;
 # 710 "/usr/lib/qt3/include/qglobal.h"
 # 1 "/usr/lib/qt3/include/qconfig.h" 1
 # 711 "/usr/lib/qt3/include/qglobal.h" 2
 # 720 "/usr/lib/qt3/include/qglobal.h"
 # 1 "/usr/lib/qt3/include/qmodules.h" 1
 # 721 "/usr/lib/qt3/include/qglobal.h" 2
 # 773 "/usr/lib/qt3/include/qglobal.h"
 # 1 "/usr/lib/qt3/include/qfeatures.h" 1
 # 774 "/usr/lib/qt3/include/qglobal.h" 2
 # 840 "/usr/lib/qt3/include/qglobal.h"
  const char *qVersion();
  bool qSysInfo( int *wordSize, bool *bigEndian );
 # 901 "/usr/lib/qt3/include/qglobal.h"
  void qDebug( const char *, ... )
 
     __attribute__ ((format (printf, 1, 2)))
 
 ;
 
  void qWarning( const char *, ... )
 
     __attribute__ ((format (printf, 1, 2)))
 
 ;
 
  void qFatal( const char *, ... )
 
     __attribute__ ((format (printf, 1, 2)))
 
 ;
 
  void qSystemWarning( const char *, int code = -1 );
 
 
 
  void debug( const char *, ... )
 
     __attribute__ ((format (printf, 1, 2)))
 
 ;
 
  void warning( const char *, ... )
 
     __attribute__ ((format (printf, 1, 2)))
 
 ;
 
  void fatal( const char *, ... )
 
     __attribute__ ((format (printf, 1, 2)))
 
 ;
 # 965 "/usr/lib/qt3/include/qglobal.h"
  bool qt_check_pointer( bool c, const char *, int );
 # 979 "/usr/lib/qt3/include/qglobal.h"
 enum QtMsgType { QtDebugMsg, QtWarningMsg, QtFatalMsg };
 
 typedef void (*QtMsgHandler)(QtMsgType, const char *);
  QtMsgHandler qInstallMsgHandler( QtMsgHandler );
 
 
 typedef QtMsgHandler msg_handler;
 
 
  void qSuppressObsoleteWarnings( bool = TRUE );
 
  void qObsolete( const char *obj, const char *oldfunc,
                    const char *newfunc );
  void qObsolete( const char *obj, const char *oldfunc );
  void qObsolete( const char *message );
 
 
 
 
 
 
  const char *qInstallPath();
  const char *qInstallPathDocs();
  const char *qInstallPathHeaders();
  const char *qInstallPathLibs();
  const char *qInstallPathBins();
  const char *qInstallPathPlugins();
  const char *qInstallPathData();
 # 43 "/usr/lib/qt3/include/qshared.h" 2
 
 
 
 struct QShared
 {
     QShared() : count( 1 ) { }
     void ref() { count++; }
     bool deref() { return !--count; }
     uint count;
 };
 # 43 "/usr/lib/qt3/include/qgarray.h" 2
 
 
 
 class QGArray
 {
 friend class QBuffer;
 public:
 
     struct array_data : public QShared {
         array_data():data(0),len(0)
 
 
 
             {}
         char *data;
         uint len;
 
 
 
     };
     QGArray();
     enum Optimization { MemOptim, SpeedOptim };
 protected:
     QGArray( int, int );
     QGArray( int size );
     QGArray( const QGArray &a );
     virtual ~QGArray();
 
     QGArray &operator=( const QGArray &a ) { return assign( a ); }
 
     virtual void detach() { duplicate(*this); }
 
 
     char *data() const { return shd->data; }
     uint nrefs() const { return shd->count; }
     uint size() const { return shd->len; }
     bool isEqual( const QGArray &a ) const;
 
     bool resize( uint newsize, Optimization optim );
     bool resize( uint newsize );
 
     bool fill( const char *d, int len, uint sz );
 
     QGArray &assign( const QGArray &a );
     QGArray &assign( const char *d, uint len );
     QGArray &duplicate( const QGArray &a );
     QGArray &duplicate( const char *d, uint len );
     void store( const char *d, uint len );
 
     array_data *sharedBlock() const { return shd; }
     void setSharedBlock( array_data *p ) { shd=(array_data*)p; }
 
     QGArray &setRawData( const char *d, uint len );
     void resetRawData( const char *d, uint len );
 
     int find( const char *d, uint index, uint sz ) const;
     int contains( const char *d, uint sz ) const;
 
     void sort( uint sz );
     int bsearch( const char *d, uint sz ) const;
 
     char *at( uint index ) const;
 
     bool setExpand( uint index, const char *d, uint sz );
 
 protected:
     virtual array_data *newData();
     virtual void deleteData( array_data *p );
 
 private:
     static void msg_index( uint );
     array_data *shd;
 };
 
 
 inline char *QGArray::at( uint index ) const
 {
 
     if ( index >= size() ) {
         msg_index( index );
         index = 0;
     }
 
     return &shd->data[index];
 }
 # 43 "/usr/lib/qt3/include/qmemarray.h" 2
 
 
 
 template<class type>
 class QMemArray : public QGArray
 {
 public:
     typedef type* Iterator;
     typedef const type* ConstIterator;
     typedef type ValueType;
 
 protected:
     QMemArray( int, int ) : QGArray( 0, 0 ) {}
 
 public:
     QMemArray() {}
     QMemArray( int size ) : QGArray(size*sizeof(type)) {}
     QMemArray( const QMemArray<type> &a ) : QGArray(a) {}
    ~QMemArray() {}
     QMemArray<type> &operator=(const QMemArray<type> &a)
                                 { return (QMemArray<type>&)QGArray::assign(a); }
     type *data() const { return (type *)QGArray::data(); }
     uint nrefs() const { return QGArray::nrefs(); }
     uint size() const { return QGArray::size()/sizeof(type); }
     uint count() const { return size(); }
     bool isEmpty() const { return QGArray::size() == 0; }
     bool isNull() const { return QGArray::data() == 0; }
     bool resize( uint size ) { return QGArray::resize(size*sizeof(type)); }
     bool resize( uint size, Optimization optim ) { return QGArray::resize(size*sizeof(type), optim); }
     bool truncate( uint pos ) { return QGArray::resize(pos*sizeof(type)); }
     bool fill( const type &d, int size = -1 )
         { return QGArray::fill((char*)&d,size,sizeof(type) ); }
     void detach() { QGArray::detach(); }
     QMemArray<type> copy() const
         { QMemArray<type> tmp; return tmp.duplicate(*this); }
     QMemArray<type>& assign( const QMemArray<type>& a )
         { return (QMemArray<type>&)QGArray::assign(a); }
     QMemArray<type>& assign( const type *a, uint n )
         { return (QMemArray<type>&)QGArray::assign((char*)a,n*sizeof(type)); }
     QMemArray<type>& duplicate( const QMemArray<type>& a )
         { return (QMemArray<type>&)QGArray::duplicate(a); }
     QMemArray<type>& duplicate( const type *a, uint n )
         { return (QMemArray<type>&)QGArray::duplicate((char*)a,n*sizeof(type)); }
     QMemArray<type>& setRawData( const type *a, uint n )
         { return (QMemArray<type>&)QGArray::setRawData((char*)a,
                                                      n*sizeof(type)); }
     void resetRawData( const type *a, uint n )
         { QGArray::resetRawData((char*)a,n*sizeof(type)); }
     int find( const type &d, uint i=0 ) const
         { return QGArray::find((char*)&d,i,sizeof(type)); }
     int contains( const type &d ) const
         { return QGArray::contains((char*)&d,sizeof(type)); }
     void sort() { QGArray::sort(sizeof(type)); }
     int bsearch( const type &d ) const
         { return QGArray::bsearch((const char*)&d,sizeof(type)); }
 
     type& operator[]( int i ) const
         { return (type &)(*(type *)QGArray::at(i*sizeof(type))); }
     type& at( uint i ) const
         { return (type &)(*(type *)QGArray::at(i*sizeof(type))); }
          operator const type*() const { return (const type *)QGArray::data(); }
     bool operator==( const QMemArray<type> &a ) const { return isEqual(a); }
     bool operator!=( const QMemArray<type> &a ) const { return !isEqual(a); }
     Iterator begin() { return data(); }
     Iterator end() { return data() + size(); }
     ConstIterator begin() const { return data(); }
     ConstIterator end() const { return data() + size(); }
 };
 # 44 "/usr/lib/qt3/include/qcstring.h" 2
 
 
 # 1 "/usr/include/string.h" 1 3
 # 26 "/usr/include/string.h" 3
 # 1 "/usr/include/features.h" 1 3
 # 283 "/usr/include/features.h" 3
 # 1 "/usr/include/sys/cdefs.h" 1 3
 # 284 "/usr/include/features.h" 2 3
 # 312 "/usr/include/features.h" 3
 # 1 "/usr/include/gnu/stubs.h" 1 3
 # 313 "/usr/include/features.h" 2 3
 # 27 "/usr/include/string.h" 2 3
 
 extern "C" {
 
 
 
 
 # 1 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 1 3
 # 201 "/usr/lib/gcc-lib/i486-suse-linux/3.2/include/stddef.h" 3
 typedef unsigned int size_t;
 # 34 "/usr/include/string.h" 2 3
 
 
 
 extern void *memcpy (void *__restrict __dest,
                      __const void *__restrict __src, size_t __n) throw ();
 
 
 extern void *memmove (void *__dest, __const void *__src, size_t __n)
      throw ();
 
 
 
 
 
 extern void *memccpy (void *__restrict __dest, __const void *__restrict __src,
                       int __c, size_t __n)
      throw ();
 
 
 
 
 extern void *memset (void *__s, int __c, size_t __n) throw ();
 
 
 extern int memcmp (__const void *__s1, __const void *__s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 extern void *memchr (__const void *__s, int __c, size_t __n)
       throw () __attribute__ ((__pure__));
 
 
 
 
 extern void *rawmemchr (__const void *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 extern void *memrchr (__const void *__s, int __c, size_t __n)
       throw () __attribute__ ((__pure__));
 
 
 
 
 extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
      throw ();
 
 extern char *strncpy (char *__restrict __dest,
                       __const char *__restrict __src, size_t __n) throw ();
 
 
 extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
      throw ();
 
 extern char *strncat (char *__restrict __dest, __const char *__restrict __src,
                       size_t __n) throw ();
 
 
 extern int strcmp (__const char *__s1, __const char *__s2)
      throw () __attribute__ ((__pure__));
 
 extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 extern int strcoll (__const char *__s1, __const char *__s2)
      throw () __attribute__ ((__pure__));
 
 extern size_t strxfrm (char *__restrict __dest,
                        __const char *__restrict __src, size_t __n) throw ();
 
 
 
 
 
 # 1 "/usr/include/xlocale.h" 1 3
 # 28 "/usr/include/xlocale.h" 3
 typedef struct __locale_struct
 {
 
   struct locale_data *__locales[13];
 
 
   const unsigned short int *__ctype_b;
   const int *__ctype_tolower;
   const int *__ctype_toupper;
 } *__locale_t;
 # 109 "/usr/include/string.h" 2 3
 
 
 extern int __strcoll_l (__const char *__s1, __const char *__s2, __locale_t __l)
      throw () __attribute__ ((__pure__));
 
 extern size_t __strxfrm_l (char *__dest, __const char *__src, size_t __n,
                            __locale_t __l) throw ();
 
 
 
 
 extern char *strdup (__const char *__s) throw () __attribute__ ((__malloc__));
 
 
 
 
 
 
 extern char *strndup (__const char *__string, size_t __n)
      throw () __attribute__ ((__malloc__));
 # 155 "/usr/include/string.h" 3
 extern char *strchr (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 extern char *strrchr (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 
 
 extern char *strchrnul (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 
 
 extern size_t strcspn (__const char *__s, __const char *__reject)
      throw () __attribute__ ((__pure__));
 
 
 extern size_t strspn (__const char *__s, __const char *__accept)
      throw () __attribute__ ((__pure__));
 
 extern char *strpbrk (__const char *__s, __const char *__accept)
      throw () __attribute__ ((__pure__));
 
 extern char *strstr (__const char *__haystack, __const char *__needle)
      throw () __attribute__ ((__pure__));
 
 
 
 extern char *strcasestr (__const char *__haystack, __const char *__needle)
      throw () __attribute__ ((__pure__));
 
 
 
 extern char *strtok (char *__restrict __s, __const char *__restrict __delim)
      throw ();
 
 
 
 extern char *__strtok_r (char *__restrict __s,
                          __const char *__restrict __delim,
                          char **__restrict __save_ptr) throw ();
 
 extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim,
                        char **__restrict __save_ptr) throw ();
 
 
 
 
 
 
 extern void *memmem (__const void *__haystack, size_t __haystacklen,
                      __const void *__needle, size_t __needlelen)
      throw () __attribute__ ((__pure__));
 
 
 
 extern void *__mempcpy (void *__restrict __dest,
                         __const void *__restrict __src, size_t __n) throw ();
 extern void *mempcpy (void *__restrict __dest,
                       __const void *__restrict __src, size_t __n) throw ();
 
 
 
 
 extern size_t strlen (__const char *__s) throw () __attribute__ ((__pure__));
 
 
 
 
 extern size_t strnlen (__const char *__string, size_t __maxlen)
      throw () __attribute__ ((__pure__));
 
 
 
 
 extern char *strerror (int __errnum) throw ();
 
 
 
 extern char *strerror_r (int __errnum, char *__buf, size_t __buflen) throw ();
 
 
 
 
 extern void __bzero (void *__s, size_t __n) throw ();
 
 
 
 extern void bcopy (__const void *__src, void *__dest, size_t __n) throw ();
 
 
 extern void bzero (void *__s, size_t __n) throw ();
 
 
 extern int bcmp (__const void *__s1, __const void *__s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 extern char *index (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 extern char *rindex (__const char *__s, int __c) throw () __attribute__ ((__pure__));
 
 
 
 extern int ffs (int __i) throw () __attribute__ ((__const__));
 
 
 
 
 extern int ffsl (long int __l) throw () __attribute__ ((__const__));
 
 __extension__ extern int ffsll (long long int __ll)
      throw () __attribute__ ((__const__));
 
 
 
 
 extern int strcasecmp (__const char *__s1, __const char *__s2)
      throw () __attribute__ ((__pure__));
 
 
 extern int strncasecmp (__const char *__s1, __const char *__s2, size_t __n)
      throw () __attribute__ ((__pure__));
 
 
 
 
 
 extern int __strcasecmp_l (__const char *__s1, __const char *__s2,
                            __locale_t __loc) throw () __attribute__ ((__pure__));
 
 extern int __strncasecmp_l (__const char *__s1, __const char *__s2,
                             size_t __n, __locale_t __loc)
      throw () __attribute__ ((__pure__));
 
 
 
 
 
 extern char *strsep (char **__restrict __stringp,
                      __const char *__restrict __delim) throw ();
 
 
 
 
 extern int strverscmp (__const char *__s1, __const char *__s2)
      throw () __attribute__ ((__pure__));
 
 
 extern char *strsignal (int __sig) throw ();
 
 
 extern char *__stpcpy (char *__restrict __dest, __const char *__restrict __src)
      throw ();
 extern char *stpcpy (char *__restrict __dest, __const char *__restrict __src)
      throw ();
 
 
 
 extern char *__stpncpy (char *__restrict __dest,
                         __const char *__restrict __src, size_t __n) throw ();
 extern char *stpncpy (char *__restrict __dest,
                       __const char *__restrict __src, size_t __n) throw ();
 
 
 extern char *strfry (char *__string) throw ();
 
 
 extern void *memfrob (void *__s, size_t __n) throw ();
 
 
 
 
 
 
 extern char *basename (__const char *__filename) throw ();
 # 364 "/usr/include/string.h" 3
 }
 # 47 "/usr/lib/qt3/include/qcstring.h" 2
 
 
 
 
 
 
  void *qmemmove( void *dst, const void *src, uint len );
 
  char *qstrdup( const char * );
 
  inline uint qstrlen( const char *str )
 { return str ? (uint)strlen(str) : 0; }
 
  inline char *qstrcpy( char *dst, const char *src )
 { return src ? strcpy(dst, src) : 0; }
 
  char *qstrncpy( char *dst, const char *src, uint len );
 
  inline int qstrcmp( const char *str1, const char *str2 )
 {
     return ( str1 && str2 ) ? strcmp( str1, str2 )
                             : ( str1 ? 1 : ( str2 ? -1 : 0 ) );
 }
 
  inline int qstrncmp( const char *str1, const char *str2, uint len )
 {
     return ( str1 && str2 ) ? strncmp( str1, str2, len )
                             : ( str1 ? 1 : ( str2 ? -1 : 0 ) );
 }
 
  int qstricmp( const char *, const char * );
 
  int qstrnicmp( const char *, const char *, uint len );
 
 
  inline uint cstrlen( const char *str )
 { return (uint)strlen(str); }
 
  inline char *cstrcpy( char *dst, const char *src )
 { return strcpy(dst,src); }
 
  inline int cstrcmp( const char *str1, const char *str2 )
 { return strcmp(str1,str2); }
 
  inline int cstrncmp( const char *str1, const char *str2, uint len )
 { return strncmp(str1,str2,len); }
 
 
 
 
 
  Q_UINT16 qChecksum( const char *s, uint len );
 # 120 "/usr/lib/qt3/include/qcstring.h"
 typedef QMemArray<char> QByteArray;
 
 
 
  QByteArray qCompress( const uchar* data, int nbytes );
  QByteArray qUncompress( const uchar* data, int nbytes );
  inline QByteArray qCompress( const QByteArray& data)
 { return qCompress( (const uchar*)data.data(), data.size() ); }
  inline QByteArray qUncompress( const QByteArray& data )
 { return qUncompress( (const uchar*)data.data(), data.size() ); }
 
 
 
 
 
 
  QDataStream &operator<<( QDataStream &, const QByteArray & );
  QDataStream &operator>>( QDataStream &, QByteArray & );
 
 
 
 
 
 
 class QRegExp;
 
 class QCString : public QByteArray
 {
 public:
     QCString() {}
     QCString( int size );
     QCString( const QCString &s ) : QByteArray( s ) {}
     QCString( const char *str );
     QCString( const char *str, uint maxlen );
     ~QCString();
 
     QCString &operator=( const QCString &s );
     QCString &operator=( const char *str );
 
     bool isNull() const;
     bool isEmpty() const;
     uint length() const;
     bool resize( uint newlen );
     bool truncate( uint pos );
     bool fill( char c, int len = -1 );
 
     QCString copy() const;
 
     QCString &sprintf( const char *format, ... );
 
     int find( char c, int index=0, bool cs=TRUE ) const;
     int find( const char *str, int index=0, bool cs=TRUE ) const;
 
     int find( const QRegExp &, int index=0 ) const;
 
     int findRev( char c, int index=-1, bool cs=TRUE) const;
     int findRev( const char *str, int index=-1, bool cs=TRUE) const;
 
     int findRev( const QRegExp &, int index=-1 ) const;
 
     int contains( char c, bool cs=TRUE ) const;
     int contains( const char *str, bool cs=TRUE ) const;
 
     int contains( const QRegExp & ) const;
 
     QCString left( uint len ) const;
     QCString right( uint len ) const;
     QCString mid( uint index, uint len=0xffffffff) const;
 
     QCString leftJustify( uint width, char fill=' ', bool trunc=FALSE)const;
     QCString rightJustify( uint width, char fill=' ',bool trunc=FALSE)const;
 
     QCString lower() const;
     QCString upper() const;
 
     QCString stripWhiteSpace() const;
     QCString simplifyWhiteSpace() const;
 
     QCString &insert( uint index, const char * );
     QCString &insert( uint index, char );
     QCString &append( const char * );
     QCString &prepend( const char * );
     QCString &remove( uint index, uint len );
     QCString &replace( uint index, uint len, const char * );
 
     QCString &replace( const QRegExp &, const char * );
 
     QCString &replace( char c, const char *after );
     QCString &replace( const char *, const char * );
     QCString &replace( char, char );
 
     short toShort( bool *ok=0 ) const;
     ushort toUShort( bool *ok=0 ) const;
     int toInt( bool *ok=0 ) const;
     uint toUInt( bool *ok=0 ) const;
     long toLong( bool *ok=0 ) const;
     ulong toULong( bool *ok=0 ) const;
     float toFloat( bool *ok=0 ) const;
     double toDouble( bool *ok=0 ) const;
 
     QCString &setStr( const char *s );
     QCString &setNum( short );
     QCString &setNum( ushort );
     QCString &setNum( int );
     QCString &setNum( uint );
     QCString &setNum( long );
     QCString &setNum( ulong );
     QCString &setNum( float, char f='g', int prec=6 );
     QCString &setNum( double, char f='g', int prec=6 );
 
     bool setExpand( uint index, char c );
 
                 operator const char *() const;
     QCString &operator+=( const char *str );
     QCString &operator+=( char c );
 private:
     int find( const char *str, int index, bool cs, uint l ) const;
 };
 
 
 
 
 
 
  QDataStream &operator<<( QDataStream &, const QCString & );
  QDataStream &operator>>( QDataStream &, QCString & );
 
 
 
 
 
 
 inline QCString &QCString::operator=( const QCString &s )
 { return (QCString&)assign( s ); }
 
 inline QCString &QCString::operator=( const char *str )
 { return (QCString&)duplicate( str, qstrlen(str)+1 ); }
 
 inline bool QCString::isNull() const
 { return data() == 0; }
 
 inline bool QCString::isEmpty() const
 { return data() == 0 || *data() == '\0'; }
 
 inline uint QCString::length() const
 { return qstrlen( data() ); }
 
 inline bool QCString::truncate( uint pos )
 { return resize(pos+1); }
 
 inline QCString QCString::copy() const
 { return QCString( data() ); }
 
 inline QCString &QCString::prepend( const char *s )
 { return insert(0,s); }
 
 inline QCString &QCString::append( const char *s )
 { return operator+=(s); }
 
 inline QCString &QCString::setNum( short n )
 { return setNum((long)n); }
 
 inline QCString &QCString::setNum( ushort n )
 { return setNum((ulong)n); }
 
 inline QCString &QCString::setNum( int n )
 { return setNum((long)n); }
 
 inline QCString &QCString::setNum( uint n )
 { return setNum((ulong)n); }
 
 inline QCString &QCString::setNum( float n, char f, int prec )
 { return setNum((double)n,f,prec); }
 
 inline QCString::operator const char *() const
 { return (const char *)data(); }
 
 
 
 
 
 
  inline bool operator==( const QCString &s1, const QCString &s2 )
 { return qstrcmp( s1.data(), s2.data() ) == 0; }
 
  inline bool operator==( const QCString &s1, const char *s2 )
 { return qstrcmp( s1.data(), s2 ) == 0; }
 
  inline bool operator==( const char *s1, const QCString &s2 )
 { return qstrcmp( s1, s2.data() ) == 0; }
 
  inline bool operator!=( const QCString &s1, const QCString &s2 )
 { return qstrcmp( s1.data(), s2.data() ) != 0; }
 
  inline bool operator!=( const QCString &s1, const char *s2 )
 { return qstrcmp( s1.data(), s2 ) != 0; }
 
  inline bool operator!=( const char *s1, const QCString &s2 )
 { return qstrcmp( s1, s2.data() ) != 0; }
 
  inline bool operator<( const QCString &s1, const QCString& s2 )
 { return qstrcmp( s1.data(), s2.data() ) < 0; }
 
  inline bool operator<( const QCString &s1, const char *s2 )
 { return qstrcmp( s1.data(), s2 ) < 0; }
 
  inline bool operator<( const char *s1, const QCString &s2 )
 { return qstrcmp( s1, s2.data() ) < 0; }
 
  inline bool operator<=( const QCString &s1, const QCString &s2 )
 { return qstrcmp( s1.data(), s2.data() ) <= 0; }
 
  inline bool operator<=( const QCString &s1, const char *s2 )
 { return qstrcmp( s1.data(), s2 ) <= 0; }
 
  inline bool operator<=( const char *s1, const QCString &s2 )
 { return qstrcmp( s1, s2.data() ) <= 0; }
 
  inline bool operator>( const QCString &s1, const QCString &s2 )
 { return qstrcmp( s1.data(), s2.data() ) > 0; }
 
  inline bool operator>( const QCString &s1, const char *s2 )
 { return qstrcmp( s1.data(), s2 ) > 0; }
 
  inline bool operator>( const char *s1, const QCString &s2 )
 { return qstrcmp( s1, s2.data() ) > 0; }
 
  inline bool operator>=( const QCString &s1, const QCString& s2 )
 { return qstrcmp( s1.data(), s2.data() ) >= 0; }
 
  inline bool operator>=( const QCString &s1, const char *s2 )
 { return qstrcmp( s1.data(), s2 ) >= 0; }
 
  inline bool operator>=( const char *s1, const QCString &s2 )
 { return qstrcmp( s1, s2.data() ) >= 0; }
 
  inline const QCString operator+( const QCString &s1,
                                           const QCString &s2 )
 {
     QCString tmp( s1.data() );
     tmp += s2;
     return tmp;
 }
 
  inline const QCString operator+( const QCString &s1, const char *s2 )
 {
     QCString tmp( s1.data() );
     tmp += s2;
     return tmp;
 }
 
  inline const QCString operator+( const char *s1, const QCString &s2 )
 {
     QCString tmp( s1 );
     tmp += s2;
     return tmp;
 }
 
  inline const QCString operator+( const QCString &s1, char c2 )
 {
     QCString tmp( s1.data() );
     tmp += c2;
     return tmp;
 }
 
  inline const QCString operator+( char c1, const QCString &s2 )
 {
     QCString tmp;
     tmp += c1;
     tmp += s2;
     return tmp;
 }
 # 43 "/usr/lib/qt3/include/qstring.h" 2
 # 57 "/usr/lib/qt3/include/qstring.h"
 class QRegExp;
 class QString;
 class QCharRef;
 template <class T> class QDeepCopy;
 
 class QChar {
 public:
     QChar();
     QChar( char c );
     QChar( uchar c );
     QChar( uchar c, uchar r );
     QChar( const QChar& c );
     QChar( ushort rc );
     QChar( short rc );
     QChar( uint rc );
     QChar( int rc );
 
     static const QChar null;
     static const QChar replacement;
     static const QChar byteOrderMark;
     static const QChar byteOrderSwapped;
     static const QChar nbsp;
 
 
 
     enum Category
     {
         NoCategory,
 
         Mark_NonSpacing,
         Mark_SpacingCombining,
         Mark_Enclosing,
 
         Number_DecimalDigit,
         Number_Letter,
         Number_Other,
 
         Separator_Space,
         Separator_Line,
         Separator_Paragraph,
 
         Other_Control,
         Other_Format,
         Other_Surrogate,
         Other_PrivateUse,
         Other_NotAssigned,
 
         Letter_Uppercase,
         Letter_Lowercase,
         Letter_Titlecase,
         Letter_Modifier,
         Letter_Other,
 
         Punctuation_Connector,
         Punctuation_Dash,
         Punctuation_Dask = Punctuation_Dash,
         Punctuation_Open,
         Punctuation_Close,
         Punctuation_InitialQuote,
         Punctuation_FinalQuote,
         Punctuation_Other,
 
         Symbol_Math,
         Symbol_Currency,
         Symbol_Modifier,
         Symbol_Other
     };
 
     enum Direction
     {
         DirL, DirR, DirEN, DirES, DirET, DirAN, DirCS, DirB, DirS, DirWS, DirON,
         DirLRE, DirLRO, DirAL, DirRLE, DirRLO, DirPDF, DirNSM, DirBN
     };
 
     enum Decomposition
     {
         Single, Canonical, Font, NoBreak, Initial, Medial,
         Final, Isolated, Circle, Super, Sub, Vertical,
         Wide, Narrow, Small, Square, Compat, Fraction
     };
 
     enum Joining
     {
         OtherJoining, Dual, Right, Center
     };
 
     enum CombiningClass
     {
         Combining_BelowLeftAttached = 200,
         Combining_BelowAttached = 202,
         Combining_BelowRightAttached = 204,
         Combining_LeftAttached = 208,
         Combining_RightAttached = 210,
         Combining_AboveLeftAttached = 212,
         Combining_AboveAttached = 214,
         Combining_AboveRightAttached = 216,
 
         Combining_BelowLeft = 218,
         Combining_Below = 220,
         Combining_BelowRight = 222,
         Combining_Left = 224,
         Combining_Right = 226,
         Combining_AboveLeft = 228,
         Combining_Above = 230,
         Combining_AboveRight = 232,
 
         Combining_DoubleBelow = 233,
         Combining_DoubleAbove = 234,
         Combining_IotaSubscript = 240
     };
 
 
 
     int digitValue() const;
     QChar lower() const;
     QChar upper() const;
 
     Category category() const;
     Direction direction() const;
     Joining joining() const;
     bool mirrored() const;
     QChar mirroredChar() const;
     const QString &decomposition() const;
     Decomposition decompositionTag() const;
     unsigned char combiningClass() const;
 
     char latin1() const { return ucs > 0xff ? 0 : (char) ucs; }
     ushort unicode() const { return ucs; }
     ushort &unicode() { return ucs; }
 
 
     operator char() const { return latin1(); }
 
 
     bool isNull() const { return unicode()==0; }
     bool isPrint() const;
     bool isPunct() const;
     bool isSpace() const;
     bool isMark() const;
     bool isLetter() const;
     bool isNumber() const;
     bool isLetterOrNumber() const;
     bool isDigit() const;
     bool isSymbol() const;
 
     uchar cell() const { return ((uchar) ucs & 0xff); }
     uchar row() const { return ((uchar) (ucs>>8)&0xff); }
     void setCell( uchar cell ) { ucs = (ucs & 0xff00) + cell; }
     void setRow( uchar row ) { ucs = (((ushort) row)<<8) + (ucs&0xff); }
 
     static bool networkOrdered() {
         int wordSize;
         bool bigEndian = FALSE;
         qSysInfo( &wordSize, &bigEndian );
         return bigEndian;
     }
 
     friend inline bool operator==( char ch, QChar c );
     friend inline bool operator==( QChar c, char ch );
     friend inline bool operator==( QChar c1, QChar c2 );
     friend inline bool operator!=( QChar c1, QChar c2 );
     friend inline bool operator!=( char ch, QChar c );
     friend inline bool operator!=( QChar c, char ch );
     friend inline bool operator<=( QChar c, char ch );
     friend inline bool operator<=( char ch, QChar c );
     friend inline bool operator<=( QChar c1, QChar c2 );
 
 private:
     ushort ucs;
 
 
 
 } ;
 
 inline QChar::QChar() : ucs( 0 )
 
 
 
 {
 }
 inline QChar::QChar( char c ) : ucs( (uchar)c )
 
 
 
 {
 }
 inline QChar::QChar( uchar c ) : ucs( c )
 
 
 
 {
 }
 inline QChar::QChar( uchar c, uchar r ) : ucs( (r << 8) | c )
 
 
 
 {
 }
 inline QChar::QChar( const QChar& c ) : ucs( c.ucs )
 
 
 
 {
 }
 
 inline QChar::QChar( ushort rc ) : ucs( rc )
 
 
 
 {
 }
 inline QChar::QChar( short rc ) : ucs( (ushort) rc )
 
 
 
 {
 }
 inline QChar::QChar( uint rc ) : ucs( (ushort ) (rc & 0xffff) )
 
 
 
 {
 }
 inline QChar::QChar( int rc ) : ucs( (ushort) (rc & 0xffff) )
 
 
 
 {
 }
 
 inline bool operator==( char ch, QChar c )
 {
     return ((uchar) ch) == c.ucs;
 }
 
 inline bool operator==( QChar c, char ch )
 {
     return ((uchar) ch) == c.ucs;
 }
 
 inline bool operator==( QChar c1, QChar c2 )
 {
     return c1.ucs == c2.ucs;
 }
 
 inline bool operator!=( QChar c1, QChar c2 )
 {
     return c1.ucs != c2.ucs;
 }
 
 inline bool operator!=( char ch, QChar c )
 {
     return ((uchar)ch) != c.ucs;
 }
 
 inline bool operator!=( QChar c, char ch )
 {
     return ((uchar) ch) != c.ucs;
 }
 
 inline bool operator<=( QChar c, char ch )
 {
     return c.ucs <= ((uchar) ch);
 }
 
 inline bool operator<=( char ch, QChar c )
 {
     return ((uchar) ch) <= c.ucs;
 }
 
 inline bool operator<=( QChar c1, QChar c2 )
 {
     return c1.ucs <= c2.ucs;
 }
 
 inline bool operator>=( QChar c, char ch ) { return ch <= c; }
 inline bool operator>=( char ch, QChar c ) { return c <= ch; }
 inline bool operator>=( QChar c1, QChar c2 ) { return c2 <= c1; }
 inline bool operator<( QChar c, char ch ) { return !(ch<=c); }
 inline bool operator<( char ch, QChar c ) { return !(c<=ch); }
 inline bool operator<( QChar c1, QChar c2 ) { return !(c2<=c1); }
 inline bool operator>( QChar c, char ch ) { return !(ch>=c); }
 inline bool operator>( char ch, QChar c ) { return !(c>=ch); }
 inline bool operator>( QChar c1, QChar c2 ) { return !(c2>=c1); }
 
 
 struct QStringData : public QShared {
     QStringData() :
         QShared(), unicode(0), ascii(0), len(0), issimpletext(TRUE), maxl(0), islatin1(FALSE) { ref(); }
     QStringData(QChar *u, uint l, uint m) :
         QShared(), unicode(u), ascii(0), len(l), issimpletext(FALSE), maxl(m), islatin1(FALSE) { }
     ~QStringData() { if ( unicode ) delete[] ((char*)unicode);
                      if ( ascii ) delete[] ascii; }
 
     void deleteSelf();
     QChar *unicode;
     char *ascii;
     void setDirty() {
         if ( ascii ) {
             delete [] ascii;
             ascii = 0;
         }
         issimpletext = FALSE;
     }
 
 
 
     uint len : 30;
 
     uint issimpletext : 1;
 
 
 
     uint maxl : 30;
 
     uint islatin1 : 1;
 
 private:
 
     QStringData( const QStringData& );
     QStringData& operator=( const QStringData& );
 
 };
 
 
 class QString
 {
 public:
     QString();
     QString( QChar );
     QString( const QString & );
     QString( const QByteArray& );
     QString( const QChar* unicode, uint length );
 
     QString( const char *str );
 
 
 
 
     ~QString();
 
     QString &operator=( const QString & );
     QString &operator=( const char * );
 
 
 
     QString &operator=( const QCString& );
     QString &operator=( QChar c );
     QString &operator=( char c );
 
     static const QString null;
 
     bool isNull() const;
     bool isEmpty() const;
     uint length() const;
     void truncate( uint pos );
 
     QString & fill( QChar c, int len = -1 );
 
     QString copy() const;
 
     QString arg( long a, int fieldwidth=0, int base=10 ) const;
     QString arg( ulong a, int fieldwidth=0, int base=10 ) const;
     QString arg( int a, int fieldwidth=0, int base=10 ) const;
     QString arg( uint a, int fieldwidth=0, int base=10 ) const;
     QString arg( short a, int fieldwidth=0, int base=10 ) const;
     QString arg( ushort a, int fieldwidth=0, int base=10 ) const;
     QString arg( char a, int fieldwidth=0 ) const;
     QString arg( QChar a, int fieldwidth=0 ) const;
     QString arg( const QString& a, int fieldwidth=0 ) const;
     QString arg( double a, int fieldwidth=0, char fmt='g', int prec=-1 ) const;
 
 
     QString &sprintf( const char* format, ... )
 
         __attribute__ ((format (printf, 2, 3)))
 
         ;
 
 
     int find( QChar c, int index=0, bool cs=TRUE ) const;
     int find( char c, int index=0, bool cs=TRUE ) const;
     int find( const QString &str, int index=0, bool cs=TRUE ) const;
 
     int find( const QRegExp &, int index=0 ) const;
 
 
     int find( const char* str, int index=0 ) const;
 
     int findRev( QChar c, int index=-1, bool cs=TRUE) const;
     int findRev( char c, int index=-1, bool cs=TRUE) const;
     int findRev( const QString &str, int index=-1, bool cs=TRUE) const;
 
     int findRev( const QRegExp &, int index=-1 ) const;
 
 
     int findRev( const char* str, int index=-1 ) const;
 
     int contains( QChar c, bool cs=TRUE ) const;
     int contains( char c, bool cs=TRUE ) const
                     { return contains(QChar(c), cs); }
 
     int contains( const char* str, bool cs=TRUE ) const;
 
     int contains( const QString &str, bool cs=TRUE ) const;
 
     int contains( const QRegExp & ) const;
 
 
     enum SectionFlags {
         SectionDefault = 0x00,
         SectionSkipEmpty = 0x01,
         SectionIncludeLeadingSep = 0x02,
         SectionIncludeTrailingSep = 0x04,
         SectionCaseInsensitiveSeps = 0x08
     };
     QString section( QChar sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const;
     QString section( char sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const;
 
     QString section( const char *in_sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const;
 
     QString section( const QString &in_sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const;
 
     QString section( const QRegExp &reg, int start, int end = 0xffffffff, int flags = SectionDefault ) const;
 
 
     QString left( uint len ) const;
     QString right( uint len ) const;
     QString mid( uint index, uint len=0xffffffff) const;
 
     QString leftJustify( uint width, QChar fill=' ', bool trunc=FALSE)const;
     QString rightJustify( uint width, QChar fill=' ',bool trunc=FALSE)const;
 
     QString lower() const;
     QString upper() const;
 
     QString stripWhiteSpace() const;
     QString simplifyWhiteSpace() const;
 
     QString &insert( uint index, const QString & );
     QString &insert( uint index, const QChar*, uint len );
     QString &insert( uint index, QChar );
     QString &insert( uint index, char c ) { return insert(index,QChar(c)); }
     QString &append( char );
     QString &append( QChar );
     QString &append( const QString & );
 
     QString &append( const QByteArray & );
     QString &append( const char * );
 
 
 
 
     QString &prepend( char );
     QString &prepend( QChar );
     QString &prepend( const QString & );
 
     QString &prepend( const QByteArray & );
     QString &prepend( const char * );
 
 
 
 
     QString &remove( uint index, uint len );
     QString &remove( QChar c );
     QString &remove( char c ) { return remove( QChar(c) ); }
     QString &remove( const QString & );
 
     QString &remove( const QRegExp & );
 
 
     QString &remove( const char * );
 
     QString &replace( uint index, uint len, const QString & );
     QString &replace( uint index, uint len, const QChar*, uint clen );
     QString &replace( uint index, uint len, QChar );
     QString &replace( uint index, uint len, char c )
     { return replace( index, len, QChar(c) ); }
     QString &replace( QChar c, const QString & );
     QString &replace( char c, const QString & after )
     { return replace( QChar(c), after ); }
     QString &replace( const QString &, const QString & );
 
     QString &replace( const QRegExp &, const QString & );
 
     QString &replace( QChar, QChar );
 
     short toShort( bool *ok=0, int base=10 ) const;
     ushort toUShort( bool *ok=0, int base=10 ) const;
     int toInt( bool *ok=0, int base=10 ) const;
     uint toUInt( bool *ok=0, int base=10 ) const;
     long toLong( bool *ok=0, int base=10 ) const;
     ulong toULong( bool *ok=0, int base=10 ) const;
     float toFloat( bool *ok=0 ) const;
     double toDouble( bool *ok=0 ) const;
 
     QString &setNum( short, int base=10 );
     QString &setNum( ushort, int base=10 );
     QString &setNum( int, int base=10 );
     QString &setNum( uint, int base=10 );
     QString &setNum( long, int base=10 );
     QString &setNum( ulong, int base=10 );
     QString &setNum( float, char f='g', int prec=6 );
     QString &setNum( double, char f='g', int prec=6 );
 
     static QString number( long, int base=10 );
     static QString number( ulong, int base=10);
     static QString number( int, int base=10 );
     static QString number( uint, int base=10);
     static QString number( double, char f='g', int prec=6 );
 
     void setExpand( uint index, QChar c );
 
     QString &operator+=( const QString &str );
 
     QString &operator+=( const QByteArray &str );
     QString &operator+=( const char *str );
 
 
 
 
     QString &operator+=( QChar c );
     QString &operator+=( char c );
 
     QChar at( uint i ) const
         { return i < d->len ? d->unicode[i] : QChar::null; }
     QChar operator[]( int i ) const { return at((uint)i); }
     QCharRef at( uint i );
     QCharRef operator[]( int i );
 
     QChar constref(uint i) const
         { return at(i); }
     QChar& ref(uint i)
         {
             if ( d->count != 1 || i >= d->len )
                 subat( i );
             d->setDirty();
             return d->unicode[i];
         }
 
     const QChar* unicode() const { return d->unicode; }
     const char* ascii() const;
     static QString fromAscii(const char*, int len=-1);
     const char* latin1() const;
     static QString fromLatin1(const char*, int len=-1);
     QCString utf8() const;
     static QString fromUtf8(const char*, int len=-1);
     QCString local8Bit() const;
     static QString fromLocal8Bit(const char*, int len=-1);
     bool operator!() const;
 
     operator const char *() const { return ascii(); }
 
 
 
 
 
     static QString fromUcs2( const unsigned short *ucs2 );
     const unsigned short *ucs2() const;
 
     QString &setUnicode( const QChar* unicode, uint len );
     QString &setUnicodeCodes( const ushort* unicode_as_ushorts, uint len );
     QString &setAscii( const char*, int len=-1 );
     QString &setLatin1( const char*, int len=-1 );
 
     int compare( const QString& s ) const;
     static int compare( const QString& s1, const QString& s2 )
     { return s1.compare( s2 ); }
 
     int localeAwareCompare( const QString& s ) const;
     static int localeAwareCompare( const QString& s1, const QString& s2 )
     { return s1.localeAwareCompare( s2 ); }
 
 
     friend QDataStream &operator>>( QDataStream &, QString & );
 
 
     void compose();
 
 
     const char* data() const { return ascii(); }
 
 
     bool startsWith( const QString& ) const;
     bool endsWith( const QString& ) const;
 
     void setLength( uint newLength );
 
     bool simpleText() const { if ( !d->issimpletext ) checkSimpleText(); return (bool)d->issimpletext; }
     bool isRightToLeft() const;
 
 
 private:
     QString( int size, bool );
 
     void deref();
     void real_detach();
     void subat( uint );
     bool findArg(int& pos, int& len) const;
 
     void checkSimpleText() const;
 
     static QChar* latin1ToUnicode( const char*, uint * len, uint maxlen=(uint)-1 );
     static QChar* latin1ToUnicode( const QByteArray&, uint * len );
     static char* unicodeToLatin1( const QChar*, uint len );
 
     QStringData *d;
     static QStringData* shared_null;
     static QStringData* makeSharedNull();
 
     friend class QConstString;
     friend class QTextStream;
     QString( QStringData* dd, bool ) : d(dd) { }
 
 
     void detach();
     friend class QDeepCopy<QString>;
 };
 
 class QCharRef {
     friend class QString;
     QString& s;
     uint p;
     QCharRef(QString* str, uint pos) : s(*str), p(pos) { }
 
 public:
 
 
 
 
     ushort unicode() const { return s.constref(p).unicode(); }
     char latin1() const { return s.constref(p).latin1(); }
 
 
     QCharRef operator=(char c ) { s.ref(p)=c; return *this; }
     QCharRef operator=(uchar c ) { s.ref(p)=c; return *this; }
     QCharRef operator=(QChar c ) { s.ref(p)=c; return *this; }
     QCharRef operator=(const QCharRef& c ) { s.ref(p)=c.unicode(); return *this; }
     QCharRef operator=(ushort rc ) { s.ref(p)=rc; return *this; }
     QCharRef operator=(short rc ) { s.ref(p)=rc; return *this; }
     QCharRef operator=(uint rc ) { s.ref(p)=rc; return *this; }
     QCharRef operator=(int rc ) { s.ref(p)=rc; return *this; }
 
     operator QChar () const { return s.constref(p); }
 
 
     bool isNull() const { return unicode()==0; }
     bool isPrint() const { return s.constref(p).isPrint(); }
     bool isPunct() const { return s.constref(p).isPunct(); }
     bool isSpace() const { return s.constref(p).isSpace(); }
     bool isMark() const { return s.constref(p).isMark(); }
     bool isLetter() const { return s.constref(p).isLetter(); }
     bool isNumber() const { return s.constref(p).isNumber(); }
     bool isLetterOrNumber() { return s.constref(p).isLetterOrNumber(); }
     bool isDigit() const { return s.constref(p).isDigit(); }
 
     int digitValue() const { return s.constref(p).digitValue(); }
     QChar lower() const { return s.constref(p).lower(); }
     QChar upper() const { return s.constref(p).upper(); }
 
     QChar::Category category() const { return s.constref(p).category(); }
     QChar::Direction direction() const { return s.constref(p).direction(); }
     QChar::Joining joining() const { return s.constref(p).joining(); }
     bool mirrored() const { return s.constref(p).mirrored(); }
     QChar mirroredChar() const { return s.constref(p).mirroredChar(); }
     const QString &decomposition() const { return s.constref(p).decomposition(); }
     QChar::Decomposition decompositionTag() const { return s.constref(p).decompositionTag(); }
     unsigned char combiningClass() const { return s.constref(p).combiningClass(); }
 
 
     uchar cell() const { return s.constref(p).cell(); }
     uchar row() const { return s.constref(p).row(); }
 
 };
 
 inline QCharRef QString::at( uint i ) { return QCharRef(this,i); }
 inline QCharRef QString::operator[]( int i ) { return at((uint)i); }
 
 
 class QConstString : private QString {
 public:
     QConstString( const QChar* unicode, uint length );
     ~QConstString();
     const QString& string() const { return *this; }
 };
 
 
 
 
 
 
  QDataStream &operator<<( QDataStream &, const QString & );
  QDataStream &operator>>( QDataStream &, QString & );
 # 761 "/usr/lib/qt3/include/qstring.h"
 inline QString::QString() :
     d(shared_null ? shared_null : makeSharedNull())
 {
     d->ref();
 }
 
 inline QString::~QString()
 {
     if ( d->deref() ) {
         if ( d != shared_null )
             d->deleteSelf();
     }
 }
 
 
 inline void QString::detach()
 { real_detach(); }
 
 inline QString QString::section( QChar sep, int start, int end, int flags ) const
 { return section(QString(sep), start, end, flags); }
 
 inline QString QString::section( char sep, int start, int end, int flags ) const
 { return section(QChar(sep), start, end, flags); }
 
 
 inline QString QString::section( const char *in_sep, int start, int end, int flags ) const
 { return section(QString(in_sep), start, end, flags); }
 
 
 inline QString &QString::operator=( QChar c )
 { *this = QString(c); return *this; }
 
 inline QString &QString::operator=( char c )
 { *this = QString(QChar(c)); return *this; }
 
 inline bool QString::isNull() const
 { return unicode() == 0; }
 
 inline bool QString::operator!() const
 { return isNull(); }
 
 inline uint QString::length() const
 { return d->len; }
 
 inline bool QString::isEmpty() const
 { return length() == 0; }
 
 inline QString QString::copy() const
 { return QString( *this ); }
 
 inline QString &QString::prepend( const QString & s )
 { return insert(0,s); }
 
 inline QString &QString::prepend( QChar c )
 { return insert(0,c); }
 
 inline QString &QString::prepend( char c )
 { return insert(0,c); }
 
 
 inline QString &QString::prepend( const QByteArray & s )
 { return insert(0,s.data()); }
 
 
 
 
 
 
 
 inline QString &QString::append( const QString & s )
 { return operator+=(s); }
 
 
 inline QString &QString::append( const QByteArray &s )
 { return operator+=(s.data()); }
 
 inline QString &QString::append( const char * s )
 { return operator+=(s); }
 
 
 inline QString &QString::append( QChar c )
 { return operator+=(c); }
 
 inline QString &QString::append( char c )
 { return operator+=(c); }
 
 
 inline QString &QString::operator+=( const QByteArray &s )
 { return operator+=(s.data()); }
 # 859 "/usr/lib/qt3/include/qstring.h"
 inline QString &QString::setNum( short n, int base )
 { return setNum((long)n, base); }
 
 inline QString &QString::setNum( ushort n, int base )
 { return setNum((ulong)n, base); }
 
 inline QString &QString::setNum( int n, int base )
 { return setNum((long)n, base); }
 
 inline QString &QString::setNum( uint n, int base )
 { return setNum((ulong)n, base); }
 
 inline QString &QString::setNum( float n, char f, int prec )
 { return setNum((double)n,f,prec); }
 
 inline QString QString::arg(int a, int fieldwidth, int base) const
 { return arg((long)a, fieldwidth, base); }
 
 inline QString QString::arg(uint a, int fieldwidth, int base) const
 { return arg((ulong)a, fieldwidth, base); }
 
 inline QString QString::arg(short a, int fieldwidth, int base) const
 { return arg((long)a, fieldwidth, base); }
 
 inline QString QString::arg(ushort a, int fieldwidth, int base) const
 { return arg((ulong)a, fieldwidth, base); }
 
 inline int QString::find( char c, int index, bool cs ) const
 { return find(QChar(c), index, cs); }
 
 inline int QString::findRev( char c, int index, bool cs) const
 { return findRev( QChar(c), index, cs ); }
 
 
 inline int QString::find( const char* str, int index ) const
 { return find(QString::fromAscii(str), index); }
 
 inline int QString::findRev( const char* str, int index ) const
 { return findRev(QString::fromAscii(str), index); }
 
 
 
 
 
 
 
  bool operator!=( const QString &s1, const QString &s2 );
  bool operator<( const QString &s1, const QString &s2 );
  bool operator<=( const QString &s1, const QString &s2 );
  bool operator==( const QString &s1, const QString &s2 );
  bool operator>( const QString &s1, const QString &s2 );
  bool operator>=( const QString &s1, const QString &s2 );
 
  bool operator!=( const QString &s1, const char *s2 );
  bool operator<( const QString &s1, const char *s2 );
  bool operator<=( const QString &s1, const char *s2 );
  bool operator==( const QString &s1, const char *s2 );
  bool operator>( const QString &s1, const char *s2 );
  bool operator>=( const QString &s1, const char *s2 );
  bool operator!=( const char *s1, const QString &s2 );
  bool operator<( const char *s1, const QString &s2 );
  bool operator<=( const char *s1, const QString &s2 );
  bool operator==( const char *s1, const QString &s2 );
 
  bool operator>=( const char *s1, const QString &s2 );
 
 
  inline const QString operator+( const QString &s1, const QString &s2 )
 {
     QString tmp( s1 );
     tmp += s2;
     return tmp;
 }
 
 
  inline const QString operator+( const QString &s1, const char *s2 )
 {
     QString tmp( s1 );
     tmp += QString::fromAscii(s2);
     return tmp;
 }
 
  inline const QString operator+( const char *s1, const QString &s2 )
 {
     QString tmp = QString::fromAscii( s1 );
     tmp += s2;
     return tmp;
 }
 
 
  inline const QString operator+( const QString &s1, QChar c2 )
 {
     QString tmp( s1 );
     tmp += c2;
     return tmp;
 }
 
  inline const QString operator+( const QString &s1, char c2 )
 {
     QString tmp( s1 );
     tmp += c2;
     return tmp;
 }
 
  inline const QString operator+( QChar c1, const QString &s2 )
 {
     QString tmp;
     tmp += c1;
     tmp += s2;
     return tmp;
 }
 
  inline const QString operator+( char c1, const QString &s2 )
 {
     QString tmp;
     tmp += c1;
     tmp += s2;
     return tmp;
 }
 # 8 "bug.cpp" 2
 
 void tester(QString str) {
 }
 
 int main(int argc, char** argv) {
     QString str("bug");
     while (true) tester("ops: " + str);
 }
 
 --Boundary-00=_VqqX+2CdDYIEEST
 Content-Type: application/octet-stream;
   name="bug.s"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment; filename="bug.s"
 
 	.file	"bug.cpp"
 	.text
 	.align 2
 .globl _Z6tester7QString
 	.type	_Z6tester7QString,@function
 _Z6tester7QString:
 .LFB1:
 	pushl	%ebp
 .LCFI0:
 	movl	%esp, %ebp
 .LCFI1:
 	popl	%ebp
 	ret
 .LFE1:
 .Lfe1:
 	.size	_Z6tester7QString,.Lfe1-_Z6tester7QString
 .globl _Unwind_Resume
 	.section	.rodata
 .LC0:
 	.string	"bug"
 .LC1:
 	.string	"ops: "
 	.text
 	.align 2
 .globl main
 	.type	main,@function
 main:
 .LFB2:
 	pushl	%ebp
 .LCFI2:
 	movl	%esp, %ebp
 .LCFI3:
 	pushl	%ebx
 .LCFI4:
 	subl	$52, %esp
 .LCFI5:
 	andl	$-16, %esp
 	movl	$0, %eax
 	subl	%eax, %esp
 	subl	$8, %esp
 	pushl	$.LC0
 	leal	-24(%ebp), %eax
 	pushl	%eax
 .LEHB0:
 .LCFI6:
 	call	_ZN7QStringC1EPKc
 .LEHE0:
 	addl	$16, %esp
 .L3:
 	leal	-40(%ebp), %edx
 	subl	$4, %esp
 	leal	-24(%ebp), %eax
 	pushl	%eax
 	pushl	$.LC1
 	pushl	%edx
 .LEHB1:
 	call	_ZplPKcRK7QString
 .LEHE1:
 	addl	$12, %esp
 	subl	$12, %esp
 	leal	-40(%ebp), %eax
 	pushl	%eax
 	call	_Z6tester7QString
 	addl	$16, %esp
 	jmp	.L3
 .L10:
 	movl	%eax, -44(%ebp)
 	movl	-44(%ebp), %ebx
 	subl	$12, %esp
 	leal	-24(%ebp), %eax
 	pushl	%eax
 	call	_ZN7QStringD1Ev
 	addl	$16, %esp
 	movl	%ebx, -44(%ebp)
 	subl	$12, %esp
 	pushl	-44(%ebp)
 .LEHB2:
 	call	_Unwind_Resume
 .LEHE2:
 .LFE2:
 .Lfe2:
 	.size	main,.Lfe2-main
 	.section	.gcc_except_table,"aw",@progbits
 .LLSDA2:
 	.byte	0xff
 	.byte	0xff
 	.byte	0x1
 	.uleb128 .LLSDACSE2-.LLSDACSB2
 .LLSDACSB2:
 	.uleb128 .LEHB0-.LFB2
 	.uleb128 .LEHE0-.LEHB0
 	.uleb128 0x0
 	.uleb128 0x0
 	.uleb128 .LEHB1-.LFB2
 	.uleb128 .LEHE1-.LEHB1
 	.uleb128 .L10-.LFB2
 	.uleb128 0x0
 	.uleb128 .LEHB2-.LFB2
 	.uleb128 .LEHE2-.LEHB2
 	.uleb128 0x0
 	.uleb128 0x0
 .LLSDACSE2:
 	.text
 	.section	.gnu.linkonce.t._ZN7QStringD1Ev,"ax",@progbits
 	.align 2
 	.weak	_ZN7QStringD1Ev
 	.type	_ZN7QStringD1Ev,@function
 _ZN7QStringD1Ev:
 .LFB3:
 	pushl	%ebp
 .LCFI7:
 	movl	%esp, %ebp
 .LCFI8:
 	subl	$8, %esp
 .LCFI9:
 	subl	$12, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 .LCFI10:
 	call	_ZN7QShared5derefEv
 	addl	$16, %esp
 	testb	%al, %al
 	je	.L11
 	movl	8(%ebp), %eax
 	movl	(%eax), %eax
 	cmpl	_ZN7QString11shared_nullE, %eax
 	je	.L11
 	subl	$12, %esp
 	movl	8(%ebp), %eax
 	pushl	(%eax)
 	call	_ZN11QStringData10deleteSelfEv
 	addl	$16, %esp
 .L11:
 	leave
 	ret
 .LFE3:
 .Lfe3:
 	.size	_ZN7QStringD1Ev,.Lfe3-_ZN7QStringD1Ev
 	.section	.gnu.linkonce.t._ZplPKcRK7QString,"ax",@progbits
 	.align 2
 	.weak	_ZplPKcRK7QString
 	.type	_ZplPKcRK7QString,@function
 _ZplPKcRK7QString:
 .LFB4:
 	pushl	%ebp
 .LCFI11:
 	movl	%esp, %ebp
 .LCFI12:
 	pushl	%ebx
 .LCFI13:
 	subl	$4, %esp
 .LCFI14:
 	subl	$4, %esp
 	pushl	$-1
 	pushl	12(%ebp)
 	pushl	8(%ebp)
 .LEHB3:
 .LCFI15:
 	call	_ZN7QString9fromAsciiEPKci
 .LEHE3:
 	addl	$12, %esp
 	subl	$8, %esp
 	pushl	16(%ebp)
 	pushl	8(%ebp)
 .LEHB4:
 	call	_ZN7QStringpLERKS_
 .LEHE4:
 	addl	$16, %esp
 	jmp	.L16
 .L21:
 	movl	%eax, -8(%ebp)
 	movl	-8(%ebp), %ebx
 	subl	$12, %esp
 	pushl	8(%ebp)
 	call	_ZN7QStringD1Ev
 	addl	$16, %esp
 	movl	%ebx, -8(%ebp)
 	subl	$12, %esp
 	pushl	-8(%ebp)
 .LEHB5:
 	call	_Unwind_Resume
 .LEHE5:
 .L16:
 	movl	8(%ebp), %eax
 	movl	-4(%ebp), %ebx
 	leave
 	ret	$4
 .LFE4:
 .Lfe4:
 	.size	_ZplPKcRK7QString,.Lfe4-_ZplPKcRK7QString
 	.section	.gcc_except_table
 .LLSDA4:
 	.byte	0xff
 	.byte	0xff
 	.byte	0x1
 	.uleb128 .LLSDACSE4-.LLSDACSB4
 .LLSDACSB4:
 	.uleb128 .LEHB3-.LFB4
 	.uleb128 .LEHE3-.LEHB3
 	.uleb128 0x0
 	.uleb128 0x0
 	.uleb128 .LEHB4-.LFB4
 	.uleb128 .LEHE4-.LEHB4
 	.uleb128 .L21-.LFB4
 	.uleb128 0x0
 	.uleb128 .LEHB5-.LFB4
 	.uleb128 .LEHE5-.LEHB5
 	.uleb128 0x0
 	.uleb128 0x0
 .LLSDACSE4:
 	.section	.gnu.linkonce.t._ZplPKcRK7QString
 	.section	.rodata
 	.type	FALSE,@object
 	.size	FALSE,1
 FALSE:
 	.byte	0
 	.type	TRUE,@object
 	.size	TRUE,1
 TRUE:
 	.byte	1
 	.section	.gnu.linkonce.t._ZN7QShared5derefEv,"ax",@progbits
 	.align 2
 	.weak	_ZN7QShared5derefEv
 	.type	_ZN7QShared5derefEv,@function
 _ZN7QShared5derefEv:
 .LFB5:
 	pushl	%ebp
 .LCFI16:
 	movl	%esp, %ebp
 .LCFI17:
 	movl	8(%ebp), %eax
 	decl	(%eax)
 	cmpl	$0, (%eax)
 	sete	%al
 	andl	$255, %eax
 	popl	%ebp
 	ret
 .LFE5:
 .Lfe5:
 	.size	_ZN7QShared5derefEv,.Lfe5-_ZN7QShared5derefEv
 	.section	.eh_frame,"aw",@progbits
 .Lframe1:
 	.long	.LECIE1-.LSCIE1
 .LSCIE1:
 	.long	0x0
 	.byte	0x1
 	.string	"zPL"
 	.uleb128 0x1
 	.sleb128 -4
 	.byte	0x8
 	.uleb128 0x6
 	.byte	0x0
 	.long	__gxx_personality_v0
 	.byte	0x0
 	.byte	0xc
 	.uleb128 0x4
 	.uleb128 0x4
 	.byte	0x88
 	.uleb128 0x1
 	.align 4
 .LECIE1:
 .LSFDE3:
 	.long	.LEFDE3-.LASFDE3
 .LASFDE3:
 	.long	.LASFDE3-.Lframe1
 	.long	.LFB2
 	.long	.LFE2-.LFB2
 	.uleb128 0x4
 	.long	.LLSDA2
 	.byte	0x4
 	.long	.LCFI2-.LFB2
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI3-.LCFI2
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI5-.LCFI3
 	.byte	0x83
 	.uleb128 0x3
 	.byte	0x4
 	.long	.LCFI6-.LCFI5
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE3:
 .LSFDE5:
 	.long	.LEFDE5-.LASFDE5
 .LASFDE5:
 	.long	.LASFDE5-.Lframe1
 	.long	.LFB3
 	.long	.LFE3-.LFB3
 	.uleb128 0x4
 	.long	0x0
 	.byte	0x4
 	.long	.LCFI7-.LFB3
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI8-.LCFI7
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI10-.LCFI8
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE5:
 .LSFDE7:
 	.long	.LEFDE7-.LASFDE7
 .LASFDE7:
 	.long	.LASFDE7-.Lframe1
 	.long	.LFB4
 	.long	.LFE4-.LFB4
 	.uleb128 0x4
 	.long	.LLSDA4
 	.byte	0x4
 	.long	.LCFI11-.LFB4
 	.byte	0xe
 	.uleb128 0x8
 	.byte	0x85
 	.uleb128 0x2
 	.byte	0x4
 	.long	.LCFI12-.LCFI11
 	.byte	0xd
 	.uleb128 0x5
 	.byte	0x4
 	.long	.LCFI14-.LCFI12
 	.byte	0x83
 	.uleb128 0x3
 	.byte	0x4
 	.long	.LCFI15-.LCFI14
 	.byte	0x2e
 	.uleb128 0x10
 	.align 4
 .LEFDE7:
 	.ident	"GCC: (GNU) 3.2"
 
 --Boundary-00=_VqqX+2CdDYIEEST--
 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: c++/9872: temporary destructor not called?
@ 2003-02-27 15:32 bangerth
  0 siblings, 0 replies; 6+ messages in thread
From: bangerth @ 2003-02-27 15:32 UTC (permalink / raw)
  To: gcc-bugs, gcc-prs, nobody, sakovacs

Synopsis: temporary destructor not called?

State-Changed-From-To: open->feedback
State-Changed-By: bangerth
State-Changed-When: Thu Feb 27 15:32:14 2003
State-Changed-Why:
    We need the _preprocessed_ source to reproduce the problem.
    Please take a look at
      http://gcc.gnu.org/bugs.html
    
    Thanks
      Wolfgang

http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=9872


^ permalink raw reply	[flat|nested] 6+ messages in thread

* c++/9872: temporary destructor not called?
@ 2003-02-27  4:56 sakovacs
  0 siblings, 0 replies; 6+ messages in thread
From: sakovacs @ 2003-02-27  4:56 UTC (permalink / raw)
  To: gcc-gnats


>Number:         9872
>Category:       c++
>Synopsis:       temporary destructor not called?
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          wrong-code
>Submitter-Id:   net
>Arrival-Date:   Thu Feb 27 04:56:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator:     Sandor Kovacs
>Release:        gcc 3.2
>Organization:
>Environment:
intel linux suse 8.1, kernel 2.4.20-ck2, qt 3.1
>Description:

Temporary object is not properly destructed (see test prg. below which eats the memory up):

#include <qstring.h>

void tester(QString str) {
}

int main(int argc, char** argv) {
    QString str("bug");
    while (true) tester("ops: " + str);
}

Compiled as:

gcc -I/usr/lib/qt3/include -c bug.cpp
gcc -L/usr/lib/qt3/lib -lqt-mt bug.o -o bug

If you specify -fno-elide-constructors it works properly (that's why I believe it is not a qt-bug)

There was already a fix for this/similar bug hopefully I'm not reporting it twice (couldn't find this bug on the bug list), see 
http://sources.redhat.com/ml/cygwin/2001-10/msg00467.html.

If you think it is a QT bug please let me know and in this case I'll drop Trolltech a line.

Thanks: Sandor
>How-To-Repeat:
compile, run the sample program
>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: text/x-c++src; name="bug.cpp"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="bug.cpp"

LyoqCiAqIENvbXBpbGU6CiAqIGdjYyAtSS91c3IvbGliL3F0My9pbmNsdWRlIC1jIGJ1Zy5jcHAK
ICogZ2NjIC1ML3Vzci9saWIvcXQzL2xpYiAtbHF0LW10IGJ1Zy5vIC1vIGJ1ZwogKi8KCiNpbmNs
dWRlIDxxc3RyaW5nLmg+Cgp2b2lkIHRlc3RlcihRU3RyaW5nIHN0cikgewp9CgppbnQgbWFpbihp
bnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICAgIFFTdHJpbmcgc3RyKCJidWciKTsKICAgIHdoaWxl
ICh0cnVlKSB0ZXN0ZXIoIm9wczogIiArIHN0cik7Cn0K


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2003-02-28  2:06 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-02-28  1:56 c++/9872: temporary destructor not called? Sandor Kovacs
  -- strict thread matches above, loose matches on Subject: below --
2003-02-28  2:06 Sandor Kovacs
2003-02-28  0:36 Wolfgang Bangerth
2003-02-28  0:26 Sandor Kovacs
2003-02-27 15:32 bangerth
2003-02-27  4:56 sakovacs

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).