From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 110558 invoked by alias); 15 Dec 2016 16:44:55 -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 110549 invoked by uid 89); 15 Dec 2016 16:44:55 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-5.0 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=horribly, H*i:sk:d80e5b0, H*MI:sk:d80e5b0, H*f:sk:d80e5b0 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; Thu, 15 Dec 2016 16:44:53 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AC3942E6CF3; Thu, 15 Dec 2016 16:44:52 +0000 (UTC) Received: from tucnak.zalov.cz (ovpn-116-54.ams2.redhat.com [10.36.116.54]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id uBFGiota004051 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 15 Dec 2016 11:44:51 -0500 Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.15.2/8.15.2) with ESMTP id uBFGim0w021987; Thu, 15 Dec 2016 17:44:48 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.15.2/8.15.2/Submit) id uBFGilFp021986; Thu, 15 Dec 2016 17:44:47 +0100 Date: Thu, 15 Dec 2016 16:51:00 -0000 From: Jakub Jelinek To: Nathan Sidwell , Jason Merrill Cc: gcc-patches@gcc.gnu.org Subject: [C++ PATCH] P0490R0 GB 20: decomposition declaration should commit to tuple interpretation early (take 2) Message-ID: <20161215164447.GK21933@tucnak> Reply-To: Jakub Jelinek References: <20161215083414.GB21933@tucnak> <45d11afa-ead4-e605-ae04-9c4b8731289d@acm.org> <20161215122614.GG21933@tucnak> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.1 (2016-10-04) X-IsSubscribed: yes X-SW-Source: 2016-12/txt/msg01404.txt.bz2 On Thu, Dec 15, 2016 at 07:40:58AM -0500, Nathan Sidwell wrote: > On 12/15/2016 07:26 AM, Jakub Jelinek wrote: > > > I don't think so. complete_type (error_mark_node) returns error_mark_node, > > and COMPLETE_TYPE_P (error_mark_node) is invalid (should fail TYPE_CHECK in > > checking compiler). > > > > I can write it as > > inst = complete_type (inst); > > if (inst == error_mark_node || !COMPLETE_TYPE_P (inst)) > > return NULL_TREE; > > that's probably better, because complete_type can return error_mark_node if > 'something goes horribly wrong' Ok, here is the updated patch (and also moving the diagnostics to get_tuple_size caller as written in the other mail as an option), bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-12-15 Jakub Jelinek P0490R0 GB 20: decomposition declaration should commit to tuple interpretation early * decl.c (get_tuple_size): Make static. If inst is error_mark_node or non-complete type, return NULL_TREE, otherwise if lookup_qualified_name fails or doesn't fold into INTEGER_CST, return error_mark_node. (get_tuple_element_type, get_tuple_decomp_init): Make static. (cp_finish_decomp): Pass LOC to get_tuple_size. If it returns error_mark_node, complain and fail. * g++.dg/cpp1z/decomp10.C (f1): Adjust expected diagnostics. --- gcc/cp/decl.c.jj 2016-12-08 23:17:57.256167066 +0100 +++ gcc/cp/decl.c 2016-12-15 13:48:48.087424991 +0100 @@ -7259,7 +7259,7 @@ find_decomp_class_base (location_t loc, /* Return std::tuple_size::value. */ -tree +static tree get_tuple_size (tree type) { tree args = make_tree_vec (1); @@ -7268,6 +7268,9 @@ get_tuple_size (tree type) /*in_decl*/NULL_TREE, /*context*/std_node, /*entering_scope*/false, tf_none); + inst = complete_type (inst); + if (inst == error_mark_node || !COMPLETE_TYPE_P (inst)) + return NULL_TREE; tree val = lookup_qualified_name (inst, get_identifier ("value"), /*type*/false, /*complain*/false); if (TREE_CODE (val) == VAR_DECL || TREE_CODE (val) == CONST_DECL) @@ -7275,12 +7278,12 @@ get_tuple_size (tree type) if (TREE_CODE (val) == INTEGER_CST) return val; else - return NULL_TREE; + return error_mark_node; } /* Return std::tuple_element::type. */ -tree +static tree get_tuple_element_type (tree type, unsigned i) { tree args = make_tree_vec (2); @@ -7297,7 +7302,7 @@ get_tuple_element_type (tree type, unsig /* Return e.get() or get(e). */ -tree +static tree get_tuple_decomp_init (tree decl, unsigned i) { tree get_id = get_identifier ("get"); @@ -7342,6 +7347,7 @@ store_decomp_type (tree v, tree t) decomp_type_table = hash_map::create_ggc (13); decomp_type_table->put (v, t); } + tree lookup_decomp_type (tree v) { @@ -7502,6 +7508,12 @@ cp_finish_decomp (tree decl, tree first, } else if (tree tsize = get_tuple_size (type)) { + if (tsize == error_mark_node) + { + error_at (loc, "%::value%> is not an integral " + "constant expression", type); + goto error_out; + } eltscnt = tree_to_uhwi (tsize); if (count != eltscnt) goto cnt_mismatch; --- gcc/testsuite/g++.dg/cpp1z/decomp10.C.jj 2016-12-08 23:17:57.477164261 +0100 +++ gcc/testsuite/g++.dg/cpp1z/decomp10.C 2016-12-15 13:47:47.288240503 +0100 @@ -7,7 +7,7 @@ namespace std { struct A1 { int i,j; } a1; template<> struct std::tuple_size { }; -void f1() { auto [ x ] = a1; } // { dg-error "decomposes into 2" } +void f1() { auto [ x ] = a1; } // { dg-error "is not an integral constant expression" } struct A2 { int i,j; } a2; template<> struct std::tuple_size { enum { value = 5 }; }; Jakub