brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 9419dba Raw
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