// RUN: rm -rf %t // RUN: mkdir %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 // RUN: clang-doc --pretty-json --doxygen --executor=standalone %s -output=%t/docs --format=html // RUN: cat %t/docs/json/GlobalNamespace/index.json | FileCheck %s --check-prefix=JSON // RUN: cat %t/docs/html/GlobalNamespace/_ZTV5tuple.html | FileCheck %s --check-prefix=HTML-STRUCT // RUN: cat %t/docs/html/GlobalNamespace/index.html | FileCheck %s --check-prefix=HTML // RUN: clang-doc --doxygen --executor=standalone %s -output=%t/docs --format=md_mustache // RUN: cat %t/docs/md/GlobalNamespace/index.md | FileCheck %s --check-prefix=MD-MUSTACHE // 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 // MD-MUSTACHE: # Global Namespace // MD-MUSTACHE: ## Functions template 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)* // JSON: "Name": "ParamPackFunction", // JSON-NEXT: "Params": [ // JSON-NEXT: { // JSON-NEXT: "Name": "args", // JSON-NEXT: "ParamEnd": true, // JSON-NEXT: "Type": { // JSON-NEXT: "Name": "T...", // JSON-NEXT: "QualName": "T...", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: } // JSON-NEXT: } // JSON-NEXT: ], // JSON-NEXT: "ReturnType": { // JSON-NEXT: "IsBuiltIn": true, // JSON-NEXT: "IsTemplate": false, // JSON-NEXT: "Name": "void", // JSON-NEXT: "QualName": "void", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: }, // JSON-NEXT: "Template": { // JSON-NEXT: "Parameters": [ // JSON-NEXT: { // JSON-NEXT: "End": true, // JSON-NEXT: "Param": "class... T" // JSON-NEXT: } // JSON-NEXT: ], // JSON-NEXT: "VerticalDisplay": false // JSON-NEXT: }, // HTML:
template <class... T>
// HTML-NEXT:
void ParamPackFunction (T... args)
// MD-MUSTACHE: ### ParamPackFunction // MD-MUSTACHE: *void ParamPackFunction(T... args)* template 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]]* // JSON: "Name": "function", // JSON-NEXT: "Params": [ // JSON-NEXT: { // JSON-NEXT: "Name": "x", // JSON-NEXT: "ParamEnd": true, // JSON-NEXT: "Type": { // JSON-NEXT: "Name": "T", // JSON-NEXT: "QualName": "T", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: } // JSON-NEXT: } // JSON-NEXT: ], // JSON-NEXT: "ReturnType": { // JSON-NEXT: "IsBuiltIn": true, // JSON-NEXT: "IsTemplate": false, // JSON-NEXT: "Name": "void", // JSON-NEXT: "QualName": "void", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: }, // JSON-NEXT: "Template": { // JSON-NEXT: "Parameters": [ // JSON-NEXT: { // JSON-NEXT: "Param": "typename T" // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "End": true, // JSON-NEXT: "Param": "int U = 1" // JSON-NEXT: } // JSON-NEXT: ], // JSON-NEXT: "VerticalDisplay": false // JSON-NEXT: } // HTML:
template <typename T, int U = 1>
// HTML-NEXT:
void function (T x)
// HTML-NEXT:

