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

Reply via email to