From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <SRS0=UJEc=DN=redhat.com=jason@sourceware.org>
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 <gcc-patches@gcc.gnu.org>; 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 <gcc-patches@gcc.gnu.org>; 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: <c0502c84-5ad0-30cc-a153-23a1899fed4c@redhat.com>
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 <nathanieloshead@gmail.com>
Cc: Patrick Palka <ppalka@redhat.com>, gcc-patches@gcc.gnu.org
References: <ZEN9yWhVwRqM2kVn@Thaum.localdomain>
 <4c77b9a3-48cb-93c7-1489-38155c637926@idea>
 <ZJbukJluJlp23xw5@Thaum.localdomain>
 <5d7ada85-ccaa-bc07-b625-20fdc5dc924c@redhat.com>
 <ZJ5+tHgZ8SvugPZh@Thaum.localdomain>
From: Jason Merrill <jason@redhat.com>
In-Reply-To: <ZJ5+tHgZ8SvugPZh@Thaum.localdomain>
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: <gcc-patches.gcc.gnu.org>

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 <nathanieloshead@gmail.com>
>>>>> ---
>>>>>    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 %<decltype(auto)%>");
>>>>> +	  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 <nathanieloshead@gmail.com>
>>> ---
>>>    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 <nathanieloshead@gmail.com>
> ---
>   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();
> +}