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 <nathanielosh...@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 <nathanielosh...@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 <nathanielosh...@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();
+}

Reply via email to