llvm/clang/test/AST/ast-dump-concepts.cpp
Haojian Wu dc7b1e9db5 [AST] Fix the CXXFoldExpr source range when parentheses range is invalid.
The CXXFoldExpr's range is invalid if the cxxfoldexpr is formed via the
Concept's TypeContraints (because the parentheses are not written in the
source code). We fallback to use the range from the pattern.

Differential Revision: https://reviews.llvm.org/D85645
2020-08-12 09:20:23 +02:00

52 lines
1.8 KiB
C++

// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++2a -ast-dump -ast-dump-filter Foo %s | FileCheck -strict-whitespace %s
// Test with serialization:
// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown -emit-pch -o %t %s
// RUN: %clang_cc1 -x c++ -std=c++20 -triple x86_64-unknown-unknown -include-pch %t \
// RUN: -ast-dump-all -ast-dump-filter Foo /dev/null \
// RUN: | FileCheck --strict-whitespace %s
template <typename T>
concept unary_concept = true;
template <typename T, typename U>
concept binary_concept = true;
template <typename... Ts>
concept variadic_concept = true;
template <typename T>
struct Foo {
// CHECK: TemplateTypeParmDecl {{.*}} referenced Concept {{.*}} 'binary_concept'
// CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} <col:13, col:31> 'bool' Concept {{.*}} 'binary_concept'
// CHECK-NEXT: |-TemplateArgument {{.*}} type 'R'
// CHECK-NEXT: | `-TemplateTypeParmType {{.*}} 'R'
// CHECK-NEXT: | `-TemplateTypeParm {{.*}} 'R'
// CHECK-NEXT: `-TemplateArgument {{.*}} type 'int'
// CHECK-NEXT: `-BuiltinType {{.*}} 'int'
template <binary_concept<int> R>
Foo(R);
// CHECK: TemplateTypeParmDecl {{.*}} referenced Concept {{.*}} 'unary_concept'
// CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} <col:13> 'bool'
template <unary_concept R>
Foo(R);
// CHECK: FunctionTemplateDecl {{.*}} <line:[[@LINE+1]]:3, line:[[@LINE+2]]:39> {{.*}} Foo<T>
template <typename R>
Foo(R, int) requires unary_concept<R>;
// CHECK: FunctionTemplateDecl {{.*}} <line:[[@LINE+1]]:3, line:[[@LINE+3]]:3> {{.*}} Foo<T>
template <typename R>
Foo(R, char) requires unary_concept<R> {
}
// CHECK: CXXFoldExpr {{.*}} <col:13, col:29>
template <variadic_concept... Ts>
Foo();
// CHECK: CXXFoldExpr {{.*}} <col:13, col:34>
template <variadic_concept<int>... Ts>
Foo();
};