xref: /llvm-project/clang/test/SemaTemplate/concepts-no-early-substitution.cpp (revision 122b938944ceb966e04d7a4d253f7f9ba27c477d)
1 // RUN: %clang_cc1 -std=c++20 -x c++ %s -verify -fsyntax-only
2 // expected-no-diagnostics
3 
4 template <typename T0>
5 concept HasMemberBegin = requires(T0 t) { t.begin(); };
6 
7 struct GetBegin {
8   template <HasMemberBegin T1>
9   void operator()(T1);
10 };
11 
12 GetBegin begin;
13 
14 template <typename T2>
15 concept Concept = requires(T2 t) { begin(t); };
16 
17 struct Subrange;
18 
19 template <typename T3>
20 struct View {
21   Subrange &getSubrange();
22 
23   operator bool()
24     requires true;
25 
operator boolView26   operator bool()
27     requires requires { begin(getSubrange()); };
28 
29   void begin();
30 };
31 
32 struct Subrange : View<void> {};
33 static_assert(Concept<Subrange>);
34