Re: [PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497]
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 000..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/cpp
[PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497]
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 000..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
Re: [PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497]
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 000..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? + if (auto_node && !(cxx_dialect >= cxx17 && template_parm_flag)) { if (cxx_dialect >= cxx14) 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 000..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(); +}
Re: [PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497]
On Sat, Jun 24, 2023 at 9:24 AM 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 000..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? LGTM! Though I can't approve the patch myself. > > 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)); > + >if (auto_node && !(cxx_dialect >= cxx17 && template_parm_flag)) > { > if (cxx_dialect >= cxx14) > 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 000..cedd661710c > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp1y/decltype-auto-103497.C > @@
Re: [PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497]
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 000..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)); + if (auto_node && !(cxx_dialect >= cxx17 && template_parm_flag)) { if (cxx_dialect >= cxx14) 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 000..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(); +} -- 2.41.0
Re: [PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497]
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. > > 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 000..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? > + > +int main() { > + foo(); > +} > -- > 2.34.1 > >
[PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497]
(Another) ping. https://gcc.gnu.org/pipermail/gcc-patches/2023-April/616465.html On Sat, Apr 22, 2023 at 04:25:13PM +1000, Nathaniel Shead 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. > > PR 103497 > > 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 > + && 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 000..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" } > + > +int main() { > + foo(); > +} > -- > 2.34.1 >
ping: [PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497]
Ping: https://gcc.gnu.org/pipermail/gcc-patches/2023-April/616465.html On Sat, Apr 22, 2023 at 04:25:13PM +1000, Nathaniel Shead 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. > > PR 103497 > > 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 > + && 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 000..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" } > + > +int main() { > + foo(); > +} > -- > 2.34.1 >
[PATCH] c++: Fix ICE with parameter pack of decltype(auto) [PR103497]
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. PR 103497 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 + && 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 000..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" } + +int main() { + foo(); +} -- 2.34.1