summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-09-02 22:09:03 +0000
committerDouglas Gregor <dgregor@apple.com>2010-09-02 22:09:03 +0000
commit4edb2ff89f326b1cd42a0048c036f3274e76e13a (patch)
treeda9da287aa427f899e2385158c15d1d47ebe7421
parenteeb53e60bc8dfba85e0688294e75fbf36afec4bc (diff)
downloadbcm5719-llvm-4edb2ff89f326b1cd42a0048c036f3274e76e13a.tar.gz
bcm5719-llvm-4edb2ff89f326b1cd42a0048c036f3274e76e13a.zip
Add libclang visitation for C++ pseudo-destructor expressions.
llvm-svn: 112873
-rw-r--r--clang/test/Index/load-stmts.cpp8
-rw-r--r--clang/tools/libclang/CIndex.cpp28
2 files changed, 36 insertions, 0 deletions
diff --git a/clang/test/Index/load-stmts.cpp b/clang/test/Index/load-stmts.cpp
index bf991e71f81..df21f2c7223 100644
--- a/clang/test/Index/load-stmts.cpp
+++ b/clang/test/Index/load-stmts.cpp
@@ -33,6 +33,9 @@ void test_exprs(C *c) {
int typeid_marker;
typeid(C);
typeid(c);
+ typedef int Integer;
+ Integer *int_ptr;
+ int_ptr->Integer::~Integer();
}
// RUN: c-index-test -test-load-source all %s | FileCheck %s
@@ -95,3 +98,8 @@ void test_exprs(C *c) {
// CHECK: load-stmts.cpp:33:7: VarDecl=typeid_marker:33:7 (Definition)
// CHECK: load-stmts.cpp:34:10: TypeRef=class C:22:7 Extent=[34:10 - 34:11]
// CHECK: load-stmts.cpp:35:10: DeclRefExpr=c:32:20 Extent=[35:10 - 35:11]
+// CHECK: load-stmts.cpp:37:12: VarDecl=int_ptr:37:12 (Definition) Extent=[37:3 - 37:19]
+// CHECK: load-stmts.cpp:37:3: TypeRef=Integer:36:15 Extent=[37:3 - 37:10]
+// CHECK: load-stmts.cpp:38:3: DeclRefExpr=int_ptr:37:12 Extent=[38:3 - 38:10]
+// CHECK: load-stmts.cpp:38:12: TypeRef=Integer:36:15 Extent=[38:12 - 38:19]
+// CHECK: load-stmts.cpp:38:22: TypeRef=Integer:36:15 Extent=[38:22 - 38:29]
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 89816acfa63..d3c3c6e4fac 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -386,6 +386,10 @@ public:
// FIXME: DesignatedInitExpr
bool VisitCXXTypeidExpr(CXXTypeidExpr *E);
bool VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { return false; }
+ // FIXME: CXXTemporaryObjectExpr has poor source-location information
+ // FIXME: CXXScalarValueInitExpr has poor source-location information
+ // FIXME: CXXNewExpr has poor source-location information
+ bool VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
};
} // end anonymous namespace
@@ -1580,6 +1584,30 @@ bool CursorVisitor::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
return VisitExpr(E);
}
+bool CursorVisitor::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
+ // Visit base expression.
+ if (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 scope type that looks disturbingly like the nested-name-specifier
+ // but isn't.
+ if (TypeSourceInfo *TSInfo = E->getScopeTypeInfo())
+ if (Visit(TSInfo->getTypeLoc()))
+ return true;
+
+ // Visit the name of the type being destroyed.
+ if (TypeSourceInfo *TSInfo = E->getDestroyedTypeInfo())
+ if (Visit(TSInfo->getTypeLoc()))
+ return true;
+
+ return false;
+}
+
bool CursorVisitor::VisitObjCMessageExpr(ObjCMessageExpr *E) {
if (TypeSourceInfo *TSInfo = E->getClassReceiverTypeInfo())
if (Visit(TSInfo->getTypeLoc()))
OpenPOWER on IntegriCloud