Douglas Gregor | 15417cf | 2010-11-03 00:35:38 +0000 | [diff] [blame] | 1 | // Test is line- and column-sensitive. Run lines are below. |
| 2 | |
| 3 | struct X { |
| 4 | X(); |
| 5 | X(int); |
| 6 | X(int, int); |
| 7 | X(const X&); |
| 8 | }; |
| 9 | |
| 10 | X getX(int value) { |
| 11 | switch (value) { |
| 12 | case 1: return X(value); |
| 13 | case 2: return X(value, value); |
| 14 | case 3: return (X)value; |
| 15 | default: break; |
| 16 | } |
| 17 | return X(); |
| 18 | } |
| 19 | |
Douglas Gregor | 30313cb | 2010-11-17 17:15:08 +0000 | [diff] [blame] | 20 | struct Y { |
| 21 | int member; |
| 22 | |
| 23 | X getX(); |
| 24 | }; |
| 25 | |
| 26 | X Y::getX() { |
| 27 | return member; |
| 28 | } |
| 29 | |
| 30 | struct YDerived : Y { |
| 31 | X getAnotherX() { return member; } |
| 32 | }; |
| 33 | |
Argyrios Kyrtzidis | d289104 | 2011-06-27 19:42:23 +0000 | [diff] [blame] | 34 | void test() { |
| 35 | X foo; |
Argyrios Kyrtzidis | 0fd8fae | 2011-12-03 03:49:44 +0000 | [diff] [blame] | 36 | |
| 37 | try { |
| 38 | } catch (X e) { |
| 39 | X x; |
| 40 | } |
Argyrios Kyrtzidis | fbb2bb5 | 2012-05-16 23:49:15 +0000 | [diff] [blame] | 41 | |
| 42 | struct LocalS { |
| 43 | void meth() { |
| 44 | int x; |
| 45 | ++x; |
| 46 | } |
| 47 | }; |
Argyrios Kyrtzidis | d289104 | 2011-06-27 19:42:23 +0000 | [diff] [blame] | 48 | } |
| 49 | |
Argyrios Kyrtzidis | 2ec7674 | 2013-04-05 21:04:10 +0000 | [diff] [blame] | 50 | template <bool (*tfn)(X*)> |
| 51 | struct TS { |
| 52 | void foo(); |
| 53 | }; |
| 54 | |
| 55 | template <bool (*tfn)(X*)> |
| 56 | void TS<tfn>::foo() {} |
| 57 | |
Argyrios Kyrtzidis | 40bcfd7 | 2013-04-22 23:23:42 +0000 | [diff] [blame] | 58 | template <typename T> |
| 59 | class TC { |
| 60 | void init(); |
| 61 | }; |
| 62 | |
| 63 | template<> void TC<char>::init(); |
| 64 | |
| 65 | #define EXTERN_TEMPLATE(...) extern template __VA_ARGS__; |
| 66 | EXTERN_TEMPLATE(class TC<char>) |
| 67 | |
Argyrios Kyrtzidis | a2a1e53 | 2014-08-26 20:23:26 +0000 | [diff] [blame] | 68 | class A { |
| 69 | A(); |
| 70 | virtual ~A(); |
| 71 | |
| 72 | // Assignment operators |
| 73 | A& operator=(const A&); |
| 74 | A& operator=(A&&) noexcept; |
| 75 | |
| 76 | // Unary operators |
| 77 | A operator+() const; |
| 78 | A operator-() const; |
| 79 | A operator~() const; |
| 80 | A operator*() const; |
| 81 | A operator&() const; |
| 82 | bool operator!() const; |
| 83 | |
| 84 | // (pre-|post-) increment and decrement |
| 85 | A& operator++(); |
| 86 | A& operator--(); |
| 87 | A operator++(int); |
| 88 | A operator--(int); |
| 89 | |
| 90 | // Arithmetic operators |
| 91 | A operator+(const A&) const; |
| 92 | A operator-(const A&) const; |
| 93 | A operator*(const A&) const; |
| 94 | A operator/(const A&) const; |
| 95 | A operator%(const A&) const; |
| 96 | A operator&(const A&) const; |
| 97 | A operator|(const A&) const; |
| 98 | A operator^(const A&) const; |
| 99 | |
| 100 | A operator<<(const A&) const; |
| 101 | A operator>>(const A&) const; |
| 102 | |
| 103 | // Arithmetic-assignment operators |
| 104 | A& operator+=(const A&); |
| 105 | A& operator-=(const A&); |
| 106 | A& operator*=(const A&); |
| 107 | A& operator/=(const A&); |
| 108 | A& operator%=(const A&); |
| 109 | A& operator&=(const A&); |
| 110 | A& operator|=(const A&); |
| 111 | A& operator^=(const A&); |
| 112 | |
| 113 | A& operator<<=(const A&); |
| 114 | A& operator>>=(const A&); |
| 115 | |
| 116 | // Logical operators |
| 117 | bool operator<(const A&) const; |
| 118 | bool operator>(const A&) const; |
| 119 | |
| 120 | bool operator&&(const A&) const; |
| 121 | bool operator||(const A&) const; |
| 122 | bool operator<=(const A&) const; |
| 123 | bool operator>=(const A&) const; |
| 124 | bool operator!=(const A&) const; |
| 125 | bool operator==(const A&) const; |
| 126 | |
| 127 | // Special operators |
| 128 | A& operator[](unsigned long long); |
| 129 | A* operator->(); |
| 130 | A operator()(unsigned, int) const; |
| 131 | |
| 132 | explicit operator bool() const; |
| 133 | }; |
| 134 | |
Douglas Gregor | 3f35bb2 | 2011-08-04 20:04:59 +0000 | [diff] [blame] | 135 | // RUN: c-index-test -cursor-at=%s:6:4 %s | FileCheck -check-prefix=CHECK-COMPLETION-1 %s |
| 136 | // CHECK-COMPLETION-1: CXXConstructor=X:6:3 |
| 137 | // CHECK-COMPLETION-1-NEXT: Completion string: {TypedText X}{LeftParen (}{Placeholder int}{Comma , }{Placeholder int}{RightParen )} |
| 138 | |
| 139 | // RUN: c-index-test -cursor-at=%s:31:16 %s | FileCheck -check-prefix=CHECK-COMPLETION-2 %s |
| 140 | // CHECK-COMPLETION-2: CXXMethod=getAnotherX:31:5 (Definition) |
| 141 | // CHECK-COMPLETION-2-NEXT: Completion string: {ResultType X}{TypedText getAnotherX}{LeftParen (}{RightParen )} |
| 142 | |
Douglas Gregor | 15417cf | 2010-11-03 00:35:38 +0000 | [diff] [blame] | 143 | // RUN: c-index-test -cursor-at=%s:12:20 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s |
| 144 | // RUN: c-index-test -cursor-at=%s:13:21 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s |
| 145 | // RUN: c-index-test -cursor-at=%s:13:28 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s |
| 146 | // RUN: c-index-test -cursor-at=%s:14:23 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s |
| 147 | // CHECK-VALUE-REF: DeclRefExpr=value:10:12 |
| 148 | |
Douglas Gregor | 16443fd | 2010-11-05 21:11:19 +0000 | [diff] [blame] | 149 | // RUN: c-index-test -cursor-at=%s:12:18 %s | FileCheck -check-prefix=CHECK-CONSTRUCTOR1 %s |
| 150 | // RUN: c-index-test -cursor-at=%s:13:18 %s | FileCheck -check-prefix=CHECK-CONSTRUCTOR2 %s |
| 151 | // RUN: c-index-test -cursor-at=%s:14:19 %s | FileCheck -check-prefix=CHECK-CONSTRUCTOR1 %s |
| 152 | // RUN: c-index-test -cursor-at=%s:17:10 %s | FileCheck -check-prefix=CHECK-CONSTRUCTOR3 %s |
Douglas Gregor | 15417cf | 2010-11-03 00:35:38 +0000 | [diff] [blame] | 153 | // CHECK-TYPE-REF: TypeRef=struct X:3:8 |
Douglas Gregor | 16443fd | 2010-11-05 21:11:19 +0000 | [diff] [blame] | 154 | // CHECK-CONSTRUCTOR1: CallExpr=X:5:3 |
| 155 | // CHECK-CONSTRUCTOR2: CallExpr=X:6:3 |
| 156 | // CHECK-CONSTRUCTOR3: CallExpr=X:4:3 |
Douglas Gregor | 30313cb | 2010-11-17 17:15:08 +0000 | [diff] [blame] | 157 | |
| 158 | // RUN: c-index-test -cursor-at=%s:23:3 %s | FileCheck -check-prefix=CHECK-RETTYPE %s |
| 159 | // RUN: c-index-test -cursor-at=%s:26:1 %s | FileCheck -check-prefix=CHECK-RETTYPE %s |
| 160 | // CHECK-RETTYPE: TypeRef=struct X:3:8 |
| 161 | |
| 162 | // RUN: c-index-test -cursor-at=%s:23:7 %s | FileCheck -check-prefix=CHECK-MEMFUNC-DECL %s |
| 163 | // CHECK-MEMFUNC-DECL: CXXMethod=getX:23:5 |
| 164 | // RUN: c-index-test -cursor-at=%s:26:7 %s | FileCheck -check-prefix=CHECK-MEMFUNC-DEF %s |
| 165 | // CHECK-MEMFUNC-DEF: CXXMethod=getX:26:6 |
| 166 | |
| 167 | // RUN: c-index-test -cursor-at=%s:26:3 %s | FileCheck -check-prefix=CHECK-TYPEREF-Y %s |
| 168 | // CHECK-TYPEREF-Y: TypeRef=struct Y:20:8 |
| 169 | |
| 170 | // RUN: c-index-test -cursor-at=%s:27:10 %s | FileCheck -check-prefix=CHECK-IMPLICIT-MEMREF %s |
| 171 | // RUN: c-index-test -cursor-at=%s:31:28 %s | FileCheck -check-prefix=CHECK-IMPLICIT-MEMREF %s |
| 172 | // CHECK-IMPLICIT-MEMREF: MemberRefExpr=member:21:7 |
Argyrios Kyrtzidis | d289104 | 2011-06-27 19:42:23 +0000 | [diff] [blame] | 173 | |
| 174 | // RUN: c-index-test -cursor-at=%s:35:5 %s | FileCheck -check-prefix=CHECK-DECL %s |
| 175 | // CHECK-DECL: VarDecl=foo:35:5 |
Douglas Gregor | 3f35bb2 | 2011-08-04 20:04:59 +0000 | [diff] [blame] | 176 | |
| 177 | // RUN: c-index-test -cursor-at=%s:21:3 %s | FileCheck -check-prefix=CHECK-MEMBER %s |
| 178 | // CHECK-MEMBER: FieldDecl=member:21:7 (Definition) |
| 179 | // CHECK-MEMBER-NEXT: Completion string: {ResultType int}{TypedText member} |
Argyrios Kyrtzidis | 0fd8fae | 2011-12-03 03:49:44 +0000 | [diff] [blame] | 180 | |
| 181 | // RUN: c-index-test -cursor-at=%s:38:12 -cursor-at=%s:39:5 %s | FileCheck -check-prefix=CHECK-CXXCATCH %s |
| 182 | // CHECK-CXXCATCH: TypeRef=struct X:3:8 |
| 183 | // CHECK-CXXCATCH-NEXT: TypeRef=struct X:3:8 |
Argyrios Kyrtzidis | 0042b6f | 2011-12-03 03:49:47 +0000 | [diff] [blame] | 184 | |
| 185 | // RUN: c-index-test -test-load-source-usrs local %s | FileCheck -check-prefix=CHECK-USR %s |
| 186 | // CHECK-USR: get-cursor.cpp c:get-cursor.cpp@472@F@test#@e Extent=[38:12 - 38:15] |
| 187 | // CHECK-USR: get-cursor.cpp c:get-cursor.cpp@483@F@test#@x Extent=[39:5 - 39:8] |
Argyrios Kyrtzidis | fbb2bb5 | 2012-05-16 23:49:15 +0000 | [diff] [blame] | 188 | |
| 189 | // RUN: c-index-test -cursor-at=%s:45:9 %s | FileCheck -check-prefix=CHECK-LOCALCLASS %s |
| 190 | // CHECK-LOCALCLASS: 45:9 DeclRefExpr=x:44:11 Extent=[45:9 - 45:10] Spelling=x ([45:9 - 45:10]) |
Argyrios Kyrtzidis | 2ec7674 | 2013-04-05 21:04:10 +0000 | [diff] [blame] | 191 | |
| 192 | // RUN: c-index-test -cursor-at=%s:50:23 -cursor-at=%s:55:23 %s | FileCheck -check-prefix=CHECK-TEMPLPARAM %s |
| 193 | // CHECK-TEMPLPARAM: 50:23 TypeRef=struct X:3:8 Extent=[50:23 - 50:24] Spelling=struct X ([50:23 - 50:24]) |
| 194 | // CHECK-TEMPLPARAM: 55:23 TypeRef=struct X:3:8 Extent=[55:23 - 55:24] Spelling=struct X ([55:23 - 55:24]) |
Argyrios Kyrtzidis | 40bcfd7 | 2013-04-22 23:23:42 +0000 | [diff] [blame] | 195 | |
| 196 | // RUN: c-index-test -cursor-at=%s:66:23 %s | FileCheck -check-prefix=CHECK-TEMPLSPEC %s |
| 197 | // CHECK-TEMPLSPEC: 66:23 ClassDecl=TC:66:23 (Definition) [Specialization of TC:59:7] Extent=[66:1 - 66:31] Spelling=TC ([66:23 - 66:25]) |
Argyrios Kyrtzidis | a2a1e53 | 2014-08-26 20:23:26 +0000 | [diff] [blame] | 198 | |
| 199 | // RUN: c-index-test -cursor-at=%s:69:3 -cursor-at=%s:70:11 -cursor-at=%s:73:6 -cursor-at=%s:74:6 -cursor-at=%s:77:8 -cursor-at=%s:78:8 -cursor-at=%s:79:8 -cursor-at=%s:80:8 -cursor-at=%s:81:8 -cursor-at=%s:82:8 -cursor-at=%s:85:6 -cursor-at=%s:86:6 -cursor-at=%s:87:6 -cursor-at=%s:88:6 -cursor-at=%s:91:5 -cursor-at=%s:92:5 -cursor-at=%s:93:5 -cursor-at=%s:94:5 -cursor-at=%s:95:5 -cursor-at=%s:96:5 -cursor-at=%s:97:5 -cursor-at=%s:98:5 -cursor-at=%s:100:5 -cursor-at=%s:101:5 -cursor-at=%s:104:6 -cursor-at=%s:105:6 -cursor-at=%s:106:6 -cursor-at=%s:107:6 -cursor-at=%s:108:6 -cursor-at=%s:109:6 -cursor-at=%s:110:6 -cursor-at=%s:111:6 -cursor-at=%s:113:6 -cursor-at=%s:114:6 -cursor-at=%s:117:8 -cursor-at=%s:118:8 -cursor-at=%s:120:8 -cursor-at=%s:121:8 -cursor-at=%s:122:8 -cursor-at=%s:123:8 -cursor-at=%s:124:8 -cursor-at=%s:125:8 -cursor-at=%s:128:6 -cursor-at=%s:129:6 -cursor-at=%s:130:6 -cursor-at=%s:132:3 -std=c++11 %s | FileCheck -check-prefix=CHECK-SPELLING %s |
| 200 | // CHECK-SPELLING: 69:3 CXXConstructor=A:69:3 Extent=[69:3 - 69:6] Spelling=A ([69:3 - 69:4]) |
| 201 | // CHECK-SPELLING: 70:11 CXXDestructor=~A:70:11 (virtual) Extent=[70:3 - 70:15] Spelling=~A ([70:11 - 70:13]) |
| 202 | // CHECK-SPELLING: 73:6 CXXMethod=operator=:73:6 Extent=[73:3 - 73:25] Spelling=operator= ([73:6 - 73:15]) |
| 203 | // CHECK-SPELLING: 74:6 CXXMethod=operator=:74:6 Extent=[74:3 - 74:29] Spelling=operator= ([74:6 - 74:15]) |
| 204 | // CHECK-SPELLING: 77:8 CXXMethod=operator+:77:8 (const) Extent=[77:3 - 77:25] Spelling=operator+ ([77:8 - 77:17]) |
| 205 | // CHECK-SPELLING: 78:8 CXXMethod=operator-:78:8 (const) Extent=[78:3 - 78:25] Spelling=operator- ([78:8 - 78:17]) |
| 206 | // CHECK-SPELLING: 79:8 CXXMethod=operator~:79:8 (const) Extent=[79:3 - 79:25] Spelling=operator~ ([79:8 - 79:17]) |
| 207 | // CHECK-SPELLING: 80:8 CXXMethod=operator*:80:8 (const) Extent=[80:3 - 80:25] Spelling=operator* ([80:8 - 80:17]) |
| 208 | // CHECK-SPELLING: 81:8 CXXMethod=operator&:81:8 (const) Extent=[81:3 - 81:25] Spelling=operator& ([81:8 - 81:17]) |
| 209 | // CHECK-SPELLING: 82:8 CXXMethod=operator!:82:8 (const) Extent=[82:3 - 82:25] Spelling=operator! ([82:8 - 82:17]) |
| 210 | // CHECK-SPELLING: 85:6 CXXMethod=operator++:85:6 Extent=[85:3 - 85:18] Spelling=operator++ ([85:6 - 85:16]) |
| 211 | // CHECK-SPELLING: 86:6 CXXMethod=operator--:86:6 Extent=[86:3 - 86:18] Spelling=operator-- ([86:6 - 86:16]) |
| 212 | // CHECK-SPELLING: 87:6 CXXMethod=operator++:87:6 Extent=[87:3 - 87:21] Spelling=operator++ ([87:6 - 87:16]) |
| 213 | // CHECK-SPELLING: 88:6 CXXMethod=operator--:88:6 Extent=[88:3 - 88:21] Spelling=operator-- ([88:6 - 88:16]) |
| 214 | // CHECK-SPELLING: 91:5 CXXMethod=operator+:91:5 (const) Extent=[91:3 - 91:30] Spelling=operator+ ([91:5 - 91:14]) |
| 215 | // CHECK-SPELLING: 92:5 CXXMethod=operator-:92:5 (const) Extent=[92:3 - 92:30] Spelling=operator- ([92:5 - 92:14]) |
| 216 | // CHECK-SPELLING: 93:5 CXXMethod=operator*:93:5 (const) Extent=[93:3 - 93:30] Spelling=operator* ([93:5 - 93:14]) |
| 217 | // CHECK-SPELLING: 94:5 CXXMethod=operator/:94:5 (const) Extent=[94:3 - 94:30] Spelling=operator/ ([94:5 - 94:14]) |
| 218 | // CHECK-SPELLING: 95:5 CXXMethod=operator%:95:5 (const) Extent=[95:3 - 95:30] Spelling=operator% ([95:5 - 95:14]) |
| 219 | // CHECK-SPELLING: 96:5 CXXMethod=operator&:96:5 (const) Extent=[96:3 - 96:30] Spelling=operator& ([96:5 - 96:14]) |
| 220 | // CHECK-SPELLING: 97:5 CXXMethod=operator|:97:5 (const) Extent=[97:3 - 97:30] Spelling=operator| ([97:5 - 97:14]) |
| 221 | // CHECK-SPELLING: 98:5 CXXMethod=operator^:98:5 (const) Extent=[98:3 - 98:30] Spelling=operator^ ([98:5 - 98:14]) |
| 222 | // CHECK-SPELLING: 100:5 CXXMethod=operator<<:100:5 (const) Extent=[100:3 - 100:31] Spelling=operator<< ([100:5 - 100:15]) |
| 223 | // CHECK-SPELLING: 101:5 CXXMethod=operator>>:101:5 (const) Extent=[101:3 - 101:31] Spelling=operator>> ([101:5 - 101:15]) |
| 224 | // CHECK-SPELLING: 104:6 CXXMethod=operator+=:104:6 Extent=[104:3 - 104:26] Spelling=operator+= ([104:6 - 104:16]) |
| 225 | // CHECK-SPELLING: 105:6 CXXMethod=operator-=:105:6 Extent=[105:3 - 105:26] Spelling=operator-= ([105:6 - 105:16]) |
| 226 | // CHECK-SPELLING: 106:6 CXXMethod=operator*=:106:6 Extent=[106:3 - 106:26] Spelling=operator*= ([106:6 - 106:16]) |
| 227 | // CHECK-SPELLING: 107:6 CXXMethod=operator/=:107:6 Extent=[107:3 - 107:26] Spelling=operator/= ([107:6 - 107:16]) |
| 228 | // CHECK-SPELLING: 108:6 CXXMethod=operator%=:108:6 Extent=[108:3 - 108:26] Spelling=operator%= ([108:6 - 108:16]) |
| 229 | // CHECK-SPELLING: 109:6 CXXMethod=operator&=:109:6 Extent=[109:3 - 109:26] Spelling=operator&= ([109:6 - 109:16]) |
| 230 | // CHECK-SPELLING: 110:6 CXXMethod=operator|=:110:6 Extent=[110:3 - 110:26] Spelling=operator|= ([110:6 - 110:16]) |
| 231 | // CHECK-SPELLING: 111:6 CXXMethod=operator^=:111:6 Extent=[111:3 - 111:26] Spelling=operator^= ([111:6 - 111:16]) |
| 232 | // CHECK-SPELLING: 113:6 CXXMethod=operator<<=:113:6 Extent=[113:3 - 113:27] Spelling=operator<<= ([113:6 - 113:17]) |
| 233 | // CHECK-SPELLING: 114:6 CXXMethod=operator>>=:114:6 Extent=[114:3 - 114:27] Spelling=operator>>= ([114:6 - 114:17]) |
| 234 | // CHECK-SPELLING: 117:8 CXXMethod=operator<:117:8 (const) Extent=[117:3 - 117:33] Spelling=operator< ([117:8 - 117:17]) |
| 235 | // CHECK-SPELLING: 118:8 CXXMethod=operator>:118:8 (const) Extent=[118:3 - 118:33] Spelling=operator> ([118:8 - 118:17]) |
| 236 | // CHECK-SPELLING: 120:8 CXXMethod=operator&&:120:8 (const) Extent=[120:3 - 120:34] Spelling=operator&& ([120:8 - 120:18]) |
| 237 | // CHECK-SPELLING: 121:8 CXXMethod=operator||:121:8 (const) Extent=[121:3 - 121:34] Spelling=operator|| ([121:8 - 121:18]) |
| 238 | // CHECK-SPELLING: 122:8 CXXMethod=operator<=:122:8 (const) Extent=[122:3 - 122:34] Spelling=operator<= ([122:8 - 122:18]) |
| 239 | // CHECK-SPELLING: 123:8 CXXMethod=operator>=:123:8 (const) Extent=[123:3 - 123:34] Spelling=operator>= ([123:8 - 123:18]) |
| 240 | // CHECK-SPELLING: 124:8 CXXMethod=operator!=:124:8 (const) Extent=[124:3 - 124:34] Spelling=operator!= ([124:8 - 124:18]) |
| 241 | // CHECK-SPELLING: 125:8 CXXMethod=operator==:125:8 (const) Extent=[125:3 - 125:34] Spelling=operator== ([125:8 - 125:18]) |
| 242 | // CHECK-SPELLING: 128:6 CXXMethod=operator[]:128:6 Extent=[128:3 - 128:36] Spelling=operator[] ([128:6 - 128:16]) |
| 243 | // CHECK-SPELLING: 129:6 CXXMethod=operator->:129:6 Extent=[129:3 - 129:18] Spelling=operator-> ([129:6 - 129:16]) |
| 244 | // CHECK-SPELLING: 130:6 CXXMethod=operator():130:6 (const) Extent=[130:3 - 130:37] Spelling=operator() ([130:6 - 130:16]) |
| 245 | // CHECK-SPELLING: 132:12 CXXConversion=operator bool:132:12 (const) Extent=[132:3 - 132:33] Spelling=operator bool ([132:12 - 132:25]) |