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