https://gcc.gnu.org/g:b6fd2fdd3887658e4212dc4945d8a41dd36cb21a
commit r17-656-gb6fd2fdd3887658e4212dc4945d8a41dd36cb21a Author: Marek Polacek <[email protected]> Date: Mon May 18 20:51:06 2026 -0400 c++: fix bogus error with xobj member function [PR125330] 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. Reviewed-by: Jason Merrill <[email protected]> Diff: --- gcc/cp/parser.cc | 3 ++- gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 1ab462160da8..0c78c437019f 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 000000000000..6824bcb2c228 --- /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(); } +};
