Skip to content
212 changes: 146 additions & 66 deletions clang-tools-extra/test/clang-doc/templates.cpp
Original file line number Diff line number Diff line change
@@ -1,76 +1,156 @@
// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: echo "" > %t/compile_flags.txt
// RUN: cp "%s" "%t/test.cpp"
// RUN: clang-doc --doxygen --executor=standalone -p %t %t/test.cpp -output=%t/docs
// RUN: cat %t/docs/index.yaml | FileCheck %s --check-prefix=CHECK
// RUN: rm -rf %t

// RUN: clang-doc --doxygen --executor=standalone %s -output=%t/docs
// RUN: cat %t/docs/index.yaml | FileCheck %s --check-prefix=YAML

// RUN: clang-doc --doxygen --executor=standalone %s -output=%t/docs --format=md
// RUN: cat %t/docs/GlobalNamespace/index.md | FileCheck %s --check-prefix=MD

// YAML: ---
// YAML-NEXT: USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: ChildRecords:
// YAML-NEXT: - Type: Record
// YAML-NEXT: Name: 'tuple'
// YAML-NEXT: QualName: 'tuple'
// YAML-NEXT: USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Path: 'GlobalNamespace'

// MD: # Global Namespace
// MD: ## Functions

template<class... T>
void ParamPackFunction(T... args);

// YAML-NEXT: ChildFunctions:
// YAML-NEXT: - USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Name: 'ParamPackFunction'
// YAML-NEXT: Location:
// YAML-NEXT: - LineNumber: [[# @LINE - 6]]
// YAML-NEXT: Filename: '{{.*}}'
// YAML-NEXT: Params:
// YAML-NEXT: - Type:
// YAML-NEXT: Name: 'T...'
// YAML-NEXT: QualName: 'T...'
// YAML-NEXT: Name: 'args'
// YAML-NEXT: ReturnType:
// YAML-NEXT: Type:
// YAML-NEXT: Name: 'void'
// YAML-NEXT: QualName: 'void'
// YAML-NEXT: Template:
// YAML-NEXT: Params:
// YAML-NEXT: - Contents: 'class... T'

// MD: ### ParamPackFunction
// MD: *void ParamPackFunction(T... args)*

template<typename T, int U = 1>
void function(T x) {}

// YAML-NEXT: - USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Name: 'function'
// YAML-NEXT: DefLocation:
// YAML-NEXT: LineNumber: [[# @LINE - 5]]
// YAML-NEXT: Filename: '{{.*}}'
// YAML-NEXT: Params:
// YAML-NEXT: - Type:
// YAML-NEXT: Name: 'T'
// YAML-NEXT: QualName: 'T'
// YAML-NEXT: Name: 'x'
// YAML-NEXT: ReturnType:
// YAML-NEXT: Type:
// YAML-NEXT: Name: 'void'
// YAML-NEXT: QualName: 'void'
// YAML-NEXT: Template:
// YAML-NEXT: Params:
// YAML-NEXT: - Contents: 'typename T'
// YAML-NEXT: - Contents: 'int U = 1'

// MD: ### function
// MD: *void function(T x)*
// MD: *Defined at {{.*}}templates.cpp#[[# @LINE - 23]]*

template<>
void function<bool, 0>(bool x) {}

template<class... T>
void ParamPackFunction(T... args);
// YAML-NEXT: - USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Name: 'function'
// YAML-NEXT: DefLocation:
// YAML-NEXT: LineNumber: [[# @LINE - 6]]
// YAML-NEXT: Filename: '{{.*}}'
// YAML-NEXT: Params:
// YAML-NEXT: - Type:
// YAML-NEXT: Name: '_Bool'
// YAML-NEXT: QualName: '_Bool'
// YAML-NEXT: Name: 'x'
// YAML-NEXT: ReturnType:
// YAML-NEXT: Type:
// YAML-NEXT: Name: 'void'
// YAML-NEXT: QualName: 'void'
// YAML-NEXT: Template:
// YAML-NEXT: Specialization:
// YAML-NEXT: SpecializationOf: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Params:
// YAML-NEXT: - Contents: 'bool'
// YAML-NEXT: - Contents: '0'

// MD: ### function
// MD: *void function(_Bool x)*
// MD: *Defined at {{.*}}templates.cpp#[[# @LINE - 26]]*

/// A Tuple type
///
/// Does nothing.
template<typename ...Tys>
struct tuple{};

/// A function with a tuple parameter
///
/// \param t The input to func_with_tuple_param
tuple<int,int,bool> func_with_tuple_param(tuple<int,int,bool> t){ return t;}

