xref: /aosp_15_r20/external/clang/test/Index/comment-cplus-template-decls.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: rm -rf %t
2*67e74705SXin Li // RUN: mkdir %t
3*67e74705SXin Li // RUN: c-index-test -test-load-source all -comments-xml-schema=%S/../../bindings/xml/comment-xml-schema.rng -target x86_64-apple-darwin10 std=c++11 %s > %t/out
4*67e74705SXin Li // RUN: FileCheck %s < %t/out
5*67e74705SXin Li 
6*67e74705SXin Li // Ensure that XML we generate is not invalid.
7*67e74705SXin Li // RUN: FileCheck %s -check-prefix=WRONG < %t/out
8*67e74705SXin Li // WRONG-NOT: CommentXMLInvalid
9*67e74705SXin Li // rdar://12378714
10*67e74705SXin Li 
11*67e74705SXin Li /**
12*67e74705SXin Li  * \brief Aaa
13*67e74705SXin Li */
14*67e74705SXin Li template<typename T> struct A {
15*67e74705SXin Li /**
16*67e74705SXin Li  * \brief Bbb
17*67e74705SXin Li */
18*67e74705SXin Li   A();
19*67e74705SXin Li /**
20*67e74705SXin Li  * \brief Ccc
21*67e74705SXin Li */
22*67e74705SXin Li   ~A();
23*67e74705SXin Li /**
24*67e74705SXin Li  * \brief Ddd
25*67e74705SXin Li */
fA26*67e74705SXin Li   void f() { }
27*67e74705SXin Li };
28*67e74705SXin Li // CHECK: <Declaration>template &lt;typename T&gt; struct A {}</Declaration>
29*67e74705SXin Li // CHECK: <Declaration>A&lt;T&gt;()</Declaration>
30*67e74705SXin Li // CHECK: <Declaration>~A&lt;T&gt;()</Declaration>
31*67e74705SXin Li 
32*67e74705SXin Li /**
33*67e74705SXin Li  * \Brief Eee
34*67e74705SXin Li */
35*67e74705SXin Li template <typename T> struct D : A<T> {
36*67e74705SXin Li /**
37*67e74705SXin Li  * \brief
38*67e74705SXin Li */
39*67e74705SXin Li   using A<T>::f;
40*67e74705SXin Li 
41*67e74705SXin Li   void f();
42*67e74705SXin Li };
43*67e74705SXin Li // CHECK: <Declaration>template &lt;typename T&gt; struct D :  A&lt;T&gt; {}</Declaration>
44*67e74705SXin Li // CHECK: <Declaration>using A&lt;T&gt;::f</Declaration>
45*67e74705SXin Li 
46*67e74705SXin Li struct Base {
47*67e74705SXin Li     int foo;
48*67e74705SXin Li };
49*67e74705SXin Li /**
50*67e74705SXin Li  * \brief
51*67e74705SXin Li */
52*67e74705SXin Li template<typename T> struct E : Base {
53*67e74705SXin Li /**
54*67e74705SXin Li  * \brief
55*67e74705SXin Li */
56*67e74705SXin Li   using Base::foo;
57*67e74705SXin Li };
58*67e74705SXin Li // CHECK: <Declaration>template &lt;typename T&gt; struct E :  Base {}</Declaration>
59*67e74705SXin Li // CHECK: <Declaration>using Base::foo</Declaration>
60*67e74705SXin Li 
61*67e74705SXin Li /// \tparam
62*67e74705SXin Li /// \param AAA Blah blah
63*67e74705SXin Li template<typename T>
64*67e74705SXin Li void func_template_1(T AAA);
65*67e74705SXin Li // CHECK: <Declaration>template &lt;typename T&gt; void func_template_1(T AAA)</Declaration>
66*67e74705SXin Li 
67*67e74705SXin Li template<template<template<typename CCC> class DDD, class BBB> class AAA>
68*67e74705SXin Li void func_template_2();
69*67e74705SXin Li // FIXME: There is not Declaration field in the generated output.
70*67e74705SXin Li 
71*67e74705SXin Li namespace rdar16128173 {
72*67e74705SXin Li // CHECK: <Declaration>template &lt;class PtrTy&gt; class OpaquePtr {}</Declaration>
73*67e74705SXin Li 
74*67e74705SXin Li /// \brief Wrapper for void* pointer.
75*67e74705SXin Li /// \tparam PtrTy Either a pointer type like 'T*' or a type that behaves like
76*67e74705SXin Li ///               a pointer.
77*67e74705SXin Li template <class PtrTy>
78*67e74705SXin Li class OpaquePtr {};
79*67e74705SXin Li 
80*67e74705SXin Li // CHECK: <Declaration>typedef OpaquePtr&lt;int&gt; DeclGroupPtrTy</Declaration>
81*67e74705SXin Li typedef OpaquePtr<int> DeclGroupPtrTy;
82*67e74705SXin Li 
83*67e74705SXin Li DeclGroupPtrTy blah;
84*67e74705SXin Li }
85