aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-09-03 17:35:34 +0000
committerDouglas Gregor <dgregor@apple.com>2010-09-03 17:35:34 +0000
commit4583827e13085eedbb8573f4479422be4858d461 (patch)
treeb6ee3376e2558e7f5baa09efdf3ad218b1e359b0
parent9e42a952d79224ff98161e733bd82efbac55a7a3 (diff)
downloadllvm-4583827e13085eedbb8573f4479422be4858d461.zip
llvm-4583827e13085eedbb8573f4479422be4858d461.tar.gz
llvm-4583827e13085eedbb8573f4479422be4858d461.tar.bz2
libclang visitation for CXXDependentScopeMemberExpr
llvm-svn: 112978
-rw-r--r--clang/test/Index/load-stmts.cpp4
-rw-r--r--clang/tools/libclang/CIndex.cpp32
2 files changed, 36 insertions, 0 deletions
diff --git a/clang/test/Index/load-stmts.cpp b/clang/test/Index/load-stmts.cpp
index 9d183de..9614e11 100644
--- a/clang/test/Index/load-stmts.cpp
+++ b/clang/test/Index/load-stmts.cpp
@@ -52,6 +52,7 @@ void test_dependent_exprs(T t) {
typedef T type;
N::g<type>(t);
type::template f<type*>(t);
+ t->type::template f<type*>();
}
// RUN: c-index-test -test-load-source all %s | FileCheck %s
@@ -132,3 +133,6 @@ void test_dependent_exprs(T t) {
// CHECK: load-stmts.cpp:54:3: TypeRef=type:52:13 Extent=[54:3 - 54:7]
// CHECK: load-stmts.cpp:54:20: TypeRef=type:52:13 Extent=[54:20 - 54:24]
// CHECK: load-stmts.cpp:54:27: DeclRefExpr=t:50:29 Extent=[54:27 - 54:28]
+// 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]
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index d75853b..19dd44b 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -393,6 +393,7 @@ public:
// FIXME: UnaryTypeTraitExpr has poor source-location information.
bool VisitOverloadExpr(OverloadExpr *E);
bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
+ bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
};
} // end anonymous namespace
@@ -1662,6 +1663,37 @@ bool CursorVisitor::VisitDependentScopeDeclRefExpr(
return false;
}
+bool CursorVisitor::VisitCXXDependentScopeMemberExpr(
+ CXXDependentScopeMemberExpr *E) {
+ // Visit the base expression, if there is one.
+ if (!E->isImplicitAccess() &&
+ Visit(MakeCXCursor(E->getBase(), StmtParent, TU)))
+ return true;
+
+ // Visit the nested-name-specifier.
+ if (NestedNameSpecifier *Qualifier = E->getQualifier())
+ if (VisitNestedNameSpecifier(Qualifier, E->getQualifierRange()))
+ return true;
+
+ // Visit the declaration name.
+ if (VisitDeclarationNameInfo(E->getMemberNameInfo()))
+ return true;
+
+ // Visit the explicitly-specified template arguments.
+ if (const ExplicitTemplateArgumentList *ArgList
+ = E->getOptionalExplicitTemplateArgs()) {
+ for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
+ *ArgEnd = Arg + ArgList->NumTemplateArgs;
+ Arg != ArgEnd; ++Arg) {
+ if (VisitTemplateArgumentLoc(*Arg))
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
bool CursorVisitor::VisitObjCMessageExpr(ObjCMessageExpr *E) {
if (TypeSourceInfo *TSInfo = E->getClassReceiverTypeInfo())
if (Visit(TSInfo->getTypeLoc()))