42 lines · cpp
1// RUN: %clang_cc1 -emit-pch -std=c++2a -o %t %s2// RUN: %clang_cc1 -std=c++2a -x ast -ast-print %t | FileCheck %s3 4// RUN: %clang_cc1 -emit-pch -std=c++2a -fpch-instantiate-templates -o %t %s5// RUN: %clang_cc1 -std=c++2a -x ast -ast-print %t | FileCheck %s6 7template<typename T>8concept C = true;9 10template<typename T, typename U>11concept C2 = true;12 13template<typename T>14bool f() {15 // CHECK: requires (T t) { t++; { t++ } noexcept -> C; { t++ } -> C2<int>; typename T::a; requires T::val; requires C<typename T::val> || (C<typename T::val> || C<T>); };16 return requires (T t) {17 t++;18 { t++ } noexcept -> C;19 { t++ } -> C2<int>;20 typename T::a;21 requires T::val;22 requires C<typename T::val> || (C<typename T::val> || C<T>);23 };24}25 26namespace trailing_requires_expression {27 28template <typename T> requires C<T> && C2<T, T>29// CHECK: template <typename T> requires C<T> && C2<T, T> void g();30void g();31 32template <typename T> requires C<T> || C2<T, T>33// CHECK: template <typename T> requires C<T> || C2<T, T> constexpr int h = sizeof(T);34constexpr int h = sizeof(T);35 36template <typename T> requires C<T>37// CHECK: template <typename T> requires C<T> class i {38// CHECK-NEXT: };39class i {};40 41}42