X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org To: cygwin AT cygwin DOT com From: Lewis Hyatt Subject: Re: BUG REPORT: Cygwin, g++, -O2, static member function, std::string Date: Wed, 24 Oct 2007 15:25:03 -0400 Lines: 27 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit User-Agent: Thunderbird 2.0.0.6 (Windows/20070728) In-Reply-To: X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com > Can you post the bug{1,2}.cpp files? I would guess that its not a bug, > but rather you are relying on an undefined order of static > initialization that happens to do what you want sometimes but not > others. It's impossible to say for sure without seeing the source files, > though. Oh I see, you did attach them, in the shell script. So the issue is that you are declaring a local static variable in an inline function, which is then referenced in multiple translation units. As far as I can remember, this is supposed to work OK, but I know a lot of compilers, not just gcc, get it wrong, because the standard is different than the ARM on this point. The bug was probably fixed in gcc 4.0, which is not yet available on cygwin. (You can verify that a lot of things will change this behavior, for instance if you just add a default constructor to Element() with an empty body, your example will work as you expect.) Anyway, for portability, you are probably better off not relying on any compiler getting this right, and you should just define the root() function non-inline in its own translation unit. That being said, gcc is clearly messing up here, as you would expect its most likely failure to be generating multiple copies of the static variable, not too few. This isn't really cygwin-specific, you will get the same thing if you use the native windows MinGW compiler (ie, by using g++ -mno-cygwin). You're probably better off asking around in comp.lang.c++, comp.std.c++, or a gcc-specific mailing list, as those people will know more. -Lewis -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/