aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-this1.C30
2 files changed, 35 insertions, 0 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 71a771f..6a2a937 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10766,6 +10766,11 @@ any_template_parm_r (tree t, void *data)
WALK_SUBTREE (TREE_TYPE (t));
break;
+ case CONVERT_EXPR:
+ if (is_dummy_object (t))
+ WALK_SUBTREE (TREE_TYPE (t));
+ break;
+
default:
break;
}
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-this1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-this1.C
new file mode 100644
index 0000000..d717028
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-this1.C
@@ -0,0 +1,30 @@
+// PR c++/103198
+// { dg-do compile { target c++20 } }
+
+template<class T, class = void>
+struct A {
+ T val;
+
+ template<class U>
+ requires requires { val.x; }
+ void f(U);
+
+ static void g(int)
+ requires requires { val.x; };
+
+ void h(int)
+ requires requires { val.x; };
+};
+
+struct B { int x; };
+struct C { };
+
+int main() {
+ A<B>().f(0);
+ A<B>().g(0);
+ A<B>().h(0);
+
+ A<C>().f(0); // { dg-error "no match" }
+ A<C>().g(0); // { dg-error "no match" }
+ A<C>().h(0); // { dg-error "no match" }
+}