From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12716 invoked by alias); 15 Dec 2016 19:37:43 -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 12706 invoked by uid 89); 15 Dec 2016 19:37:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 spammy= X-HELO: mail-wm0-f47.google.com Received: from mail-wm0-f47.google.com (HELO mail-wm0-f47.google.com) (74.125.82.47) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 15 Dec 2016 19:37:41 +0000 Received: by mail-wm0-f47.google.com with SMTP id t79so666147wmt.0 for ; Thu, 15 Dec 2016 11:37:40 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=UFW6MLuowb341B05lTkFr6YhTtUFhorj+GWBimn+P38=; b=D+PYpzk5rldIklFkcBlfg++4hIhVqexwmQjSqkZec5TwXDgqbRzWW4RAwYCmZzp664 N5JLxleNR+/FWe21M9cEBJrZqsXzM/axKmzaBtn60S2CLBjA4dZV7KHoslZyoDOYQvPO PeUOlnB4YNmEsmwrx5aC3Ak2uorNGvOr3qvNcotMHnG0X8XbJV4IlKXUM7R7+TuRJATu 027/PVdSr6IP5rf/YAOfbkD16XzC3MeesuSl245OZAb/QARK30kASwpfzTWbTOtPKBJo Sf2xW/LLGVmmIqrid46zyZ2yRB4bzWcc8Rn2NEKbyqlL8WOBQDbsXLL0c5uIgdCfaaaE UAXw== X-Gm-Message-State: AIkVDXJlEuZc7ZGsRYX6GIBW3R0D77CGITYYEU0v0XBTx5uT+3El6opDQvrfF/sxt4HPs9W8sNCXkCp7wsNruTFx X-Received: by 10.28.158.147 with SMTP id h141mr3098066wme.59.1481830659168; Thu, 15 Dec 2016 11:37:39 -0800 (PST) MIME-Version: 1.0 Received: by 10.194.98.201 with HTTP; Thu, 15 Dec 2016 11:37:18 -0800 (PST) In-Reply-To: <20161215164447.GK21933@tucnak> References: <20161215083414.GB21933@tucnak> <45d11afa-ead4-e605-ae04-9c4b8731289d@acm.org> <20161215122614.GG21933@tucnak> <20161215164447.GK21933@tucnak> From: Jason Merrill Date: Thu, 15 Dec 2016 19:39:00 -0000 Message-ID: Subject: Re: [C++ PATCH] P0490R0 GB 20: decomposition declaration should commit to tuple interpretation early (take 2) To: Jakub Jelinek Cc: Nathan Sidwell , gcc-patches List Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2016-12/txt/msg01414.txt.bz2 OK. On Thu, Dec 15, 2016 at 11:44 AM, Jakub Jelinek wrote: > 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