190631809SDmitri Gribenko // Note: the run lines follow their respective tests, since line/column numbers
290631809SDmitri Gribenko // matter in this test.
390631809SDmitri Gribenko
490631809SDmitri Gribenko /// This is T1.
590631809SDmitri Gribenko template<typename T>
T1(T t)690631809SDmitri Gribenko void T1(T t) { }
790631809SDmitri Gribenko
890631809SDmitri Gribenko /// This is T2.
990631809SDmitri Gribenko template<typename T>
T2(T t)1090631809SDmitri Gribenko void T2(T t) { }
1190631809SDmitri Gribenko
1290631809SDmitri Gribenko /// This is T2<int>.
1390631809SDmitri Gribenko template<>
T2(int t)1490631809SDmitri Gribenko void T2(int t) { }
1590631809SDmitri Gribenko
test_CC1()1690631809SDmitri Gribenko void test_CC1() {
1790631809SDmitri Gribenko
1890631809SDmitri Gribenko }
1990631809SDmitri Gribenko
2090631809SDmitri Gribenko // Check that implicit instantiations of class templates and members pick up
2190631809SDmitri Gribenko // comments from class templates and specializations.
2290631809SDmitri Gribenko
2390631809SDmitri Gribenko /// This is T3.
2490631809SDmitri Gribenko template<typename T>
2590631809SDmitri Gribenko class T3 {
2690631809SDmitri Gribenko public:
2790631809SDmitri Gribenko /// This is T4.
2890631809SDmitri Gribenko static void T4();
2990631809SDmitri Gribenko
3090631809SDmitri Gribenko /// This is T5.
3190631809SDmitri Gribenko static int T5;
3290631809SDmitri Gribenko
3390631809SDmitri Gribenko /// This is T6.
3490631809SDmitri Gribenko void T6();
3590631809SDmitri Gribenko
3690631809SDmitri Gribenko /// This is T7.
3790631809SDmitri Gribenko int T7;
3890631809SDmitri Gribenko
3990631809SDmitri Gribenko /// This is T8.
4090631809SDmitri Gribenko class T8 {};
4190631809SDmitri Gribenko
4290631809SDmitri Gribenko /// This is T9.
4390631809SDmitri Gribenko enum T9 {
4490631809SDmitri Gribenko /// This is T10.
4590631809SDmitri Gribenko T10
4690631809SDmitri Gribenko };
4790631809SDmitri Gribenko
4890631809SDmitri Gribenko /// This is T11.
4990631809SDmitri Gribenko template<typename U>
T11(U t)5090631809SDmitri Gribenko void T11(U t) {}
5190631809SDmitri Gribenko
5290631809SDmitri Gribenko typedef T3<double> T12;
5390631809SDmitri Gribenko };
5490631809SDmitri Gribenko
test_CC2_CC3_CC4()5590631809SDmitri Gribenko void test_CC2_CC3_CC4() {
5690631809SDmitri Gribenko T3<int>::T4();
5790631809SDmitri Gribenko T3<int> t3;
5890631809SDmitri Gribenko t3.T6();
5990631809SDmitri Gribenko T3<int>::T8 t8;
6090631809SDmitri Gribenko }
6190631809SDmitri Gribenko
6290631809SDmitri Gribenko /// This is T100.
6390631809SDmitri Gribenko template<typename T, typename U>
6490631809SDmitri Gribenko class T100 {
6590631809SDmitri Gribenko };
6690631809SDmitri Gribenko
6790631809SDmitri Gribenko /// This is T100<int, T>.
6890631809SDmitri Gribenko template<typename T>
6990631809SDmitri Gribenko class T100<int, T> {
7090631809SDmitri Gribenko public:
7190631809SDmitri Gribenko /// This is T101.
7290631809SDmitri Gribenko static void T101();
7390631809SDmitri Gribenko
7490631809SDmitri Gribenko /// This is T102.
7590631809SDmitri Gribenko static int T102;
7690631809SDmitri Gribenko
7790631809SDmitri Gribenko /// This is T103.
7890631809SDmitri Gribenko void T103();
7990631809SDmitri Gribenko
8090631809SDmitri Gribenko /// This is T104.
8190631809SDmitri Gribenko int T104;
8290631809SDmitri Gribenko
8390631809SDmitri Gribenko /// This is T105.
8490631809SDmitri Gribenko class T105 {};
8590631809SDmitri Gribenko
8690631809SDmitri Gribenko /// This is T106.
8790631809SDmitri Gribenko enum T106 {
8890631809SDmitri Gribenko /// This is T107.
8990631809SDmitri Gribenko T107
9090631809SDmitri Gribenko };
9190631809SDmitri Gribenko
9290631809SDmitri Gribenko /// This is T108.
9390631809SDmitri Gribenko template<typename U>
T108(U t)9490631809SDmitri Gribenko void T108(U t) {}
9590631809SDmitri Gribenko
9690631809SDmitri Gribenko typedef T100<double, T> T109;
9790631809SDmitri Gribenko
9890631809SDmitri Gribenko typedef T100<double, double> T110;
9990631809SDmitri Gribenko };
10090631809SDmitri Gribenko
test_CC5_CC6_CC7()10190631809SDmitri Gribenko void test_CC5_CC6_CC7() {
10290631809SDmitri Gribenko T100<int, long>::T101();
10390631809SDmitri Gribenko T100<int, long> t100;
10490631809SDmitri Gribenko t100.T103();
10590631809SDmitri Gribenko T100<int, long>::T105 t105;
10690631809SDmitri Gribenko }
10790631809SDmitri Gribenko
108*19ae1175STim Northover // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:17:1 %s | FileCheck -check-prefix=CHECK-CC1 %s
10990631809SDmitri Gribenko // CHECK-CC1: FunctionTemplate:{ResultType void}{TypedText T1}{{.*}}(brief comment: This is T1.)
11090631809SDmitri Gribenko // CHECK-CC1: FunctionTemplate:{ResultType void}{TypedText T2}{{.*}}(brief comment: This is T2.)
11190631809SDmitri Gribenko
112*19ae1175STim Northover // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:56:12 %s | FileCheck -check-prefix=CHECK-CC2 %s
11390631809SDmitri Gribenko // CHECK-CC2: CXXMethod:{ResultType void}{TypedText T4}{{.*}}(brief comment: This is T4.)
11490631809SDmitri Gribenko // CHECK-CC2: VarDecl:{ResultType int}{TypedText T5}{{.*}}(brief comment: This is T5.)
11590631809SDmitri Gribenko
116*19ae1175STim Northover // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:58:6 %s | FileCheck -check-prefix=CHECK-CC3 %s
11790631809SDmitri Gribenko // CHECK-CC3: FunctionTemplate:{ResultType void}{TypedText T11}{{.*}}(brief comment: This is T11.)
11890631809SDmitri Gribenko // CHECK-CC3: CXXMethod:{ResultType void}{TypedText T6}{{.*}}(brief comment: This is T6.)
11990631809SDmitri Gribenko // CHECK-CC3: FieldDecl:{ResultType int}{TypedText T7}{{.*}}(brief comment: This is T7.)
12090631809SDmitri Gribenko
121*19ae1175STim Northover // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:59:12 %s | FileCheck -check-prefix=CHECK-CC4 %s
12290631809SDmitri Gribenko // CHECK-CC4: EnumConstantDecl:{ResultType T3<int>::T9}{TypedText T10}{{.*}}(brief comment: This is T10.)
12390631809SDmitri Gribenko // FIXME: after we implement propagating comments through typedefs, this
12490631809SDmitri Gribenko // typedef for implicit instantiation should pick up the documentation
12590631809SDmitri Gribenko // comment from class template.
12690631809SDmitri Gribenko // CHECK-CC4: TypedefDecl:{TypedText T12}
12790631809SDmitri Gribenko // CHECK-CC4-SHOULD-BE: TypedefDecl:{TypedText T12}{{.*}}(brief comment: This is T3.)
12890631809SDmitri Gribenko // CHECK-CC4: ClassDecl:{TypedText T8}{{.*}}(brief comment: This is T8.)
12990631809SDmitri Gribenko // CHECK-CC4: EnumDecl:{TypedText T9}{{.*}}(brief comment: This is T9.)
13090631809SDmitri Gribenko
131*19ae1175STim Northover // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:102:20 %s | FileCheck -check-prefix=CHECK-CC5 %s
13290631809SDmitri Gribenko // CHECK-CC5: CXXMethod:{ResultType void}{TypedText T101}{{.*}}(brief comment: This is T101.)
13390631809SDmitri Gribenko // CHECK-CC5: VarDecl:{ResultType int}{TypedText T102}{{.*}}(brief comment: This is T102.)
13490631809SDmitri Gribenko
135*19ae1175STim Northover // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:104:8 %s | FileCheck -check-prefix=CHECK-CC6 %s
13690631809SDmitri Gribenko // CHECK-CC6: CXXMethod:{ResultType void}{TypedText T103}{{.*}}(brief comment: This is T103.)
13790631809SDmitri Gribenko // CHECK-CC6: FieldDecl:{ResultType int}{TypedText T104}{{.*}}(brief comment: This is T104.)
13890631809SDmitri Gribenko // CHECK-CC6: FunctionTemplate:{ResultType void}{TypedText T108}{{.*}}(brief comment: This is T108.)
13990631809SDmitri Gribenko
140*19ae1175STim Northover // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:105:20 %s | FileCheck -check-prefix=CHECK-CC7 %s
14190631809SDmitri Gribenko // CHECK-CC7: ClassDecl:{TypedText T105}{{.*}}(brief comment: This is T105.)
14290631809SDmitri Gribenko // CHECK-CC7: EnumDecl:{TypedText T106}{{.*}}(brief comment: This is T106.)
14390631809SDmitri Gribenko // CHECK-CC7: EnumConstantDecl:{ResultType T100<int, long>::T106}{TypedText T107}{{.*}}(brief comment: This is T107.)
14490631809SDmitri Gribenko // FIXME: after we implement propagating comments through typedefs, these two
14590631809SDmitri Gribenko // typedefs for implicit instantiations should pick up the documentation
14690631809SDmitri Gribenko // comment from class template.
14790631809SDmitri Gribenko // CHECK-CC7: TypedefDecl:{TypedText T109}
14890631809SDmitri Gribenko // CHECK-CC7: TypedefDecl:{TypedText T110}
14990631809SDmitri Gribenko // CHECK-CC7-SHOULD-BE: TypedefDecl:{TypedText T109}{{.*}}(brief comment: This is T100.)
15090631809SDmitri Gribenko // CHECK-CC7-SHOULD-BE: TypedefDecl:{TypedText T110}{{.*}}(brief comment: This is T100.)
15190631809SDmitri Gribenko
152