From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32125 invoked by alias); 23 Jan 2019 14:00:49 -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 30890 invoked by uid 89); 23 Jan 2019 14:00:49 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,KAM_NUMSUBJECT,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt1-f181.google.com Received: from mail-qt1-f181.google.com (HELO mail-qt1-f181.google.com) (209.85.160.181) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 23 Jan 2019 14:00:45 +0000 Received: by mail-qt1-f181.google.com with SMTP id e5so2352525qtr.12 for ; Wed, 23 Jan 2019 06:00:45 -0800 (PST) Return-Path: Received: from [192.168.1.115] (209-6-216-142.s141.c3-0.smr-cbr1.sbo-smr.ma.cable.rcncustomer.com. [209.6.216.142]) by smtp.gmail.com with ESMTPSA id y12sm85022115qta.13.2019.01.23.06.00.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Jan 2019 06:00:43 -0800 (PST) Subject: Re: C++ PATCH for c++/78244 - narrowing conversion in template not detected, part 2 To: Marek Polacek Cc: GCC Patches References: <20190117190921.GM19569@redhat.com> <4958169a-e8c8-4ca0-6f99-ce360b4834d5@redhat.com> <20190118141207.GN19569@redhat.com> <20190122211021.GC26714@redhat.com> From: Jason Merrill Message-ID: <33c9ff91-1aff-d328-7349-767b196eaecf@redhat.com> Date: Wed, 23 Jan 2019 14:01:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.1 MIME-Version: 1.0 In-Reply-To: <20190122211021.GC26714@redhat.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2019-01/txt/msg01371.txt.bz2 On 1/22/19 4:10 PM, Marek Polacek wrote: > On Mon, Jan 21, 2019 at 03:14:53PM -0500, Jason Merrill wrote: >> On 1/18/19 9:12 AM, Marek Polacek wrote: >>> On Thu, Jan 17, 2019 at 04:17:29PM -0500, Jason Merrill wrote: >>>> On 1/17/19 2:09 PM, Marek Polacek wrote: >>>>> This patch ought to fix the rest of 78244, a missing narrowing warning in >>>>> decltype. >>>>> >>>>> As I explained in Bugzilla, there can be three scenarios: >>>>> >>>>> 1) decltype is in a template and it has no dependent expressions, which >>>>> is the problematical case. finish_compound_literal just returns the >>>>> compound literal without checking narrowing if processing_template_decl. >>>> >>>> This is the sort of thing that we've been gradually fixing: if the compound >>>> literal isn't dependent at all, we want to do the normal processing. And >>>> then usually return a result based on the original trees rather than the >>>> result of processing. For instance, finish_call_expr. Something like that >>>> ought to work here, too, and be more generally applicable; this shouldn't be >>>> limited to casting to a scalar type, casting to a known class type can also >>>> involve narrowing. >>> >>> Great, that works just fine. I also had to check if the type is >>> type-dependent, otherwise complete_type could fail. >>> >>>> The check in the other patch that changes instantiation_dependent_r should >>>> be more similar to the one in finish_compound_literal. Or perhaps you could >>>> set a flag here in finish_compound_literal to indicate that it's >>>> instantiation-dependent, and just check that in instantiation_dependent_r. >>> >>> Done, but I feel bad about adding another flag. But I guess it's cheaper >>> this way. Thanks! >>> >>> Bootstrapped/regtested on x86_64-linux, ok for trunk? >>> >>> 2019-01-18 Marek Polacek >>> >>> PR c++/88815 - narrowing conversion lost in decltype. >>> PR c++/78244 - narrowing conversion in template not detected. >>> * cp-tree.h (CONSTRUCTOR_IS_DEPENDENT): New. >>> * pt.c (instantiation_dependent_r): Consider a CONSTRUCTOR with >>> CONSTRUCTOR_IS_DEPENDENT instantiation-dependent. >>> * semantics.c (finish_compound_literal): When the compound literal >>> isn't instantiation-dependent and the type isn't type-dependent, >>> fall back to the normal processing. Don't only call check_narrowing >>> for scalar types. Set CONSTRUCTOR_IS_DEPENDENT. >>> >>> * g++.dg/cpp0x/Wnarrowing15.C: New test. >>> * g++.dg/cpp0x/constexpr-decltype3.C: New test. >>> * g++.dg/cpp1y/Wnarrowing1.C: New test. >>> >>> diff --git gcc/cp/cp-tree.h gcc/cp/cp-tree.h >>> index 5cc8f88d522..778874cccd6 100644 >>> --- gcc/cp/cp-tree.h >>> +++ gcc/cp/cp-tree.h >>> @@ -424,6 +424,7 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX]; >>> DECL_FINAL_P (in FUNCTION_DECL) >>> QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF) >>> DECLTYPE_FOR_INIT_CAPTURE (in DECLTYPE_TYPE) >>> + CONSTRUCTOR_IS_DEPENDENT (in CONSTRUCTOR) >>> TINFO_USED_TEMPLATE_ID (in TEMPLATE_INFO) >>> PACK_EXPANSION_SIZEOF_P (in *_PACK_EXPANSION) >>> OVL_USING_P (in OVERLOAD) >>> @@ -4202,6 +4203,11 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) >>> B b{1,2}, not B b({1,2}) or B b = {1,2}. */ >>> #define CONSTRUCTOR_IS_DIRECT_INIT(NODE) (TREE_LANG_FLAG_0 (CONSTRUCTOR_CHECK (NODE))) >>> +/* True if this CONSTRUCTOR is instantiation-dependent and needs to be >>> + substituted. */ >>> +#define CONSTRUCTOR_IS_DEPENDENT(NODE) \ >>> + (TREE_LANG_FLAG_1 (CONSTRUCTOR_CHECK (NODE))) >>> + >>> /* True if this CONSTRUCTOR should not be used as a variable initializer >>> because it was loaded from a constexpr variable with mutable fields. */ >>> #define CONSTRUCTOR_MUTABLE_POISON(NODE) \ >>> diff --git gcc/cp/pt.c gcc/cp/pt.c >>> index e4f76478f54..ae77bae6b29 100644 >>> --- gcc/cp/pt.c >>> +++ gcc/cp/pt.c >>> @@ -25800,6 +25800,11 @@ instantiation_dependent_r (tree *tp, int *walk_subtrees, >>> return *tp; >>> break; >>> + case CONSTRUCTOR: >>> + if (CONSTRUCTOR_IS_DEPENDENT (*tp)) >>> + return *tp; >>> + break; >>> + >>> default: >>> break; >>> } >>> diff --git gcc/cp/semantics.c gcc/cp/semantics.c >>> index e654750d249..4ff09ad3fb7 100644 >>> --- gcc/cp/semantics.c >>> +++ gcc/cp/semantics.c >>> @@ -2795,11 +2795,14 @@ finish_compound_literal (tree type, tree compound_literal, >>> return error_mark_node; >>> } >>> - if (processing_template_decl) >>> + if (instantiation_dependent_expression_p (compound_literal) >>> + || dependent_type_p (type)) >>> { >>> TREE_TYPE (compound_literal) = type; >>> /* Mark the expression as a compound literal. */ >>> TREE_HAS_CONSTRUCTOR (compound_literal) = 1; >>> + /* And as instantiation-dependent. */ >>> + CONSTRUCTOR_IS_DEPENDENT (compound_literal) = true; >>> if (fcl_context == fcl_c99) >>> CONSTRUCTOR_C99_COMPOUND_LITERAL (compound_literal) = 1; >>> return compound_literal; >>> @@ -2822,8 +2825,7 @@ finish_compound_literal (tree type, tree compound_literal, >>> && check_array_initializer (NULL_TREE, type, compound_literal)) >>> return error_mark_node; >>> compound_literal = reshape_init (type, compound_literal, complain); >>> - if (SCALAR_TYPE_P (type) >>> - && !BRACE_ENCLOSED_INITIALIZER_P (compound_literal) >>> + if (!BRACE_ENCLOSED_INITIALIZER_P (compound_literal) >>> && !check_narrowing (type, compound_literal, complain)) >>> return error_mark_node; >> >> Hmm, I wonder why we would want to call check_narrowing here at all; we >> ought to get the narrowing warning from the normal conversion process. >> Perhaps the issue is that we need to pass LOOKUP_NO_NARROWING to >> digest_init. > > reshape_init never ends up calling convert_for_assignment or convert_like_real, > so even if we signalled to check narrowing to it, it wouldn't help. > reshape_init calls check_narrowing just for enum initialization. I was talking about digest_init, not reshape_init. digest_init calls convert_for_initialization. Jason