1*67e74705SXin Li // Note: the run lines follow their respective tests, since line/column numbers
2*67e74705SXin Li // matter in this test.
3*67e74705SXin Li
4*67e74705SXin Li /// This is T1.
5*67e74705SXin Li template<typename T>
T1(T t)6*67e74705SXin Li void T1(T t) { }
7*67e74705SXin Li
8*67e74705SXin Li /// This is T2.
9*67e74705SXin Li template<typename T>
T2(T t)10*67e74705SXin Li void T2(T t) { }
11*67e74705SXin Li
12*67e74705SXin Li /// This is T2<int>.
13*67e74705SXin Li template<>
T2(int t)14*67e74705SXin Li void T2(int t) { }
15*67e74705SXin Li
test_CC1()16*67e74705SXin Li void test_CC1() {
17*67e74705SXin Li
18*67e74705SXin Li }
19*67e74705SXin Li
20*67e74705SXin Li // Check that implicit instantiations of class templates and members pick up
21*67e74705SXin Li // comments from class templates and specializations.
22*67e74705SXin Li
23*67e74705SXin Li /// This is T3.
24*67e74705SXin Li template<typename T>
25*67e74705SXin Li class T3 {
26*67e74705SXin Li public:
27*67e74705SXin Li /// This is T4.
28*67e74705SXin Li static void T4();
29*67e74705SXin Li
30*67e74705SXin Li /// This is T5.
31*67e74705SXin Li static int T5;
32*67e74705SXin Li
33*67e74705SXin Li /// This is T6.
34*67e74705SXin Li void T6();
35*67e74705SXin Li
36*67e74705SXin Li /// This is T7.
37*67e74705SXin Li int T7;
38*67e74705SXin Li
39*67e74705SXin Li /// This is T8.
40*67e74705SXin Li class T8 {};
41*67e74705SXin Li
42*67e74705SXin Li /// This is T9.
43*67e74705SXin Li enum T9 {
44*67e74705SXin Li /// This is T10.
45*67e74705SXin Li T10
46*67e74705SXin Li };
47*67e74705SXin Li
48*67e74705SXin Li /// This is T11.
49*67e74705SXin Li template<typename U>
T11(U t)50*67e74705SXin Li void T11(U t) {}
51*67e74705SXin Li
52*67e74705SXin Li typedef T3<double> T12;
53*67e74705SXin Li };
54*67e74705SXin Li
test_CC2_CC3_CC4()55*67e74705SXin Li void test_CC2_CC3_CC4() {
56*67e74705SXin Li T3<int>::T4();
57*67e74705SXin Li T3<int> t3;
58*67e74705SXin Li t3.T6();
59*67e74705SXin Li T3<int>::T8 t8;
60*67e74705SXin Li }
61*67e74705SXin Li
62*67e74705SXin Li /// This is T100.
63*67e74705SXin Li template<typename T, typename U>
64*67e74705SXin Li class T100 {
65*67e74705SXin Li };
66*67e74705SXin Li
67*67e74705SXin Li /// This is T100<int, T>.
68*67e74705SXin Li template<typename T>
69*67e74705SXin Li class T100<int, T> {
70*67e74705SXin Li public:
71*67e74705SXin Li /// This is T101.
72*67e74705SXin Li static void T101();
73*67e74705SXin Li
74*67e74705SXin Li /// This is T102.
75*67e74705SXin Li static int T102;
76*67e74705SXin Li
77*67e74705SXin Li /// This is T103.
78*67e74705SXin Li void T103();
79*67e74705SXin Li
80*67e74705SXin Li /// This is T104.
81*67e74705SXin Li int T104;
82*67e74705SXin Li
83*67e74705SXin Li /// This is T105.
84*67e74705SXin Li class T105 {};
85*67e74705SXin Li
86*67e74705SXin Li /// This is T106.
87*67e74705SXin Li enum T106 {
88*67e74705SXin Li /// This is T107.
89*67e74705SXin Li T107
90*67e74705SXin Li };
91*67e74705SXin Li
92*67e74705SXin Li /// This is T108.
93*67e74705SXin Li template<typename U>
T108(U t)94*67e74705SXin Li void T108(U t) {}
95*67e74705SXin Li
96*67e74705SXin Li typedef T100<double, T> T109;
97*67e74705SXin Li
98*67e74705SXin Li typedef T100<double, double> T110;
99*67e74705SXin Li };
100*67e74705SXin Li
test_CC5_CC6_CC7()101*67e74705SXin Li void test_CC5_CC6_CC7() {
102*67e74705SXin Li T100<int, long>::T101();
103*67e74705SXin Li T100<int, long> t100;
104*67e74705SXin Li t100.T103();
105*67e74705SXin Li T100<int, long>::T105 t105;
106*67e74705SXin Li }
107*67e74705SXin Li
108*67e74705SXin Li // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:17:1 %s | FileCheck -check-prefix=CHECK-CC1 %s
109*67e74705SXin Li // CHECK-CC1: FunctionTemplate:{ResultType void}{TypedText T1}{{.*}}(brief comment: This is T1.)
110*67e74705SXin Li // CHECK-CC1: FunctionTemplate:{ResultType void}{TypedText T2}{{.*}}(brief comment: This is T2.)
111*67e74705SXin Li
112*67e74705SXin Li // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:56:12 %s | FileCheck -check-prefix=CHECK-CC2 %s
113*67e74705SXin Li // CHECK-CC2: CXXMethod:{ResultType void}{TypedText T4}{{.*}}(brief comment: This is T4.)
114*67e74705SXin Li // CHECK-CC2: VarDecl:{ResultType int}{TypedText T5}{{.*}}(brief comment: This is T5.)
115*67e74705SXin Li
116*67e74705SXin Li // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:58:6 %s | FileCheck -check-prefix=CHECK-CC3 %s
117*67e74705SXin Li // CHECK-CC3: FunctionTemplate:{ResultType void}{TypedText T11}{{.*}}(brief comment: This is T11.)
118*67e74705SXin Li // CHECK-CC3: CXXMethod:{ResultType void}{TypedText T6}{{.*}}(brief comment: This is T6.)
119*67e74705SXin Li // CHECK-CC3: FieldDecl:{ResultType int}{TypedText T7}{{.*}}(brief comment: This is T7.)
120*67e74705SXin Li
121*67e74705SXin Li // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:59:12 %s | FileCheck -check-prefix=CHECK-CC4 %s
122*67e74705SXin Li // CHECK-CC4: EnumConstantDecl:{ResultType T3<int>::T9}{TypedText T10}{{.*}}(brief comment: This is T10.)
123*67e74705SXin Li // FIXME: after we implement propagating comments through typedefs, this
124*67e74705SXin Li // typedef for implicit instantiation should pick up the documentation
125*67e74705SXin Li // comment from class template.
126*67e74705SXin Li // CHECK-CC4: TypedefDecl:{TypedText T12}
127*67e74705SXin Li // CHECK-CC4-SHOULD-BE: TypedefDecl:{TypedText T12}{{.*}}(brief comment: This is T3.)
128*67e74705SXin Li // CHECK-CC4: ClassDecl:{TypedText T8}{{.*}}(brief comment: This is T8.)
129*67e74705SXin Li // CHECK-CC4: EnumDecl:{TypedText T9}{{.*}}(brief comment: This is T9.)
130*67e74705SXin Li
131*67e74705SXin Li // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:102:20 %s | FileCheck -check-prefix=CHECK-CC5 %s
132*67e74705SXin Li // CHECK-CC5: CXXMethod:{ResultType void}{TypedText T101}{{.*}}(brief comment: This is T101.)
133*67e74705SXin Li // CHECK-CC5: VarDecl:{ResultType int}{TypedText T102}{{.*}}(brief comment: This is T102.)
134*67e74705SXin Li
135*67e74705SXin Li // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:104:8 %s | FileCheck -check-prefix=CHECK-CC6 %s
136*67e74705SXin Li // CHECK-CC6: CXXMethod:{ResultType void}{TypedText T103}{{.*}}(brief comment: This is T103.)
137*67e74705SXin Li // CHECK-CC6: FieldDecl:{ResultType int}{TypedText T104}{{.*}}(brief comment: This is T104.)
138*67e74705SXin Li // CHECK-CC6: FunctionTemplate:{ResultType void}{TypedText T108}{{.*}}(brief comment: This is T108.)
139*67e74705SXin Li
140*67e74705SXin Li // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:105:20 %s | FileCheck -check-prefix=CHECK-CC7 %s
141*67e74705SXin Li // CHECK-CC7: ClassDecl:{TypedText T105}{{.*}}(brief comment: This is T105.)
142*67e74705SXin Li // CHECK-CC7: EnumDecl:{TypedText T106}{{.*}}(brief comment: This is T106.)
143*67e74705SXin Li // CHECK-CC7: EnumConstantDecl:{ResultType T100<int, long>::T106}{TypedText T107}{{.*}}(brief comment: This is T107.)
144*67e74705SXin Li // FIXME: after we implement propagating comments through typedefs, these two
145*67e74705SXin Li // typedefs for implicit instantiations should pick up the documentation
146*67e74705SXin Li // comment from class template.
147*67e74705SXin Li // CHECK-CC7: TypedefDecl:{TypedText T109}
148*67e74705SXin Li // CHECK-CC7: TypedefDecl:{TypedText T110}
149*67e74705SXin Li // CHECK-CC7-SHOULD-BE: TypedefDecl:{TypedText T109}{{.*}}(brief comment: This is T100.)
150*67e74705SXin Li // CHECK-CC7-SHOULD-BE: TypedefDecl:{TypedText T110}{{.*}}(brief comment: This is T100.)
151*67e74705SXin Li
152