138 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++2a -ast-dump -ast-dump-decl-types -ast-dump-filter Foo %s | FileCheck -strict-whitespace %s2 3// Test with serialization:4// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown -emit-pch -o %t %s5// RUN: %clang_cc1 -x c++ -std=c++20 -triple x86_64-unknown-unknown -include-pch %t \6// RUN: -ast-dump-all -ast-dump-decl-types -ast-dump-filter Foo /dev/null \7// RUN: | FileCheck --strict-whitespace %s8 9template <typename T>10concept unary_concept = true;11 12template <typename T, typename U>13concept binary_concept = true;14 15template <typename... Ts>16concept variadic_concept = true;17 18template <typename T>19struct Foo {20 // CHECK: TemplateTypeParmDecl {{.*}} referenced Concept {{.*}} 'binary_concept'21 // CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} <col:13, col:31> 'bool' Concept {{.*}} 'binary_concept'22 // CHECK-NEXT: |-ImplicitConceptSpecializationDecl {{.*}} <line:13:9> col:923 // CHECK-NEXT: | |-TemplateArgument type 'R'24 // CHECK-NEXT: | | `-TemplateTypeParmType {{.*}} 'R' dependent {{.*}}depth 1 index 025 // CHECK-NEXT: | | `-TemplateTypeParm {{.*}} 'R'26 // CHECK-NEXT: | `-TemplateArgument type 'int'27 // CHECK-NEXT: | `-BuiltinType {{.*}} 'int'28 // CHECK-NEXT: |-TemplateArgument {{.*}} type 'R'29 // CHECK-NEXT: | `-TemplateTypeParmType {{.*}} 'R'30 // CHECK-NEXT: | `-TemplateTypeParm {{.*}} 'R'31 // CHECK-NEXT: `-TemplateArgument {{.*}} type 'int'32 // CHECK-NEXT: `-BuiltinType {{.*}} 'int'33 template <binary_concept<int> R>34 Foo(R);35 36 // CHECK: TemplateTypeParmDecl {{.*}} referenced Concept {{.*}} 'unary_concept'37 // CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} <col:13> 'bool'38 // CHECK-NEXT: |-ImplicitConceptSpecializationDecl {{.*}} <line:10:9> col:939 // CHECK-NEXT: | `-TemplateArgument type 'R'40 // CHECK-NEXT: | `-TemplateTypeParmType {{.*}} 'R' dependent {{.*}}depth 1 index 041 // CHECK-NEXT: | `-TemplateTypeParm {{.*}} 'R'42 template <unary_concept R>43 Foo(R);44 45 // CHECK: FunctionTemplateDecl {{.*}} <line:[[@LINE+1]]:3, line:[[@LINE+2]]:39> {{.*}} Foo<T>46 template <typename R>47 Foo(R, int) requires unary_concept<R>;48 49 // CHECK: FunctionTemplateDecl {{.*}} <line:[[@LINE+1]]:3, line:[[@LINE+3]]:3> {{.*}} Foo<T>50 template <typename R>51 Foo(R, char) requires unary_concept<R> {52 }53 54 // CHECK: CXXFoldExpr {{.*}} <col:13, col:29>55 template <variadic_concept... Ts>56 Foo();57 58 // CHECK: CXXFoldExpr {{.*}} <col:13, col:34>59 template <variadic_concept<int>... Ts>60 Foo();61 62 // CHECK:InjectedClassNameType63 // CHECK-NEXT: CXXRecord {{.*}} 'Foo'64};65 66namespace GH82628 {67namespace ns {68 69template <typename T>70concept C = true;71 72} // namespace ns73 74using ns::C;75 76// CHECK: ConceptDecl {{.*}} Foo77// CHECK-NEXT: |-TemplateTypeParmDecl {{.*}} typename depth 0 index 0 T78// CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} UsingShadow {{.*}} 'C'79template <typename T>80concept Foo = C<T>;81 82// CHECK: TemplateTypeParmDecl {{.*}} Concept {{.*}} 'C' (UsingShadow {{.*}} 'C')83// CHECK: QualType84// CHECK-NEXT: `-BuiltinType {{.*}} 'bool'85template <C T>86constexpr bool FooVar = false;87 88// CHECK: ConceptSpecializationExpr {{.*}} UsingShadow {{.*}} 'C'89// CHECK: QualType90// CHECK-NEXT: `-BuiltinType {{.*}} 'bool'91template <typename T> requires C<T>92constexpr bool FooVar2 = true;93 94// CHECK: SimpleRequirement95// CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} UsingShadow {{.*}} 'C'96// CHECK: QualType97// CHECK-NEXT: `-BuiltinType {{.*}} 'bool'98template <typename T> requires requires (T) { C<T>; }99constexpr bool FooVar3 = true;100 101// CHECK: NonTypeTemplateParmDecl102// CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} UsingShadow {{.*}} 'C'103// CHECK: QualType104// CHECK-NEXT: `-BuiltinType {{.*}} 'bool'105template <C auto T>106constexpr bool FooVar4 = bool(T());107 108// CHECK: FunctionTemplateDecl109// CHECK-NEXT: |-TemplateTypeParmDecl {{.*}} Concept {{.*}} 'C' (UsingShadow {{.*}} 'C') depth 0 index 0 ... T110// CHECK: NonTypeTemplateParmDecl {{.*}} depth 0 index 1 U111// CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} UsingShadow {{.*}} 'C'112// CHECK: |-TemplateTypeParmDecl {{.*}} Concept {{.*}} 'C' (UsingShadow {{.*}} 'C') depth 0 index 2 V:auto113// CHECK: FunctionProtoType114// CHECK: `-Concept {{.*}} 'C'115// CHECK: `-TemplateTypeParm {{.*}} 'V:auto'116template <C... T, C auto U>117auto FooFunc(C auto V) -> C decltype(auto) {118 // FIXME: TypeLocs inside of the function body cannot be dumped via -ast-dump for now.119 // See clang-tools-extra/clangd/unittests/SelectionTests.cpp:SelectionTest.UsingConcepts for their checkings.120 C auto W = V;121 return W;122}123 124}125 126namespace constraint_auto_params {127 128template <class T, class K>129concept C = true;130 131template<class T>132void g(C<T> auto Foo) {}133 134// CHECK: TemplateTypeParmDecl {{.*}} depth 0 index 1 Foo:auto135// CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} <col:8, col:11>136 137}138