diff options
author | Patrick Palka <ppalka@redhat.com> | 2020-08-10 09:33:17 -0400 |
---|---|---|
committer | Giuliano Belinassi <giuliano.belinassi@usp.br> | 2020-08-17 15:07:55 -0300 |
commit | 53cf2ed28ca11ff19b73ab73065e20c9d3c47861 (patch) | |
tree | 0761560870d8ebbcc74d5133034c7e34fed883b0 /gcc/testsuite | |
parent | 044d08438c72773a0a5a6dc5768063661c4795c7 (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.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-fn5.C | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C | 2 |
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" } } |