struct SB { virtual void meth(); }; struct SS : public SB { void submeth() { this->meth(); SB::meth(); } }; @interface IB -(void)meth; +(void)ClsMeth; @end @interface IS : IB -(void)submeth; +(void)ClsMeth; @end @implementation IS -(void)submeth { [self meth]; [super meth]; } +(void)ClsMeth { [super ClsMeth]; } @end void foo(SS *ss, IS* is, Class cls) { ss->meth(); [is meth]; [IB ClsMeth]; [cls ClsMeth]; } @interface NSObject +(id)alloc; -(id)init; @end @interface Test : NSObject @end void test2() { id o = [[Test alloc] init]; } @interface Test2 : NSObject @property (assign) id someProp; @end void test3(Test2 *o) { id v = o.someProp; } // RUN: c-index-test -cursor-at=%s:8:11 \ // RUN: -cursor-at=%s:9:11 \ // RUN: -cursor-at=%s:25:11 \ // RUN: -cursor-at=%s:26:11 \ // RUN: -cursor-at=%s:29:11 \ // RUN: -cursor-at=%s:34:9 \ // RUN: -cursor-at=%s:35:9 \ // RUN: -cursor-at=%s:36:9 \ // RUN: -cursor-at=%s:37:9 \ // RUN: -cursor-at=%s:49:26 \ // RUN: -cursor-at=%s:57:12 \ // RUN: %s | FileCheck %s // CHECK: 8:11 MemberRefExpr=meth:3:16 {{.*}} Dynamic-call // CHECK-NOT: 9:9 {{.*}} Dynamic-call // CHECK: 25:3 ObjCMessageExpr=meth:14:8 {{.*}} Dynamic-call Receiver-type=ObjCObjectPointer // CHECK-NOT: 26:3 {{.*}} Dynamic-call // CHECK-NOT: 29:3 {{.*}} Dynamic-call // CHECK: 29:3 {{.*}} Receiver-type=ObjCInterface // CHECK: 34:7 MemberRefExpr=meth:3:16 {{.*}} Dynamic-call Receiver-type=Pointer // CHECK: 35:3 ObjCMessageExpr=meth:14:8 {{.*}} Dynamic-call Receiver-type=ObjCObjectPointer // CHECK-NOT: 36:3 {{.*}} Dynamic-call // CHECK: 36:3 {{.*}} Receiver-type=ObjCInterface // CHECK: 37:3 ObjCMessageExpr=ClsMeth:15:8 {{.*}} Dynamic-call Receiver-type=ObjCClass // CHECK-NOT: 49:10 {{.*}} Dynamic-call // CHECK: 57:12 MemberRefExpr=someProp:53:23 {{.*}} Dynamic-call Receiver-type=ObjCObjectPointer