From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 16DD43858C2F for ; Thu, 27 Jul 2023 03:47:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 16DD43858C2F Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1690429660; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jSGTqkl0FkO4lxCwrzJJoxy6AHBU8p7wD6Yp/+h0G5k=; b=EXgj0StH4WvWydoLZI4wrfs2nWKsPyohVTwHbvAnExVkxwZ3mczNtQ7GxeVIKV4nxB3mEF kSknturyxK+X7isJFa5QzwHReVoHF3EGJs3enKC1xgCa8zH4Kg5/JY/a0p9kSYd/hfR/ZV HXYNwzfrinNIhyS/3KvYfr9bJWAFRcs= Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-383-Og37HTGaMZauzdygR7mHbw-1; Wed, 26 Jul 2023 23:47:39 -0400 X-MC-Unique: Og37HTGaMZauzdygR7mHbw-1 Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-403aa5cca80so5306651cf.0 for ; Wed, 26 Jul 2023 20:47:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690429659; x=1691034459; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=jSGTqkl0FkO4lxCwrzJJoxy6AHBU8p7wD6Yp/+h0G5k=; b=hqKuDVnby37CmfqgkmmCrq9gSSXhCDpXOuHKR0+dLpsYZcccyf/k7Ltb/joAY7Sbwc uxSOtdrqVJEjAHSqHzNWQraQ6v+Plyk3j+KDDq8/UzODqfkwbk/vM4Iiludoawpoxz5d 9uieQ5NgbktNkiTayHXiWc77cJ1ZkrIVL21I4sPf1mjslbGp/otoTnKPfRE/wi40oILm I4rMJsabeO/dPx6LlRYVqTC61COqkycvWgFFRh4sa9IYJ6gMu+nT2nhJ7sjzDx9upCj0 zOAl1Bj1+QtGTaZw1cKHeWW9LYPpHrC6IsTHG0i9ccqw7Q0VZN7WT/ZqU1HRL8ShKnDd cD8A== X-Gm-Message-State: ABy/qLZoF0zOg7sleKd6NvfpA4pTx2qLA33h4xQGxIm/fxocRacebcwj 95lWhtUmWaoD0TR2psvrGyZAoLI5GJHB1DyRu123Jf6MJz+tRH1ELRvkhTTcEY7a3H7as5VMXmb UmVQL9auourURVCJEQA== X-Received: by 2002:a05:622a:1452:b0:403:c1c6:23af with SMTP id v18-20020a05622a145200b00403c1c623afmr4406759qtx.44.1690429658752; Wed, 26 Jul 2023 20:47:38 -0700 (PDT) X-Google-Smtp-Source: APBJJlEWiatzW7qskwbfY1DEpFrSYU/iKwrz41DJZhu9PWwtSpTPI4yYCs/010mVIFRclZVr0R5byw== X-Received: by 2002:a05:622a:1452:b0:403:c1c6:23af with SMTP id v18-20020a05622a145200b00403c1c623afmr4406749qtx.44.1690429658430; Wed, 26 Jul 2023 20:47:38 -0700 (PDT) Received: from [192.168.1.108] (130-44-146-16.s12558.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.146.16]) by smtp.gmail.com with ESMTPSA id e23-20020ac84157000000b0040327381dbcsm158985qtm.19.2023.07.26.20.47.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 Jul 2023 20:47:37 -0700 (PDT) Message-ID: Date: Wed, 26 Jul 2023 23:47:36 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: [PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497] To: Nathaniel Shead Cc: Patrick Palka , gcc-patches@gcc.gnu.org References: <4c77b9a3-48cb-93c7-1489-38155c637926@idea> <5d7ada85-ccaa-bc07-b625-20fdc5dc924c@redhat.com> From: Jason Merrill In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 6/30/23 03:05, Nathaniel Shead wrote: > On Thu, Jun 29, 2023 at 01:43:07PM -0400, Jason Merrill wrote: >> On 6/24/23 09:24, Nathaniel Shead wrote: >>> On Fri, Jun 23, 2023 at 11:59:51AM -0400, Patrick Palka wrote: >>>> Hi, >>>> >>>> On Sat, 22 Apr 2023, Nathaniel Shead via Gcc-patches wrote: >>>> >>>>> Bootstrapped and tested on x86_64-pc-linux-gnu. >>>>> >>>>> -- 8< -- >>>>> >>>>> This patch raises an error early when the decltype(auto) specifier is >>>>> used as a parameter of a function. This prevents any issues with an >>>>> unexpected tree type later on when performing the call. >>>> >>>> Thanks very much for the patch! Some minor comments below. >>>> >>>>> >>>>> PR 103497 >>>> >>>> We should include the bug component name when referring to the PR in the >>>> commit message (i.e. PR c++/103497) so that upon pushing the patch the >>>> post-commit hook automatically adds a comment to the PR reffering to the >>>> commit. I could be wrong but AFAIK the hook only performs this when the >>>> component name is included. >>> >>> Thanks for the review! Fixed. >>> >>>>> >>>>> gcc/cp/ChangeLog: >>>>> >>>>> * parser.cc (cp_parser_simple_type_specifier): Add check for >>>>> decltype(auto) as function parameter. >>>>> >>>>> gcc/testsuite/ChangeLog: >>>>> >>>>> * g++.dg/pr103497.C: New test. >>>>> >>>>> Signed-off-by: Nathaniel Shead >>>>> --- >>>>> gcc/cp/parser.cc | 10 ++++++++++ >>>>> gcc/testsuite/g++.dg/pr103497.C | 7 +++++++ >>>>> 2 files changed, 17 insertions(+) >>>>> create mode 100644 gcc/testsuite/g++.dg/pr103497.C >>>>> >>>>> diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc >>>>> index e5f032f2330..1415e07e152 100644 >>>>> --- a/gcc/cp/parser.cc >>>>> +++ b/gcc/cp/parser.cc >>>>> @@ -19884,6 +19884,16 @@ cp_parser_simple_type_specifier (cp_parser* parser, >>>>> && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE) >>>>> { >>>>> type = saved_checks_value (token->u.tree_check_value); >>>>> + /* Within a function parameter declaration, decltype(auto) is always an >>>>> + error. */ >>>>> + if (parser->auto_is_implicit_function_template_parm_p >>>>> + && TREE_CODE (type) == TEMPLATE_TYPE_PARM >>>> >>>> We could check is_auto (type) here instead, to avoid any confusion with >>>> checking AUTO_IS_DECLTYPE for a non-auto TEMPLATE_TYPE_PARM. >>>> >>>>> + && AUTO_IS_DECLTYPE (type)) >>>>> + { >>>>> + error_at (token->location, >>>>> + "cannot declare a parameter with %"); >>>>> + type = error_mark_node; >>>>> + } >>>>> if (decl_specs) >>>>> { >>>>> cp_parser_set_decl_spec_type (decl_specs, type, >>>>> diff --git a/gcc/testsuite/g++.dg/pr103497.C b/gcc/testsuite/g++.dg/pr103497.C >>>>> new file mode 100644 >>>>> index 00000000000..bcd421c2907 >>>>> --- /dev/null >>>>> +++ b/gcc/testsuite/g++.dg/pr103497.C >>>>> @@ -0,0 +1,7 @@ >>>>> +// { dg-do compile { target c++14 } } >>>>> + >>>>> +void foo(decltype(auto)... args); // { dg-error "parameter with .decltype.auto..|no parameter packs" } >>>> >>>> I noticed for >>>> >>>> void foo(decltype(auto) arg); >>>> >>>> we already issue an identical error from grokdeclarator. Perhaps we could >>>> instead extend the error handling there to detect decltype(auto)... as well, >>>> rather than adding new error handling in cp_parser_simple_type_specifier? >>> >>> Ah thanks, I didn't notice this; this simplifies the change a fair bit. >>> How about this patch instead? >>> >>> Regtested on x86_64-pc-linux-gnu. >>> >>> -- 8< -- >>> >>> This patch ensures that checks for usages of 'auto' in function >>> parameters also consider parameter packs, since 'type_uses_auto' does >>> not seem to consider this case. >>> >>> PR c++/103497 >>> >>> gcc/cp/ChangeLog: >>> >>> * decl.cc (grokdeclarator): Check for decltype(auto) in >>> parameter pack. >>> >>> gcc/testsuite/ChangeLog: >>> >>> * g++.dg/cpp1y/decltype-auto-103497.C: New test. >>> >>> Signed-off-by: Nathaniel Shead >>> --- >>> gcc/cp/decl.cc | 3 +++ >>> gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C | 8 ++++++++ >>> 2 files changed, 11 insertions(+) >>> create mode 100644 gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C >>> >>> diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc >>> index 60f107d50c4..aaf691fce68 100644 >>> --- a/gcc/cp/decl.cc >>> +++ b/gcc/cp/decl.cc >>> @@ -14044,6 +14044,9 @@ grokdeclarator (const cp_declarator *declarator, >>> error ("cannot use %<::%> in parameter declaration"); >>> tree auto_node = type_uses_auto (type); >>> + if (!auto_node && parameter_pack_p) >>> + auto_node = type_uses_auto (PACK_EXPANSION_PATTERN (type)); >> >> Hmm, I wonder if type_uses_auto should look into PACK_EXPANSION_PATTERN >> itself. Would that break anything? > > I gave that a try and it seems to work fine. > > Regtested on x86_64-pc-linux-gnu. Pushed, thanks. > -- 8< -- > > This patch ensures 'type_uses_auto' also checks for usages of 'auto' in > parameter packs. > > PR c++/103497 > > gcc/cp/ChangeLog: > > * pt.cc (type_uses_auto): Check inside parameter packs. > > gcc/testsuite/ChangeLog: > > * g++.dg/cpp1y/decltype-auto-103497.C: New test. > > Signed-off-by: Nathaniel Shead > --- > gcc/cp/pt.cc | 7 ++++++- > gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C | 8 ++++++++ > 2 files changed, 14 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C > > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc > index 2345a18becc..2a3ba5ab67d 100644 > --- a/gcc/cp/pt.cc > +++ b/gcc/cp/pt.cc > @@ -31083,7 +31083,12 @@ type_uses_auto (tree type) > { > if (type == NULL_TREE) > return NULL_TREE; > - else if (flag_concepts_ts) > + > + /* For parameter packs, check the contents of the pack. */ > + if (PACK_EXPANSION_P (type)) > + type = PACK_EXPANSION_PATTERN (type); > + > + if (flag_concepts_ts) > { > /* The Concepts TS allows multiple autos in one type-specifier; just > return the first one we find, do_auto_deduction will collect all of > diff --git a/gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C b/gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C > new file mode 100644 > index 00000000000..cedd661710c > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C > @@ -0,0 +1,8 @@ > +// PR c++/103497 > +// { dg-do compile { target c++14 } } > + > +void foo(decltype(auto)... args); // { dg-error "cannot declare a parameter with .decltype.auto.." } > + > +int main() { > + foo(); > +}