Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

-- >8 --
In this test since r17-472 we issue a bogus "not declared in this scope"
error when parsing the requires because we failed to pushdecl.  Xobj
parameters reuse the default argument field (in _parameter_declaration)
so we also have to check this_identifier.

        PR c++/125330

gcc/cp/ChangeLog:

        * parser.cc (cp_parser_parameter_declaration_list): Also
        pushdecl when parameter->default_argument is this_identifier.

gcc/testsuite/ChangeLog:

        * g++.dg/cpp23/explicit-obj-basic8.C: New test.
---
 gcc/cp/parser.cc                                 | 3 ++-
 gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C | 8 ++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 1ab462160da..0c78c437019 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -28347,7 +28347,8 @@ cp_parser_parameter_declaration_list (cp_parser* parser,
          /* If we saw a default argument, we've already pushed this decl.
             (An ill-formed default argument should have been parsed to
             error_mark_node.)  */
-         else if (!parameter->default_argument)
+         else if (!parameter->default_argument
+                  || parameter->default_argument == this_identifier)
            decl = pushdecl (decl);
        }
 
diff --git a/gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C 
b/gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C
new file mode 100644
index 00000000000..6824bcb2c22
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C
@@ -0,0 +1,8 @@
+// PR c++/125330
+// { dg-do compile { target c++23 } }
+
+struct T {
+  template<typename Self>
+  void foo(this Self const &x) requires requires { x.bar(); }
+    { x.bar(); }
+};

base-commit: 65af1f796fc7dcdd98e9d94c19cabed64e332ccd
-- 
2.54.0

Reply via email to