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

struct S { using blah = void; };

template <typename T> constexpr bool trait = !__is_same(T, S);
template <typename T> concept C = trait<T>;

template<typename T>
void foo() noexcept(!__is_same(T, void)) { }

template<typename U>
auto f() {
  return []<typename T>(T, bool a = requires { C<T>; }){ // { dg-warning Wmissing-requires }
    static_assert(requires { requires C<U> && (C<T> || C<T>); }); // { dg-error "assert" }
    static_assert(requires { C<T>; }); // { dg-warning Wmissing-requires }
    static_assert(requires { { foo<T>() } noexcept -> C; });
    static_assert(!requires { typename T::blah; }); // { dg-error "assert" }
    return 0;
  };
}

auto g = f<int>(); // { dg-bogus "" }
int n = g(0); // { dg-bogus "" }
int m = g(S{}); // { dg-message "required from here" }