aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp2a/concepts-pr100557.C
blob: 8dcd0eaca5177a25e811b7bb29bee5e100208fba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// PR c++/100557
// { dg-do compile { target c++20 } }

template <typename _Tp> _Tp declval();

struct print_tag_;

bool tag_invoke(print_tag_, auto);
bool tag_invoke(print_tag_, auto obj) requires requires { *obj; };

template <typename CPO, typename... Args>
auto try_tag_invoke() noexcept(tag_invoke(declval<CPO>, declval<Args>()...)) // { dg-error "no matching function for call" }
    -> decltype(tag_invoke(CPO(), declval<Args>()...));

struct print_tag_ {
  void operator()(auto... args) noexcept(noexcept( try_tag_invoke<print_tag_, decltype(args)...>()));
} print;

void foo() {
  print(0);
}