From patchwork Tue Jun 3 04:29:39 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 355166 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 78A2D14008F for ; Tue, 3 Jun 2014 14:29:53 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:content-type; q= dns; s=default; b=NDHAQmXcbHX2SnARLc4wPQxDe486VqGjGAZ0DqSqjzBhfP cvbJreGLrPYvCOWOlnFsSFtVavvRLyPQuyaf4c4seShAWDEQPR2tIghTKdnncQV6 YBR88A9HKbzyv2GeZIzRTTyoF0DTxOl3hNI2mzbsIUwlZlIBbdWs0jB2VHwYg= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:content-type; s= default; bh=dWetsHtuJr9bfsCBgqtB+omn9Jo=; b=fsOOmFKmoD1xAl/VhixS elVjRNX4UdyFXD7XHxkDcezhoAdX9UehqJUR3mK+iHsRJPubgiRSrgDopXKH4rb2 J5jSXi8NxWe0Ue7XKP2Nr/kJeCg8903VYXaz8IvoDLxXWmwAlyaVHtX5PHHPlo5S 4keKZpdHHUqyi/NQMmZYIO4= Received: (qmail 30938 invoked by alias); 3 Jun 2014 04:29:45 -0000 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 Received: (qmail 30924 invoked by uid 89); 3 Jun 2014 04:29:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.2 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 03 Jun 2014 04:29:41 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s534TetO003451 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 3 Jun 2014 00:29:40 -0400 Received: from [10.10.116.18] ([10.10.116.18]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s534Td7G001818 for ; Tue, 3 Jun 2014 00:29:40 -0400 Message-ID: <538D4F33.6060909@redhat.com> Date: Tue, 03 Jun 2014 00:29:39 -0400 From: Jason Merrill User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: gcc-patches List Subject: C++ PATCH for c++/61046 (ICE with invalid designated initializer) The code in reshape_init_class shouldn't assume that anything not an INTEGER_CST or FIELD_DECL is an IDENTIFIER_NODE. Tested x86_64-pc-linux-gnu, applying to trunk. commit 6a71aad5b83d18f742ee208dd249c7759e5cccb3 Author: Jason Merrill Date: Mon Jun 2 21:51:08 2014 -0400 PR c++/61046 * decl.c (reshape_init_class): Handle un-folded constant-expressions. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c61ad68..8dc5f1f 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5294,19 +5294,18 @@ reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p, if (d->cur->index == error_mark_node) return error_mark_node; - if (TREE_CODE (d->cur->index) == INTEGER_CST) - { - if (complain & tf_error) - error ("%<[%E] =%> used in a GNU-style designated initializer" - " for class %qT", d->cur->index, type); - return error_mark_node; - } - if (TREE_CODE (d->cur->index) == FIELD_DECL) /* We already reshaped this. */ gcc_assert (d->cur->index == field); - else + else if (TREE_CODE (d->cur->index) == IDENTIFIER_NODE) field = lookup_field_1 (type, d->cur->index, /*want_type=*/false); + else + { + if (complain & tf_error) + error ("%<[%E] =%> used in a GNU-style designated initializer" + " for class %qT", d->cur->index, type); + return error_mark_node; + } if (!field || TREE_CODE (field) != FIELD_DECL) { diff --git a/gcc/testsuite/g++.dg/ext/desig7.C b/gcc/testsuite/g++.dg/ext/desig7.C new file mode 100644 index 0000000..44358ec --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/desig7.C @@ -0,0 +1,8 @@ +// PR c++/61046 + +struct A +{ + int ary[4]; +}; +const int i = 0; +A bar = { [i] = 0 }; // { dg-error "designated" }