From e68aaca76612972237296a78dda60101343022a8 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 10 Aug 2010 15:02:34 +0000 Subject: [PATCH] Teach the libclang cursor visitor to walk into the type information provided by __builtin_types_compatible_p and __builtin_va_arg expressions, now that Abramo has added proper type-source information to those expressions. llvm-svn: 110681 --- clang/test/Index/annotate-tokens.c | 15 ++++++++++++++- clang/tools/libclang/CIndex.cpp | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/clang/test/Index/annotate-tokens.c b/clang/test/Index/annotate-tokens.c index 41f182d27148..e251596c8002 100644 --- a/clang/test/Index/annotate-tokens.c +++ b/clang/test/Index/annotate-tokens.c @@ -9,7 +9,14 @@ void f(void *ptr) { const char * hello = "Hello"; } -// RUN: c-index-test -test-annotate-tokens=%s:4:1:9:32 %s | FileCheck %s +typedef int Int; +void g(int i, ...) { + __builtin_va_list va; + (void)__builtin_va_arg(va, Int); + (void)__builtin_types_compatible_p(Int, Int); +} + +// RUN: c-index-test -test-annotate-tokens=%s:4:1:17:1 %s | FileCheck %s // CHECK: Identifier: "T" [4:3 - 4:4] TypeRef=T:1:13 // CHECK: Punctuation: "*" [4:4 - 4:5] VarDecl=t_ptr:4:6 (Definition) // CHECK: Identifier: "t_ptr" [4:6 - 4:11] VarDecl=t_ptr:4:6 (Definition) @@ -61,5 +68,11 @@ void f(void *ptr) { // CHECK: Literal: ""Hello"" [9:24 - 9:31] UnexposedExpr= // CHECK: Punctuation: ";" [9:31 - 9:32] UnexposedStmt= // CHECK: Punctuation: "}" [10:1 - 10:2] UnexposedStmt= +// CHECK: Keyword: "__builtin_va_arg" [15:9 - 15:25] UnexposedExpr= +// CHECK: Identifier: "Int" [15:30 - 15:33] TypeRef=Int:12:13 +// CHECK: Keyword: "__builtin_types_compatible_p" [16:9 - 16:37] UnexposedExpr= +// CHECK: Identifier: "Int" [16:38 - 16:41] TypeRef=Int:12:13 +// CHECK: Punctuation: "," [16:41 - 16:42] UnexposedExpr= +// CHECK: Identifier: "Int" [16:43 - 16:46] TypeRef=Int:12:13 // RUN: c-index-test -test-annotate-tokens=%s:4:1:165:32 %s | FileCheck %s // RUN: c-index-test -test-annotate-tokens=%s:4:1:165:38 %s | FileCheck %s diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index e8d2cad84973..34de78ca1ccc 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -344,6 +344,8 @@ public: // bool VisitSwitchCase(SwitchCase *S); // Expression visitors + // FIXME: DeclRefExpr with template arguments, nested-name-specifier + // FIXME: MemberExpr with template arguments, nested-name-specifier bool VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); bool VisitBlockExpr(BlockExpr *B); bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E); @@ -352,6 +354,11 @@ public: bool VisitObjCEncodeExpr(ObjCEncodeExpr *E); bool VisitOffsetOfExpr(OffsetOfExpr *E); bool VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); + // FIXME: AddrLabelExpr (once we have cursors for labels) + bool VisitTypesCompatibleExpr(TypesCompatibleExpr *E); + bool VisitVAArgExpr(VAArgExpr *E); + // FIXME: InitListExpr (for the designators) + // FIXME: DesignatedInitExpr }; } // end anonymous namespace @@ -1110,6 +1117,18 @@ bool CursorVisitor::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { return VisitExpr(E); } +bool CursorVisitor::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) { + return Visit(E->getArgTInfo1()->getTypeLoc()) || + Visit(E->getArgTInfo2()->getTypeLoc()); +} + +bool CursorVisitor::VisitVAArgExpr(VAArgExpr *E) { + if (Visit(E->getWrittenTypeInfo()->getTypeLoc())) + return true; + + return Visit(MakeCXCursor(E->getSubExpr(), StmtParent, TU)); +} + bool CursorVisitor::VisitObjCMessageExpr(ObjCMessageExpr *E) { if (TypeSourceInfo *TSInfo = E->getClassReceiverTypeInfo()) if (Visit(TSInfo->getTypeLoc()))