From patchwork Thu Dec 6 14:36:16 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 204251 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 7AE5F2C0253 for ; Fri, 7 Dec 2012 01:36:27 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1355409388; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:Subject: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=6Gv/dgm l6m/tW9PFUXRwMGeSXE0=; b=YTnKk7TidNBePINiavOadBrREwaSHlXG180FOHW Zb0vuNA95QioOSJJJzwXvs62c2mQitV9sUv1E6Kjq510I/Fs789OIt+nfdh60w6l gLJcv63UF0dqQSd+kGr8KpjV8mkSL9sa3ymFrgVf8FhEacyHR8aQuALeLsbe93KX yY/w= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=gUilX/O5Q+GiREgA3ftvCJnH7HeONMtm86ddTM4Fzpblc8ORlRyIB6GdgoRpW6 KuIkr0VNa2Gb2oynMTVqXYptIDOPOjsQPuuZDAfbrFJL+0aZAbMDwpXxCnHpwS18 za9d//gY5zU1BZolKrY9YfBXK0tC5MoXTlv56eh4u0cTo=; Received: (qmail 2774 invoked by alias); 6 Dec 2012 14:36:22 -0000 Received: (qmail 2699 invoked by uid 22791); 6 Dec 2012 14:36:21 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_SPAMHAUS_DROP, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 06 Dec 2012 14:36:18 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qB6EaHS5017472 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 6 Dec 2012 09:36:17 -0500 Received: from [10.3.113.18] ([10.3.113.18]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id qB6EaHN8030368 for ; Thu, 6 Dec 2012 09:36:17 -0500 Message-ID: <50C0AD60.5050301@redhat.com> Date: Thu, 06 Dec 2012 09:36:16 -0500 From: Jason Merrill User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: gcc-patches List Subject: C++ PATCH for c++/54947 (wrong error with lambda in init-list) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org When we're parsing tentatively, we shouldn't do something, like requiring a constant-expression, that will produce an error. This patch delays checking whether the expression is constant until we know that we're actually looking at a designator. Tested x86_64-pc-linux-gnu, applying to trunk. commit 77da076687dac5f406f4e929497a8b7b747d287a Author: Jason Merrill Date: Wed Dec 5 17:47:52 2012 -0500 PR c++/54947 * parser.c (cp_parser_initializer_list): Don't require an expression in [] to be constant until we know it's a C99 designator. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 190b8d9..a010f1f 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -17923,11 +17923,14 @@ cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p) /* In C++11, [ could start a lambda-introducer. */ cp_parser_parse_tentatively (parser); cp_lexer_consume_token (parser->lexer); - designator = cp_parser_constant_expression (parser, false, NULL); + bool non_const = false; + designator = cp_parser_constant_expression (parser, true, &non_const); cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE); cp_parser_require (parser, CPP_EQ, RT_EQ); if (!cp_parser_parse_definitely (parser)) designator = NULL_TREE; + else if (non_const) + require_potential_rvalue_constant_expression (designator); } else designator = NULL_TREE; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C new file mode 100644 index 0000000..daaa339 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist2.C @@ -0,0 +1,27 @@ +// PR c++/54947 +// { dg-options -std=gnu++11 } + +struct X +{ + template + X(L) + { } +}; + +template + void + test() + { + int i = 0; + + A a_ok_1( [=] { return i; } ); // OK + A a_ok_2( [i] { return i; } ); // OK + + A a_err_1{ [i] { return i; } }; // error + A a_err_2{ [=] { return i; } }; // error + } + +int main() +{ + test(); +}