|  | // Note: the run lines follow their respective tests, since line/column numbers | 
|  | // matter in this test. | 
|  |  | 
|  | /// This is T1. | 
|  | template<typename T> | 
|  | void T1(T t) { } | 
|  |  | 
|  | /// This is T2. | 
|  | template<typename T> | 
|  | void T2(T t) { } | 
|  |  | 
|  | /// This is T2<int>. | 
|  | template<> | 
|  | void T2(int t) { } | 
|  |  | 
|  | void test_CC1() { | 
|  |  | 
|  | } | 
|  |  | 
|  | // Check that implicit instantiations of class templates and members pick up | 
|  | // comments from class templates and specializations. | 
|  |  | 
|  | /// This is T3. | 
|  | template<typename T> | 
|  | class T3 { | 
|  | public: | 
|  | /// This is T4. | 
|  | static void T4(); | 
|  |  | 
|  | /// This is T5. | 
|  | static int T5; | 
|  |  | 
|  | /// This is T6. | 
|  | void T6(); | 
|  |  | 
|  | /// This is T7. | 
|  | int T7; | 
|  |  | 
|  | /// This is T8. | 
|  | class T8 {}; | 
|  |  | 
|  | /// This is T9. | 
|  | enum T9 { | 
|  | /// This is T10. | 
|  | T10 | 
|  | }; | 
|  |  | 
|  | /// This is T11. | 
|  | template<typename U> | 
|  | void T11(U t) {} | 
|  |  | 
|  | typedef T3<double> T12; | 
|  | }; | 
|  |  | 
|  | void test_CC2_CC3_CC4() { | 
|  | T3<int>::T4(); | 
|  | T3<int> t3; | 
|  | t3.T6(); | 
|  | T3<int>::T8 t8; | 
|  | } | 
|  |  | 
|  | /// This is T100. | 
|  | template<typename T, typename U> | 
|  | class T100 { | 
|  | }; | 
|  |  | 
|  | /// This is T100<int, T>. | 
|  | template<typename T> | 
|  | class T100<int, T> { | 
|  | public: | 
|  | /// This is T101. | 
|  | static void T101(); | 
|  |  | 
|  | /// This is T102. | 
|  | static int T102; | 
|  |  | 
|  | /// This is T103. | 
|  | void T103(); | 
|  |  | 
|  | /// This is T104. | 
|  | int T104; | 
|  |  | 
|  | /// This is T105. | 
|  | class T105 {}; | 
|  |  | 
|  | /// This is T106. | 
|  | enum T106 { | 
|  | /// This is T107. | 
|  | T107 | 
|  | }; | 
|  |  | 
|  | /// This is T108. | 
|  | template<typename U> | 
|  | void T108(U t) {} | 
|  |  | 
|  | typedef T100<double, T> T109; | 
|  |  | 
|  | typedef T100<double, double> T110; | 
|  | }; | 
|  |  | 
|  | void test_CC5_CC6_CC7() { | 
|  | T100<int, long>::T101(); | 
|  | T100<int, long> t100; | 
|  | t100.T103(); | 
|  | T100<int, long>::T105 t105; | 
|  | } | 
|  |  | 
|  | // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:17:1 %s | FileCheck -check-prefix=CHECK-CC1 %s | 
|  | // CHECK-CC1: FunctionTemplate:{ResultType void}{TypedText T1}{{.*}}(brief comment: This is T1.) | 
|  | // CHECK-CC1: FunctionTemplate:{ResultType void}{TypedText T2}{{.*}}(brief comment: This is T2.) | 
|  |  | 
|  | // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:56:12 %s | FileCheck -check-prefix=CHECK-CC2 %s | 
|  | // CHECK-CC2: CXXMethod:{ResultType void}{TypedText T4}{{.*}}(brief comment: This is T4.) | 
|  | // CHECK-CC2: VarDecl:{ResultType int}{TypedText T5}{{.*}}(brief comment: This is T5.) | 
|  |  | 
|  | // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:58:6 %s | FileCheck -check-prefix=CHECK-CC3 %s | 
|  | // CHECK-CC3: FunctionTemplate:{ResultType void}{TypedText T11}{{.*}}(brief comment: This is T11.) | 
|  | // CHECK-CC3: CXXMethod:{ResultType void}{TypedText T6}{{.*}}(brief comment: This is T6.) | 
|  | // CHECK-CC3: FieldDecl:{ResultType int}{TypedText T7}{{.*}}(brief comment: This is T7.) | 
|  |  | 
|  | // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:59:12 %s | FileCheck -check-prefix=CHECK-CC4 %s | 
|  | // CHECK-CC4: EnumConstantDecl:{ResultType T3<int>::T9}{TypedText T10}{{.*}}(brief comment: This is T10.) | 
|  | // FIXME: after we implement propagating comments through typedefs, this | 
|  | // typedef for implicit instantiation should pick up the documentation | 
|  | // comment from class template. | 
|  | // CHECK-CC4: TypedefDecl:{TypedText T12} | 
|  | // CHECK-CC4-SHOULD-BE: TypedefDecl:{TypedText T12}{{.*}}(brief comment: This is T3.) | 
|  | // CHECK-CC4: ClassDecl:{TypedText T8}{{.*}}(brief comment: This is T8.) | 
|  | // CHECK-CC4: EnumDecl:{TypedText T9}{{.*}}(brief comment: This is T9.) | 
|  |  | 
|  | // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:102:20 %s | FileCheck -check-prefix=CHECK-CC5 %s | 
|  | // CHECK-CC5: CXXMethod:{ResultType void}{TypedText T101}{{.*}}(brief comment: This is T101.) | 
|  | // CHECK-CC5: VarDecl:{ResultType int}{TypedText T102}{{.*}}(brief comment: This is T102.) | 
|  |  | 
|  | // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:104:8 %s | FileCheck -check-prefix=CHECK-CC6 %s | 
|  | // CHECK-CC6: CXXMethod:{ResultType void}{TypedText T103}{{.*}}(brief comment: This is T103.) | 
|  | // CHECK-CC6: FieldDecl:{ResultType int}{TypedText T104}{{.*}}(brief comment: This is T104.) | 
|  | // CHECK-CC6: FunctionTemplate:{ResultType void}{TypedText T108}{{.*}}(brief comment: This is T108.) | 
|  |  | 
|  | // RUN: env CINDEXTEST_COMPLETION_BRIEF_COMMENTS=1 c-index-test -code-completion-at=%s:105:20 %s | FileCheck -check-prefix=CHECK-CC7 %s | 
|  | // CHECK-CC7: ClassDecl:{TypedText T105}{{.*}}(brief comment: This is T105.) | 
|  | // CHECK-CC7: EnumDecl:{TypedText T106}{{.*}}(brief comment: This is T106.) | 
|  | // CHECK-CC7: EnumConstantDecl:{ResultType T100<int, long>::T106}{TypedText T107}{{.*}}(brief comment: This is T107.) | 
|  | // FIXME: after we implement propagating comments through typedefs, these two | 
|  | // typedefs for implicit instantiations should pick up the documentation | 
|  | // comment from class template. | 
|  | // CHECK-CC7: TypedefDecl:{TypedText T109} | 
|  | // CHECK-CC7: TypedefDecl:{TypedText T110} | 
|  | // CHECK-CC7-SHOULD-BE: TypedefDecl:{TypedText T109}{{.*}}(brief comment: This is T100.) | 
|  | // CHECK-CC7-SHOULD-BE: TypedefDecl:{TypedText T110}{{.*}}(brief comment: This is T100.) | 
|  |  |