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