aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-08-10 09:33:17 -0400
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 15:07:55 -0300
commit53cf2ed28ca11ff19b73ab73065e20c9d3c47861 (patch)
tree0761560870d8ebbcc74d5133034c7e34fed883b0 /gcc/testsuite
parent044d08438c72773a0a5a6dc5768063661c4795c7 (diff)
c++: constraints and address of template-id
When resolving the address of a template-id, we need to drop functions whose associated constraints are not satisfied, as per [over.over]. We do so in resolve_address_of_overloaded_function, but not in resolve_overloaded_unification or resolve_nondeduced_context, which seems like an oversight. gcc/cp/ChangeLog: * pt.c (resolve_overloaded_unification): Drop functions with unsatisfied constraints. (resolve_nondeduced_context): Likewise. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-fn5.C: New test. * g++.dg/concepts/fn8.C: Generalize dg-error directive to accept "no matching function ..." diagnostic. * g++.dg/cpp2a/concepts-fn1.C: Likewise. * g++.dg/cpp2a/concepts-ts2.C: Likewise. * g++.dg/cpp2a/concepts-ts3.C: Likewise.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/g++.dg/concepts/fn8.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-fn5.C17
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C2
5 files changed, 21 insertions, 4 deletions
diff --git a/gcc/testsuite/g++.dg/concepts/fn8.C b/gcc/testsuite/g++.dg/concepts/fn8.C
index ed900809908..32df5a556c0 100644
--- a/gcc/testsuite/g++.dg/concepts/fn8.C
+++ b/gcc/testsuite/g++.dg/concepts/fn8.C
@@ -24,5 +24,5 @@ template<typename T>
void g(T x) { }
int main () {
- g(&f<int>); // { dg-error "no matches" }
+ g(&f<int>); // { dg-error "no match" }
}
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C
index 238eb819e90..b31675d255c 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C
@@ -170,7 +170,7 @@ template<typename T> void g(T x) { }
void driver_3 ()
{
g(&ok<int>);
- g(&err<int>); // { dg-error "no matches" }
+ g(&err<int>); // { dg-error "no match" }
}
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-fn5.C b/gcc/testsuite/g++.dg/cpp2a/concepts-fn5.C
new file mode 100644
index 00000000000..8f00a760d7e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-fn5.C
@@ -0,0 +1,17 @@
+// Verify we check associated constraints when resolving the address of a
+// template-id.
+// { dg-do compile { target c++20 } }
+
+void id(auto) { }
+
+template <typename>
+int f() { return 0; }
+
+template <typename T> requires requires { T::fail(); }
+auto f() { T::fail(); }
+
+int main() {
+ using U = decltype(&f<int>);
+ (void)&f<int>;
+ id(&f<int>);
+}
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C b/gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C
index d28002c035a..5942ff19327 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C
@@ -173,7 +173,7 @@ template<typename T> void g(T x) { }
void driver_3 ()
{
g(&ok<int>);
- g(&err<int>); // { dg-error "no matches" }
+ g(&err<int>); // { dg-error "no match" }
}
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C
index 9d47a7a083d..6f7ed1ffee4 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C
@@ -173,7 +173,7 @@ template<typename T> void g(T x) { }
void driver_3 ()
{
g(&ok<int>);
- g(&err<int>); // { dg-error "no matches" }
+ g(&err<int>); // { dg-error "no match" }
}