]> granicus.if.org Git - clang/commitdiff
Add libclang visitation for C++ pseudo-destructor expressions.
authorDouglas Gregor <dgregor@apple.com>
Thu, 2 Sep 2010 22:09:03 +0000 (22:09 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 2 Sep 2010 22:09:03 +0000 (22:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112873 91177308-0d34-0410-b5e6-96231b3b80d8

test/Index/load-stmts.cpp
tools/libclang/CIndex.cpp

index bf991e71f8154a5ab9ccd36ed7c0a4cd600c8fed..df21f2c7223448a0f68c334518e90bd009937f55 100644 (file)
@@ -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]
index 89816acfa63e50e37af19742bb7ef6c08c932cb4..d3c3c6e4face47e1bb6a347d0c223f2cb6453770 100644 (file)
@@ -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()))