From aaa80b208de3e2c706badf45060bd126fa747b84 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 3 Sep 2010 18:01:25 +0000 Subject: Implement libclang visitation for UnresolvedMemberExpr. This is the last of the C++-specific expressions where we have decent source information in the AST already. In particular, various object-construction expressions (CXXNewExpr, CXXTemporaryObjectExpr) still have poor source-location information that needs to be addressed. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112981 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Index/load-stmts.cpp | 24 ++++++++++++++++++++++++ tools/libclang/CIndex.cpp | 10 ++++++++++ 2 files changed, 34 insertions(+) diff --git a/test/Index/load-stmts.cpp b/test/Index/load-stmts.cpp index 9614e11a01..503219f71e 100644 --- a/test/Index/load-stmts.cpp +++ b/test/Index/load-stmts.cpp @@ -55,6 +55,21 @@ void test_dependent_exprs(T t) { t->type::template f(); } +struct Y { + int f(int); + float f(float); + + template T g(T); + template T g(T*); +}; + +template +void test_more_dependent_exprs(T t, Y y) { + y.Y::f(t); + typedef T type; + y.g(t); +} + // RUN: c-index-test -test-load-source all %s | FileCheck %s // CHECK: load-stmts.cpp:1:13: TypedefDecl=T:1:13 (Definition) Extent=[1:13 - 1:14] // CHECK: load-stmts.cpp:2:8: StructDecl=X:2:8 (Definition) Extent=[2:1 - 2:23] @@ -136,3 +151,12 @@ void test_dependent_exprs(T t) { // CHECK: load-stmts.cpp:55:3: CallExpr= Extent=[55:3 - 55:31] // CHECK: load-stmts.cpp:55:3: DeclRefExpr=t:50:29 Extent=[55:3 - 55:4] // CHECK: load-stmts.cpp:55:23: TypeRef=type:52:13 Extent=[55:23 - 55:27] +// CHECK: load-stmts.cpp:67:6: FunctionTemplate=test_more_dependent_exprs:67:6 (Definition) +// CHECK: load-stmts.cpp:68:3: CallExpr= Extent=[68:3 - 68:12] +// CHECK: load-stmts.cpp:68:3: DeclRefExpr=y:67:39 Extent=[68:3 - 68:4] +// CHECK: load-stmts.cpp:68:5: TypeRef=struct Y:58:8 Extent=[68:5 - 68:6] +// CHECK: load-stmts.cpp:68:10: DeclRefExpr=t:67:34 Extent=[68:10 - 68:11] +// CHECK: load-stmts.cpp:70:3: CallExpr= Extent=[70:3 - 70:15] +// CHECK: load-stmts.cpp:70:3: DeclRefExpr=y:67:39 Extent=[70:3 - 70:4] +// CHECK: load-stmts.cpp:70:7: TypeRef=type:69:13 Extent=[70:7 - 70:11] +// CHECK: load-stmts.cpp:70:13: DeclRefExpr=t:67:34 Extent=[70:13 - 70:14] diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 19dd44b8cf..5117f2c164 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -393,7 +393,9 @@ public: // FIXME: UnaryTypeTraitExpr has poor source-location information. bool VisitOverloadExpr(OverloadExpr *E); bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E); + // FIXME: CXXUnresolvedConstructExpr has poor source-location information. bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E); + bool VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E); }; } // end anonymous namespace @@ -1693,6 +1695,14 @@ bool CursorVisitor::VisitCXXDependentScopeMemberExpr( return false; } +bool CursorVisitor::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { + // Visit the base expression, if there is one. + if (!E->isImplicitAccess() && + Visit(MakeCXCursor(E->getBase(), StmtParent, TU))) + return true; + + return VisitOverloadExpr(E); +} bool CursorVisitor::VisitObjCMessageExpr(ObjCMessageExpr *E) { if (TypeSourceInfo *TSInfo = E->getClassReceiverTypeInfo()) -- cgit v1.2.3