Defined at line [[# @LINE - 59]] of file {{.*}}templates.cpp

// HTML-NEXT: // MD-MUSTACHE: ### function // MD-MUSTACHE: *void function(T x)* // MD-MUSTACHE: *Defined at {{.*}}templates.cpp#[[# @LINE - 64]]* template void longFunction(A a, B b, C c, D d, E e) {} // YAML-NEXT: - USR: '{{([0-9A-F]{40})}}' // YAML-NEXT: Name: 'longFunction' // YAML-NEXT: DefLocation: // YAML-NEXT: LineNumber: [[# @LINE - 5]] // YAML-NEXT: Filename: '{{.*}}' // YAML-NEXT: Params: // YAML-NEXT: - Type: // YAML-NEXT: Name: 'A' // YAML-NEXT: QualName: 'A' // YAML-NEXT: Name: 'a' // YAML-NEXT: - Type: // YAML-NEXT: Name: 'B' // YAML-NEXT: QualName: 'B' // YAML-NEXT: Name: 'b' // YAML-NEXT: - Type: // YAML-NEXT: Name: 'C' // YAML-NEXT: QualName: 'C' // YAML-NEXT: Name: 'c' // YAML-NEXT: - Type: // YAML-NEXT: Name: 'D' // YAML-NEXT: QualName: 'D' // YAML-NEXT: Name: 'd' // YAML-NEXT: - Type: // YAML-NEXT: Name: 'E' // YAML-NEXT: QualName: 'E' // YAML-NEXT: Name: 'e' // YAML-NEXT: ReturnType: // YAML-NEXT: Type: // YAML-NEXT: Name: 'void' // YAML-NEXT: QualName: 'void' // YAML-NEXT: Template: // YAML-NEXT: Params: // YAML-NEXT: - Contents: 'typename A' // YAML-NEXT: - Contents: 'typename B' // YAML-NEXT: - Contents: 'typename C' // YAML-NEXT: - Contents: 'typename D' // YAML-NEXT: - Contents: 'typename E' // MD: ### longFunction // MD: *void longFunction(A a, B b, C c, D d, E e)* // MD: *Defined at {{.*}}templates.cpp#[[# @LINE - 42]]* // JSON: "Name": "longFunction", // JSON-NEXT: "Params": [ // JSON-NEXT: { // JSON-NEXT: "Name": "a", // JSON-NEXT: "Type": { // JSON-NEXT: "Name": "A", // JSON-NEXT: "QualName": "A", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: } // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "Name": "b", // JSON-NEXT: "Type": { // JSON-NEXT: "Name": "B", // JSON-NEXT: "QualName": "B", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: } // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "Name": "c", // JSON-NEXT: "Type": { // JSON-NEXT: "Name": "C", // JSON-NEXT: "QualName": "C", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: } // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "Name": "d", // JSON-NEXT: "Type": { // JSON-NEXT: "Name": "D", // JSON-NEXT: "QualName": "D", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: } // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "Name": "e", // JSON-NEXT: "ParamEnd": true, // JSON-NEXT: "Type": { // JSON-NEXT: "Name": "E", // JSON-NEXT: "QualName": "E", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: } // JSON-NEXT: } // JSON-NEXT: ], // JSON-NEXT: "ReturnType": { // JSON-NEXT: "IsBuiltIn": true, // JSON-NEXT: "IsTemplate": false, // JSON-NEXT: "Name": "void", // JSON-NEXT: "QualName": "void", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: }, // JSON-NEXT: "Template": { // JSON-NEXT: "Parameters": [ // JSON-NEXT: { // JSON-NEXT: "Param": "typename A" // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "Param": "typename B" // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "Param": "typename C" // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "Param": "typename D" // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "End": true, // JSON-NEXT: "Param": "typename E" // JSON-NEXT: } // JSON-NEXT: ], // JSON-NEXT: "VerticalDisplay": true // JSON-NEXT: }, // JSON-NEXT: "USR": "{{([0-9A-F]{40})}}", // JSON-NEXT: "VerticalDisplay": true // JSON-NEXT: } // HTML:
// HTML-SAME:        template <
// HTML-SAME:        
// HTML-SAME:          typename A, 
// HTML-SAME:          typename B, 
// HTML-SAME:          typename C, 
// HTML-SAME:          typename D, 
// HTML-SAME:          typename E
// HTML-SAME:        
// HTML-SAME:        >
// HTML-SAME:      
// HTML-NEXT:
// HTML-SAME:        void longFunction (
// HTML-SAME:        
// HTML-SAME:          A a, 
// HTML-SAME:          B b, 
// HTML-SAME:          C c, 
// HTML-SAME:          D d, 
// HTML-SAME:          E e
// HTML-SAME:        
// HTML-SAME:        )
// HTML-SAME:      
// HTML-NEXT:

Defined at line [[# @LINE - 142]] of file {{.*}}templates.cpp

// HTML-NEXT: template <> void function(bool x) {} // 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]]* // JSON: "Name": "function", // JSON-NEXT: "Params": [ // JSON-NEXT: { // JSON-NEXT: "Name": "x", // JSON-NEXT: "ParamEnd": true, // JSON-NEXT: "Type": { // JSON-NEXT: "Name": "bool", // JSON-NEXT: "QualName": "bool", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: } // JSON-NEXT: } // JSON-NEXT: ], // JSON-NEXT: "ReturnType": { // JSON-NEXT: "IsBuiltIn": true, // JSON-NEXT: "IsTemplate": false, // JSON-NEXT: "Name": "void", // JSON-NEXT: "QualName": "void", // JSON-NEXT: "USR": "0000000000000000000000000000000000000000" // JSON-NEXT: }, // JSON-NEXT: "Template": { // JSON-NEXT: "Specialization": { // JSON-NEXT: "Parameters": [ // JSON-NEXT: { // JSON-NEXT: "Param": "bool" // JSON-NEXT: }, // JSON-NEXT: { // JSON-NEXT: "Param": "0", // JSON-NEXT: "SpecParamEnd": true // JSON-NEXT: } // JSON-NEXT: ], // JSON-NEXT: "SpecializationOf": "{{([0-9A-F]{40})}}", // JSON-NEXT: "VerticalDisplay": false // JSON-NEXT: } // JSON-NEXT: }, // HTML:
template <>
// HTML-NEXT:
void function<bool, 0> (bool x)
// HTML-NEXT:

Defined at line [[# @LINE - 65]] of file {{.*}}templates.cpp

// HTML-NEXT: // MD-MUSTACHE: ### function // MD-MUSTACHE: *void function(bool x)* // MD-MUSTACHE: *Defined at {{.*}}templates.cpp#[[# @LINE - 70]]* /// A Tuple type /// /// Does Tuple things. template struct tuple {}; // HTML-STRUCT:
// HTML-STRUCT-NEXT:
template <typename... Tys>
// HTML-STRUCT-NEXT:
// HTML-STRUCT-NEXT:

struct tuple

// HTML-STRUCT-NEXT:

Defined at line [[# @LINE - 6]] of file {{.*}}templates.cpp

// HTML-STRUCT-NEXT:
// HTML-STRUCT-NEXT:
// HTML-STRUCT-NEXT:

A Tuple type

// HTML-STRUCT-NEXT:
// HTML-STRUCT-NEXT:
// HTML-STRUCT-NEXT:

Does Tuple things.

// HTML-STRUCT-NEXT:
// HTML-STRUCT-NEXT:
// HTML-STRUCT-NEXT:
// HTML-STRUCT-NEXT:
/// A function with a tuple parameter /// /// \param t The input to func_with_tuple_param tuple func_with_tuple_param(tuple 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' // 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' // YAML-NEXT: USR: '{{([0-9A-F]{40})}}' // YAML-NEXT: Path: 'GlobalNamespace' // YAML-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 // JSON: "Name": "func_with_tuple_param", // JSON-NEXT: "Params": [ // JSON-NEXT: { // JSON-NEXT: "Name": "t", // JSON-NEXT: "ParamEnd": true, // JSON-NEXT: "Type": { // JSON-NEXT: "Name": "tuple", // JSON-NEXT: "Path": "GlobalNamespace", // JSON-NEXT: "QualName": "tuple", // JSON-NEXT: "USR": "{{([0-9A-F]{40})}}" // JSON-NEXT: } // JSON-NEXT: } // JSON-NEXT: ], // JSON-NEXT: "ReturnType": { // JSON-NEXT: "IsBuiltIn": false, // JSON-NEXT: "IsTemplate": false, // JSON-NEXT: "Name": "tuple", // JSON-NEXT: "QualName": "tuple", // JSON-NEXT: "USR": "{{([0-9A-F]{40})}}" // JSON-NEXT: }, // HTML:
tuple<int, int, bool> func_with_tuple_param (tuple<int, int, bool> t)
// HTML-NEXT:
// HTML-NEXT:
// HTML-NEXT:

A function with a tuple parameter

// HTML-NEXT:
// HTML-NEXT:
// HTML-NEXT:

Parameters

// HTML-NEXT:
// HTML-NEXT: t The input to func_with_tuple_param // HTML-NEXT:
// HTML-NEXT:
// HTML-NEXT:
// HTML-NEXT:

Defined at line [[# @LINE - 81]] of file {{.*}}templates.cpp

// HTML-NEXT: // MD-MUSTACHE: ### func_with_tuple_param // MD-MUSTACHE: *tuple func_with_tuple_param(tuple t)* // MD-MUSTACHE: *Defined at {{.*}}templates.cpp#[[# @LINE - 86]]* // MD-MUSTACHE: A function with a tuple parameter // MD-MUSTACHE: **t** The input to func_with_tuple_param