From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 119153 invoked by alias); 27 Feb 2018 09:50:00 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 118965 invoked by uid 89); 27 Feb 2018 09:49:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-12.3 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_LOW,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx3-rdu2.redhat.com (HELO mx1.redhat.com) (66.187.233.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 27 Feb 2018 09:49:43 +0000 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4E9F97D845 for ; Tue, 27 Feb 2018 09:49:31 +0000 (UTC) Received: from tucnak.zalov.cz (ovpn-204-85.brq.redhat.com [10.40.204.85]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EAF352024CA2 for ; Tue, 27 Feb 2018 09:49:30 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.15.2/8.15.2) with ESMTP id w1QJvkbY019760; Mon, 26 Feb 2018 20:57:47 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.15.2/8.15.2/Submit) id w1QJvjeX019759; Mon, 26 Feb 2018 20:57:45 +0100 Date: Tue, 27 Feb 2018 09:50:00 -0000 From: Jakub Jelinek To: Jason Merrill , Nathan Sidwell Cc: gcc-patches@gcc.gnu.org Subject: [C++ PATCH] Fix ICE in cxx_eval_vec_init_1 (PR c++/84558) Message-ID: <20180226195745.GY5867@tucnak> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.9.1 (2017-09-22) X-IsSubscribed: yes X-SW-Source: 2018-02/txt/msg01485.txt.bz2 Hi! The PR70001 optimization in cxx_eval_vec_init_1 uses initializer_constant_valid_p (eltinit, TREE_TYPE (eltinit)) which doesn't work if eltinit is NULL. This can happen if *non_constant_p is true, but ctx->quiet is true as well (for *non_constant_p && !ctx->quiet we break the cycle early). No initializer can be treated like a valid initializer and will have the advantage that we don't repeat the body for every array element and just do it once. The caller will ignore the return value anyway when *non_constant_p. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2018-02-26 Jakub Jelinek PR c++/84558 * constexpr.c (cxx_eval_vec_init_1): For reuse, treat NULL eltinit like a valid constant initializer. Formatting fixes. * g++.dg/cpp1y/pr84558.C: New test. --- gcc/cp/constexpr.c.jj 2018-02-26 10:46:02.162316172 +0100 +++ gcc/cp/constexpr.c 2018-02-26 14:07:38.705532369 +0100 @@ -2959,9 +2959,8 @@ cxx_eval_vec_init_1 (const constexpr_ctx if (!lvalue_p (init)) eltinit = move (eltinit); eltinit = force_rvalue (eltinit, tf_warning_or_error); - eltinit = (cxx_eval_constant_expression - (&new_ctx, eltinit, lval, - non_constant_p, overflow_p)); + eltinit = cxx_eval_constant_expression (&new_ctx, eltinit, lval, + non_constant_p, overflow_p); } if (*non_constant_p && !ctx->quiet) break; @@ -2974,12 +2973,13 @@ cxx_eval_vec_init_1 (const constexpr_ctx else CONSTRUCTOR_APPEND_ELT (*p, idx, eltinit); /* Reuse the result of cxx_eval_constant_expression call - from the first iteration to all others if it is a constant - initializer that doesn't require relocations. */ + from the first iteration to all others if it is a constant + initializer that doesn't require relocations. */ if (reuse && max > 1 - && (initializer_constant_valid_p (eltinit, TREE_TYPE (eltinit)) - == null_pointer_node)) + && (eltinit == NULL_TREE + || (initializer_constant_valid_p (eltinit, TREE_TYPE (eltinit)) + == null_pointer_node))) { if (new_ctx.ctor != ctx->ctor) eltinit = new_ctx.ctor; --- gcc/testsuite/g++.dg/cpp1y/pr84558.C.jj 2018-02-26 14:33:56.575318295 +0100 +++ gcc/testsuite/g++.dg/cpp1y/pr84558.C 2018-02-26 14:33:33.142318527 +0100 @@ -0,0 +1,6 @@ +// PR c++/84558 +// { dg-do compile { target c++14 } } + +struct A { static int i; constexpr A () { i = 0; } }; +struct B { A a[2][3][4]; }; +B b; Jakub