// YAML-NEXT: - USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Name: 'func_with_tuple_param'
// YAML-NEXT: Description:
// YAML-NEXT: - Kind: 'FullComment'
// YAML-NEXT: Children:
// YAML-NEXT: - Kind: 'ParagraphComment'
// YAML-NEXT: Children:
// YAML-NEXT: - Kind: 'TextComment'
// YAML-NEXT: Text: ' A function with a tuple parameter'
// YAML-NEXT: - Kind: 'ParagraphComment'
// YAML-NEXT: Children:
// YAML-NEXT: - Kind: 'TextComment'
// YAML-NEXT: - Kind: 'ParamCommandComment'
// YAML-NEXT: Direction: '[in]'
// YAML-NEXT: ParamName: 't'
// YAML-NEXT: Children:
// YAML-NEXT: - Kind: 'ParagraphComment'
// YAML-NEXT: Children:
// YAML-NEXT: - Kind: 'TextComment'
// YAML-NEXT: Text: ' The input to func_with_tuple_param'
// YAML-NEXT: DefLocation:
// YAML-NEXT: LineNumber: [[# @LINE - 23]]
// YAML-NEXT: Filename:
// YAML-NEXT: Params:
// YAML-NEXT: - Type:
// YAML-NEXT: Type: Record
// YAML-NEXT: Name: 'tuple'
// YAML-NEXT: QualName: 'tuple<int, int, _Bool>'
// YAML-NEXT: USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Path: 'GlobalNamespace'
// YAML-NEXT: Name: 't'
// YAML-NEXT: ReturnType:
// YAML-NEXT: Type:
// YAML-NEXT: Type: Record
// YAML-NEXT: Name: 'tuple'
// YAML-NEXT: QualName: 'tuple<int, int, _Bool>'
// YAML-NEXT: USR: '{{([0-9A-F]{40})}}'
// YAML-NEXT: Path: 'GlobalNamespace'
// YAML-NEXT: ...

// CHECK: ---
// CHECK-NEXT: USR: '{{([0-9A-F]{40})}}'
// CHECK-NEXT: ChildFunctions:
// CHECK-NEXT: - USR: '{{([0-9A-F]{40})}}'
// CHECK-NEXT: Name: 'ParamPackFunction'
// CHECK-NEXT: Location:
// CHECK-NEXT: - LineNumber: 16
// CHECK-NEXT: Filename: '{{.*}}'
// CHECK-NEXT: Params:
// CHECK-NEXT: - Type:
// CHECK-NEXT: Name: 'T...'
// CHECK-NEXT: QualName: 'T...'
// CHECK-NEXT: Name: 'args'
// CHECK-NEXT: ReturnType:
// CHECK-NEXT: Type:
// CHECK-NEXT: Name: 'void'
// CHECK-NEXT: QualName: 'void'
// CHECK-NEXT: Template:
// CHECK-NEXT: Params:
// CHECK-NEXT: - Contents: 'class... T'
// CHECK-NEXT: - USR: '{{([0-9A-F]{40})}}'
// CHECK-NEXT: Name: 'function'
// CHECK-NEXT: DefLocation:
// CHECK-NEXT: LineNumber: 10
// CHECK-NEXT: Filename: '{{.*}}'
// CHECK-NEXT: Params:
// CHECK-NEXT: - Type:
// CHECK-NEXT: Name: 'T'
// CHECK-NEXT: QualName: 'T'
// CHECK-NEXT: Name: 'x'
// CHECK-NEXT: ReturnType:
// CHECK-NEXT: Type:
// CHECK-NEXT: Name: 'void'
// CHECK-NEXT: QualName: 'void'
// CHECK-NEXT: Template:
// CHECK-NEXT: Params:
// CHECK-NEXT: - Contents: 'typename T'
// CHECK-NEXT: - Contents: 'int U = 1'
// CHECK-NEXT: - USR: '{{([0-9A-F]{40})}}'
// CHECK-NEXT: Name: 'function'
// CHECK-NEXT: DefLocation:
// CHECK-NEXT: LineNumber: 12
// CHECK-NEXT: Filename: '{{.*}}'
// CHECK-NEXT: Params:
// CHECK-NEXT: - Type:
// CHECK-NEXT: Name: '_Bool'
// CHECK-NEXT: QualName: '_Bool'
// CHECK-NEXT: Name: 'x'
// CHECK-NEXT: ReturnType:
// CHECK-NEXT: Type:
// CHECK-NEXT: Name: 'void'
// CHECK-NEXT: QualName: 'void'
// CHECK-NEXT: Template:
// CHECK-NEXT: Specialization:
// CHECK-NEXT: SpecializationOf: '{{([0-9A-F]{40})}}'
// CHECK-NEXT: Params:
// CHECK-NEXT: - Contents: 'bool'
// CHECK-NEXT: - Contents: '0'
// CHECK-NEXT: ...
// MD: ### func_with_tuple_param
// MD: *tuple func_with_tuple_param(tuple t)*
// MD: *Defined at {{.*}}templates.cpp#[[# @LINE - 44]]*
// MD: A function with a tuple parameter
// MD: **t** The input to func_with_tuple_param
Loading