115417cfaSDouglas Gregor // Test is line- and column-sensitive. Run lines are below. 215417cfaSDouglas Gregor 315417cfaSDouglas Gregor struct X { 415417cfaSDouglas Gregor X(); 515417cfaSDouglas Gregor X(int); 615417cfaSDouglas Gregor X(int, int); 715417cfaSDouglas Gregor X(const X&); 815417cfaSDouglas Gregor }; 915417cfaSDouglas Gregor 1015417cfaSDouglas Gregor X getX(int value) { 1115417cfaSDouglas Gregor switch (value) { 1215417cfaSDouglas Gregor case 1: return X(value); 1315417cfaSDouglas Gregor case 2: return X(value, value); 1415417cfaSDouglas Gregor case 3: return (X)value; 1515417cfaSDouglas Gregor default: break; 1615417cfaSDouglas Gregor } 1715417cfaSDouglas Gregor return X(); 1815417cfaSDouglas Gregor } 1915417cfaSDouglas Gregor 2030313cbbSDouglas Gregor struct Y { 2130313cbbSDouglas Gregor int member; 2230313cbbSDouglas Gregor 2330313cbbSDouglas Gregor X getX(); 2430313cbbSDouglas Gregor }; 2530313cbbSDouglas Gregor 2630313cbbSDouglas Gregor X Y::getX() { 2730313cbbSDouglas Gregor return member; 2830313cbbSDouglas Gregor } 2930313cbbSDouglas Gregor 3030313cbbSDouglas Gregor struct YDerived : Y { 3130313cbbSDouglas Gregor X getAnotherX() { return member; } 3230313cbbSDouglas Gregor }; 3330313cbbSDouglas Gregor 34d289104eSArgyrios Kyrtzidis void test() { 35d289104eSArgyrios Kyrtzidis X foo; 360fd8fae0SArgyrios Kyrtzidis 370fd8fae0SArgyrios Kyrtzidis try { 380fd8fae0SArgyrios Kyrtzidis } catch (X e) { 390fd8fae0SArgyrios Kyrtzidis X x; 400fd8fae0SArgyrios Kyrtzidis } 41fbb2bb5aSArgyrios Kyrtzidis 42fbb2bb5aSArgyrios Kyrtzidis struct LocalS { 43fbb2bb5aSArgyrios Kyrtzidis void meth() { 44fbb2bb5aSArgyrios Kyrtzidis int x; 45fbb2bb5aSArgyrios Kyrtzidis ++x; 46fbb2bb5aSArgyrios Kyrtzidis } 47fbb2bb5aSArgyrios Kyrtzidis }; 48d289104eSArgyrios Kyrtzidis } 49d289104eSArgyrios Kyrtzidis 502ec76747SArgyrios Kyrtzidis template <bool (*tfn)(X*)> 512ec76747SArgyrios Kyrtzidis struct TS { 522ec76747SArgyrios Kyrtzidis void foo(); 532ec76747SArgyrios Kyrtzidis }; 542ec76747SArgyrios Kyrtzidis 552ec76747SArgyrios Kyrtzidis template <bool (*tfn)(X*)> 562ec76747SArgyrios Kyrtzidis void TS<tfn>::foo() {} 572ec76747SArgyrios Kyrtzidis 58*40bcfd71SArgyrios Kyrtzidis template <typename T> 59*40bcfd71SArgyrios Kyrtzidis class TC { 60*40bcfd71SArgyrios Kyrtzidis void init(); 61*40bcfd71SArgyrios Kyrtzidis }; 62*40bcfd71SArgyrios Kyrtzidis 63*40bcfd71SArgyrios Kyrtzidis template<> void TC<char>::init(); 64*40bcfd71SArgyrios Kyrtzidis 65*40bcfd71SArgyrios Kyrtzidis #define EXTERN_TEMPLATE(...) extern template __VA_ARGS__; 66*40bcfd71SArgyrios Kyrtzidis EXTERN_TEMPLATE(class TC<char>) 67*40bcfd71SArgyrios Kyrtzidis 683f35bb2dSDouglas Gregor // RUN: c-index-test -cursor-at=%s:6:4 %s | FileCheck -check-prefix=CHECK-COMPLETION-1 %s 693f35bb2dSDouglas Gregor // CHECK-COMPLETION-1: CXXConstructor=X:6:3 703f35bb2dSDouglas Gregor // CHECK-COMPLETION-1-NEXT: Completion string: {TypedText X}{LeftParen (}{Placeholder int}{Comma , }{Placeholder int}{RightParen )} 713f35bb2dSDouglas Gregor 723f35bb2dSDouglas Gregor // RUN: c-index-test -cursor-at=%s:31:16 %s | FileCheck -check-prefix=CHECK-COMPLETION-2 %s 733f35bb2dSDouglas Gregor // CHECK-COMPLETION-2: CXXMethod=getAnotherX:31:5 (Definition) 743f35bb2dSDouglas Gregor // CHECK-COMPLETION-2-NEXT: Completion string: {ResultType X}{TypedText getAnotherX}{LeftParen (}{RightParen )} 753f35bb2dSDouglas Gregor 7615417cfaSDouglas Gregor // RUN: c-index-test -cursor-at=%s:12:20 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s 7715417cfaSDouglas Gregor // RUN: c-index-test -cursor-at=%s:13:21 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s 7815417cfaSDouglas Gregor // RUN: c-index-test -cursor-at=%s:13:28 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s 7915417cfaSDouglas Gregor // RUN: c-index-test -cursor-at=%s:14:23 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s 8015417cfaSDouglas Gregor // CHECK-VALUE-REF: DeclRefExpr=value:10:12 8115417cfaSDouglas Gregor 8216443fddSDouglas Gregor // RUN: c-index-test -cursor-at=%s:12:18 %s | FileCheck -check-prefix=CHECK-CONSTRUCTOR1 %s 8316443fddSDouglas Gregor // RUN: c-index-test -cursor-at=%s:13:18 %s | FileCheck -check-prefix=CHECK-CONSTRUCTOR2 %s 8416443fddSDouglas Gregor // RUN: c-index-test -cursor-at=%s:14:19 %s | FileCheck -check-prefix=CHECK-CONSTRUCTOR1 %s 8516443fddSDouglas Gregor // RUN: c-index-test -cursor-at=%s:17:10 %s | FileCheck -check-prefix=CHECK-CONSTRUCTOR3 %s 8615417cfaSDouglas Gregor // CHECK-TYPE-REF: TypeRef=struct X:3:8 8716443fddSDouglas Gregor // CHECK-CONSTRUCTOR1: CallExpr=X:5:3 8816443fddSDouglas Gregor // CHECK-CONSTRUCTOR2: CallExpr=X:6:3 8916443fddSDouglas Gregor // CHECK-CONSTRUCTOR3: CallExpr=X:4:3 9030313cbbSDouglas Gregor 9130313cbbSDouglas Gregor // RUN: c-index-test -cursor-at=%s:23:3 %s | FileCheck -check-prefix=CHECK-RETTYPE %s 9230313cbbSDouglas Gregor // RUN: c-index-test -cursor-at=%s:26:1 %s | FileCheck -check-prefix=CHECK-RETTYPE %s 9330313cbbSDouglas Gregor // CHECK-RETTYPE: TypeRef=struct X:3:8 9430313cbbSDouglas Gregor 9530313cbbSDouglas Gregor // RUN: c-index-test -cursor-at=%s:23:7 %s | FileCheck -check-prefix=CHECK-MEMFUNC-DECL %s 9630313cbbSDouglas Gregor // CHECK-MEMFUNC-DECL: CXXMethod=getX:23:5 9730313cbbSDouglas Gregor // RUN: c-index-test -cursor-at=%s:26:7 %s | FileCheck -check-prefix=CHECK-MEMFUNC-DEF %s 9830313cbbSDouglas Gregor // CHECK-MEMFUNC-DEF: CXXMethod=getX:26:6 9930313cbbSDouglas Gregor 10030313cbbSDouglas Gregor // RUN: c-index-test -cursor-at=%s:26:3 %s | FileCheck -check-prefix=CHECK-TYPEREF-Y %s 10130313cbbSDouglas Gregor // CHECK-TYPEREF-Y: TypeRef=struct Y:20:8 10230313cbbSDouglas Gregor 10330313cbbSDouglas Gregor // RUN: c-index-test -cursor-at=%s:27:10 %s | FileCheck -check-prefix=CHECK-IMPLICIT-MEMREF %s 10430313cbbSDouglas Gregor // RUN: c-index-test -cursor-at=%s:31:28 %s | FileCheck -check-prefix=CHECK-IMPLICIT-MEMREF %s 10530313cbbSDouglas Gregor // CHECK-IMPLICIT-MEMREF: MemberRefExpr=member:21:7 106d289104eSArgyrios Kyrtzidis 107d289104eSArgyrios Kyrtzidis // RUN: c-index-test -cursor-at=%s:35:5 %s | FileCheck -check-prefix=CHECK-DECL %s 108d289104eSArgyrios Kyrtzidis // CHECK-DECL: VarDecl=foo:35:5 1093f35bb2dSDouglas Gregor 1103f35bb2dSDouglas Gregor // RUN: c-index-test -cursor-at=%s:21:3 %s | FileCheck -check-prefix=CHECK-MEMBER %s 1113f35bb2dSDouglas Gregor // CHECK-MEMBER: FieldDecl=member:21:7 (Definition) 1123f35bb2dSDouglas Gregor // CHECK-MEMBER-NEXT: Completion string: {ResultType int}{TypedText member} 1130fd8fae0SArgyrios Kyrtzidis 1140fd8fae0SArgyrios Kyrtzidis // RUN: c-index-test -cursor-at=%s:38:12 -cursor-at=%s:39:5 %s | FileCheck -check-prefix=CHECK-CXXCATCH %s 1150fd8fae0SArgyrios Kyrtzidis // CHECK-CXXCATCH: TypeRef=struct X:3:8 1160fd8fae0SArgyrios Kyrtzidis // CHECK-CXXCATCH-NEXT: TypeRef=struct X:3:8 1170042b6f9SArgyrios Kyrtzidis 1180042b6f9SArgyrios Kyrtzidis // RUN: c-index-test -test-load-source-usrs local %s | FileCheck -check-prefix=CHECK-USR %s 1190042b6f9SArgyrios Kyrtzidis // CHECK-USR: get-cursor.cpp c:get-cursor.cpp@472@F@test#@e Extent=[38:12 - 38:15] 1200042b6f9SArgyrios Kyrtzidis // CHECK-USR: get-cursor.cpp c:get-cursor.cpp@483@F@test#@x Extent=[39:5 - 39:8] 121fbb2bb5aSArgyrios Kyrtzidis 122fbb2bb5aSArgyrios Kyrtzidis // RUN: c-index-test -cursor-at=%s:45:9 %s | FileCheck -check-prefix=CHECK-LOCALCLASS %s 123fbb2bb5aSArgyrios Kyrtzidis // CHECK-LOCALCLASS: 45:9 DeclRefExpr=x:44:11 Extent=[45:9 - 45:10] Spelling=x ([45:9 - 45:10]) 1242ec76747SArgyrios Kyrtzidis 1252ec76747SArgyrios Kyrtzidis // RUN: c-index-test -cursor-at=%s:50:23 -cursor-at=%s:55:23 %s | FileCheck -check-prefix=CHECK-TEMPLPARAM %s 1262ec76747SArgyrios Kyrtzidis // CHECK-TEMPLPARAM: 50:23 TypeRef=struct X:3:8 Extent=[50:23 - 50:24] Spelling=struct X ([50:23 - 50:24]) 1272ec76747SArgyrios Kyrtzidis // CHECK-TEMPLPARAM: 55:23 TypeRef=struct X:3:8 Extent=[55:23 - 55:24] Spelling=struct X ([55:23 - 55:24]) 128*40bcfd71SArgyrios Kyrtzidis 129*40bcfd71SArgyrios Kyrtzidis // RUN: c-index-test -cursor-at=%s:66:23 %s | FileCheck -check-prefix=CHECK-TEMPLSPEC %s 130*40bcfd71SArgyrios Kyrtzidis // 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]) 131