From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30495 invoked by alias); 8 May 2012 00:17:04 -0000 Received: (qmail 30475 invoked by uid 22791); 8 May 2012 00:17:02 -0000 X-SWARE-Spam-Status: No, hits=-4.3 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00,KHOP_THREADED,TW_DX X-Spam-Check-By: sourceware.org Received: from localhost (HELO gcc.gnu.org) (127.0.0.1) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 08 May 2012 00:16:49 +0000 From: "xinliangli at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/53220] [4.7/4.8 Regression] g++ mis-compiles compound literals Date: Tue, 08 May 2012 00:34:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Keywords: wrong-code X-Bugzilla-Severity: normal X-Bugzilla-Who: xinliangli at gmail dot com X-Bugzilla-Status: NEW X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: 4.8.0 X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2012-05/txt/msg00841.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53220 --- Comment #9 from davidxl 2012-05-08 00:16:30 UTC --- c++11 defines the lifetime of a temporary -- does it match C or g++'s semantics of compound literals or neither? Note that without your change, the original program may also be subject to runtime failures due to escaped life ranges of the scoped variables leading to bad stack layout -- though such bugs are more subtle and less likely to be triggered. David (In reply to comment #8) > The thing is, C++11 introduces list-initialized temporaries; I could rewrite > the testcase in C++11 as > > extern "C" int printf (const char *, ...); > > int main() > { > typedef int AR[4]; > for (int *p = AR{1,2,3,0}; *p; ++p) > { > printf ("%d\n", *p); > } > return 0; > } > > so it made sense to me for compound literals to have the same semantics; > otherwise you have a difference in lifetime based on whether or not the type is > wrapped in parentheses. > > I definitely agree that we need to give a diagnostic about taking the address > of a temporary here.