diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-02-25 18:19:59 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-02-25 18:19:59 +0000 |
commit | a6ce608b97d6443f8e47f3cb20354be7b0cdeb43 (patch) | |
tree | 50a9d4a605b7d5ae5a1ba6e1ca869fc1a91dd00f /clang/tools/libclang/CIndex.cpp | |
parent | 40c5e1ada70f0a8d69c741c048d218634cc588dd (diff) | |
download | bcm5719-llvm-a6ce608b97d6443f8e47f3cb20354be7b0cdeb43.tar.gz bcm5719-llvm-a6ce608b97d6443f8e47f3cb20354be7b0cdeb43.zip |
Push nested-name-specifier source-location information into
pseudo-destructor expressions. Also, clean up some
template-instantiation and type-checking issues with
pseudo-destructors.
llvm-svn: 126498
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index a09a7371251..bddf3d82fff 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -140,6 +140,7 @@ public: DeclRefExprPartsKind, LabelRefVisitKind, ExplicitTemplateArgsVisitKind, NestedNameSpecifierVisitKind, + NestedNameSpecifierLocVisitKind, DeclarationNameInfoVisitKind, MemberRefVisitKind, SizeOfPackExprPartsKind }; protected: @@ -1615,6 +1616,24 @@ public: return SourceRange(A, B); } }; + +class NestedNameSpecifierLocVisit : public VisitorJob { +public: + NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent) + : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind, + Qualifier.getNestedNameSpecifier(), + Qualifier.getOpaqueData()) { } + + static bool classof(const VisitorJob *VJ) { + return VJ->getKind() == VisitorJob::NestedNameSpecifierLocVisitKind; + } + + NestedNameSpecifierLoc get() const { + return NestedNameSpecifierLoc(static_cast<NestedNameSpecifier*>(data[0]), + data[1]); + } +}; + class DeclarationNameInfoVisit : public VisitorJob { public: DeclarationNameInfoVisit(Stmt *S, CXCursor parent) @@ -1697,6 +1716,7 @@ public: private: void AddDeclarationNameInfo(Stmt *S); void AddNestedNameSpecifier(NestedNameSpecifier *NS, SourceRange R); + void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier); void AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A); void AddMemberRef(FieldDecl *D, SourceLocation L); void AddStmt(Stmt *S); @@ -1716,6 +1736,13 @@ void EnqueueVisitor::AddNestedNameSpecifier(NestedNameSpecifier *N, if (N) WL.push_back(NestedNameSpecifierVisit(N, R, Parent)); } + +void +EnqueueVisitor::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) { + if (Qualifier) + WL.push_back(NestedNameSpecifierLocVisit(Qualifier, Parent)); +} + void EnqueueVisitor::AddStmt(Stmt *S) { if (S) WL.push_back(StmtVisit(S, Parent)); @@ -1800,8 +1827,8 @@ void EnqueueVisitor::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { // but isn't. AddTypeLoc(E->getScopeTypeInfo()); // Visit the nested-name-specifier. - if (NestedNameSpecifier *Qualifier = E->getQualifier()) - AddNestedNameSpecifier(Qualifier, E->getQualifierRange()); + if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc()) + AddNestedNameSpecifierLoc(QualifierLoc); // Visit base expression. AddStmt(E->getBase()); } @@ -2048,12 +2075,21 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { } continue; } + case VisitorJob::NestedNameSpecifierVisitKind: { NestedNameSpecifierVisit *V = cast<NestedNameSpecifierVisit>(&LI); if (VisitNestedNameSpecifier(V->get(), V->getSourceRange())) return true; continue; } + + case VisitorJob::NestedNameSpecifierLocVisitKind: { + NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI); + if (VisitNestedNameSpecifierLoc(V->get())) + return true; + continue; + } + case VisitorJob::DeclarationNameInfoVisitKind: { if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI) ->get())) |