From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7812 invoked by alias); 13 Jun 2011 11:19:42 -0000 Received: (qmail 7803 invoked by uid 22791); 13 Jun 2011 11:19:41 -0000 X-SWARE-Spam-Status: No, hits=-2.7 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 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; Mon, 13 Jun 2011 11:19:28 +0000 From: "daniel.kruegler at googlemail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/49389] New: [C++0x] Wrong value category for pointer-to-member expression with rvalue object expression X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: daniel.kruegler at googlemail dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Changed-Fields: Message-ID: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 Date: Mon, 13 Jun 2011 11:19:00 -0000 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: 2011-06/txt/msg01099.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49389 Summary: [C++0x] Wrong value category for pointer-to-member expression with rvalue object expression Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned@gcc.gnu.org ReportedBy: daniel.kruegler@googlemail.com CC: jason@redhat.com gcc 4.7.0 20110611 (experimental) in C++0x mode rejects the following program at the line marked with #: //---- template T&& val(); struct A {}; typedef decltype(val().*val()) type; template struct assert_type; template<> struct assert_type {}; assert_type test; // # //---- "error: aggregate 'assert_type test' has incomplete type and cannot be defined" Further testing reveals that the deduced type is 'int&' instead of 'int&&'. According to my reading of 5.5 [expr.mptr.oper] p6: "The result of a .* expression whose second operand is a pointer to a data member is of the same value category (3.10) as its first operand." we have an xvalue expression val() as the first operand, which should result in an xvalue expression category for the complete pointer-to-member expression. Referring to 7.1.6.2 [dcl.type.simple] p4, we should fall into bullet 2: "otherwise, if e is an xvalue, decltype(e) is T&&, where T is the type of e;" which should have the effect of returning int&&, not int&. Therefore gcc should accept this program.