index-refs.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. namespace NS {
  2. extern int gx;
  3. typedef int MyInt;
  4. }
  5. enum {
  6. EnumVal = 1
  7. };
  8. NS::MyInt NS::gx = EnumVal;
  9. void foo() {
  10. NS::MyInt x;
  11. }
  12. enum {
  13. SecondVal = EnumVal
  14. };
  15. struct S {
  16. S& operator++();
  17. int operator*();
  18. S& operator=(int x);
  19. S& operator!=(int x);
  20. S& operator()(int x);
  21. };
  22. void foo2(S &s) {
  23. (void)++s;
  24. (void)*s;
  25. s = 3;
  26. (void)(s != 3);
  27. s(3);
  28. }
  29. namespace NS {
  30. namespace Inn {}
  31. typedef int Foo;
  32. }
  33. using namespace NS;
  34. using namespace NS::Inn;
  35. using NS::Foo;
  36. template <typename T1, typename T2>
  37. struct TS { };
  38. template <typename T>
  39. struct TS<T, int> {
  40. typedef int MyInt;
  41. };
  42. void foo3() {
  43. TS<int, int> s;
  44. }
  45. const int array_size = 3;
  46. typedef int some_arr[array_size];
  47. const int default_param = 3;
  48. void foo4(int p = default_param);
  49. struct S2 {
  50. int x,y;
  51. };
  52. void foo5() {
  53. struct S2 s = { .y = 1, .x = 4};
  54. }
  55. // RUN: c-index-test -index-file %s | FileCheck %s
  56. // CHECK: [indexDeclaration]: kind: namespace | name: NS
  57. // CHECK-NEXT: [indexDeclaration]: kind: variable | name: gx
  58. // CHECK-NEXT: [indexDeclaration]: kind: typedef | name: MyInt
  59. // CHECK-NEXT: [indexDeclaration]: kind: enum
  60. // CHECK-NEXT: [indexDeclaration]: kind: enumerator | name: EnumVal
  61. // CHECK-NEXT: [indexDeclaration]: kind: variable | name: gx
  62. // CHECK-NEXT: [indexEntityReference]: kind: namespace | name: NS
  63. // CHECK-NEXT: [indexEntityReference]: kind: typedef | name: MyInt
  64. // CHECK-NEXT: [indexEntityReference]: kind: namespace | name: NS
  65. // CHECK-NEXT: [indexEntityReference]: kind: enumerator | name: EnumVal
  66. // CHECK-NEXT: [indexDeclaration]: kind: function | name: foo
  67. // CHECK-NEXT: [indexEntityReference]: kind: namespace | name: NS
  68. // CHECK-NEXT: [indexEntityReference]: kind: typedef | name: MyInt
  69. // CHECK-NEXT: [indexDeclaration]: kind: enum
  70. // CHECK-NEXT: [indexDeclaration]: kind: enumerator | name: SecondVal
  71. // CHECK-NEXT: [indexEntityReference]: kind: enumerator | name: EnumVal
  72. // CHECK: [indexDeclaration]: kind: function | name: foo2
  73. // CHECK: [indexEntityReference]: kind: c++-instance-method | name: operator++
  74. // CHECK-NEXT: [indexEntityReference]: kind: c++-instance-method | name: operator*
  75. // CHECK-NEXT: [indexEntityReference]: kind: c++-instance-method | name: operator=
  76. // CHECK-NEXT: [indexEntityReference]: kind: c++-instance-method | name: operator!=
  77. // CHECK-NEXT: [indexEntityReference]: kind: c++-instance-method | name: operator()
  78. // CHECK: [indexEntityReference]: kind: namespace | name: NS | {{.*}} | loc: 42:17
  79. // CHECK-NEXT: [indexEntityReference]: kind: namespace | name: NS | {{.*}} | loc: 43:17
  80. // CHECK-NEXT: [indexEntityReference]: kind: namespace | name: Inn | {{.*}} | loc: 43:21
  81. // CHECK-NEXT: [indexEntityReference]: kind: namespace | name: NS | {{.*}} | loc: 44:7
  82. // CHECK-NEXT: [indexEntityReference]: kind: typedef | name: Foo | {{.*}} | loc: 44:11
  83. // CHECK: [indexDeclaration]: kind: c++-class-template | name: TS | {{.*}} | loc: 47:8
  84. // CHECK-NEXT: [indexDeclaration]: kind: struct-template-partial-spec | name: TS | USR: c:@SP>1#T@TS>#t0.0#I | {{.*}} | loc: 50:8
  85. // CHECK-NEXT: [indexDeclaration]: kind: typedef | name: MyInt | USR: c:index-refs.cpp@SP>1#T@TS>#t0.0#I@T@MyInt | {{.*}} | loc: 51:15 | semantic-container: [TS:50:8] | lexical-container: [TS:50:8]
  86. /* when indexing implicit instantiations
  87. [indexDeclaration]: kind: struct-template-spec | name: TS | USR: c:@S@TS>#I | {{.*}} | loc: 50:8
  88. [indexDeclaration]: kind: typedef | name: MyInt | USR: c:index-refs.cpp@593@S@TS>#I@T@MyInt | {{.*}} | loc: 51:15 | semantic-container: [TS:50:8] | lexical-container: [TS:50:8]
  89. */
  90. // CHECK-NEXT: [indexDeclaration]: kind: function | name: foo3
  91. /* when indexing implicit instantiations
  92. [indexEntityReference]: kind: struct-template-spec | name: TS | USR: c:@S@TS>#I | {{.*}} | loc: 55:3
  93. */
  94. // CHECK-NEXT: [indexEntityReference]: kind: c++-class-template | name: TS | USR: c:@ST>2#T#T@TS | {{.*}} | loc: 55:3
  95. // CHECK: [indexEntityReference]: kind: variable | name: array_size | {{.*}} | loc: 59:22
  96. // CHECK: [indexEntityReference]: kind: variable | name: default_param | {{.*}} | loc: 62:19
  97. // CHECK-NOT: [indexEntityReference]: kind: variable | name: default_param | {{.*}} | loc: 62:19
  98. // CHECK: [indexEntityReference]: kind: field | name: y | {{.*}} | loc: 69:20
  99. // CHECK-NEXT: [indexEntityReference]: kind: field | name: x | {{.*}} | loc: 69:28