bool xobj_param_p
= decl_spec_seq_has_spec_p (&decl_specifiers, ds_this);
- if (xobj_param_p && template_parm_p)
+ if (xobj_param_p
+ && (template_parm_p || current_binding_level->requires_expression))
{
- error_at (decl_specifiers.locations[ds_this],
- "%<this%> specifier in template parameter declaration");
+ if (template_parm_p)
+ error_at (decl_specifiers.locations[ds_this],
+ "%<this%> specifier in template parameter declaration");
+ else
+ error_at (decl_specifiers.locations[ds_this],
+ "%<this%> specifier in a requires-expression parameter");
xobj_param_p = false;
decl_specifiers.locations[ds_this] = 0;
}
--- /dev/null
+// PR c++/116798
+// { dg-do compile { target c++23 } }
+
+template<typename T>
+concept C = requires(this T u, // { dg-error "'this' specifier in a requires-expression parameter" }
+ this T v) { // { dg-error "'this' specifier in a requires-expression parameter" }
+ u + v;
+};
+
+static_assert(C<int>);