]> granicus.if.org Git - clang/commitdiff
[libclang] Only mark CXCursors for explicit attributes with a type
authorErik Verbruggen <erikjv@me.com>
Tue, 24 Apr 2018 08:39:46 +0000 (08:39 +0000)
committerErik Verbruggen <erikjv@me.com>
Tue, 24 Apr 2018 08:39:46 +0000 (08:39 +0000)
All attributes have a source range associated with it. However, implicit
attributes are added by the compiler, and not added because the user
wrote something in the input. So no token type should be set to
CXCursor_*Attr.

The problem was visible when a class gets marked by e.g.
MSInheritanceAttr, which has the full CXXRecordDecl's range as its
own range. The effect of marking that range as CXCursor_UnexposedAttr
was that all cursors for the record decl, including all child decls,
would become CXCursor_UnexposedAttr.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@330692 91177308-0d34-0410-b5e6-96231b3b80d8

test/Index/annotate-tokens-unexposed.cpp [new file with mode: 0644]
tools/libclang/CIndex.cpp

diff --git a/test/Index/annotate-tokens-unexposed.cpp b/test/Index/annotate-tokens-unexposed.cpp
new file mode 100644 (file)
index 0000000..3e5d794
--- /dev/null
@@ -0,0 +1,20 @@
+// RUN: c-index-test -test-annotate-tokens=%s:1:1:16:1 %s -target x86_64-pc-windows-msvc | FileCheck %s
+class Foo
+{
+public:
+    void step(int v);
+    Foo();
+};
+
+void bar()
+{
+    // Introduce a MSInheritanceAttr node on the CXXRecordDecl for Foo. The
+    // existance of this attribute should not mark all cursors for tokens in
+    // Foo as UnexposedAttr.
+    &Foo::step;
+}
+
+Foo::Foo()
+{}
+
+// CHECK-NOT: UnexposedAttr=
index 480e00eb962b25d3405739e6def9ec119bfee909..497a3ca8f5432d0cc9b9be46a2d34dd9e04fa644 100644 (file)
@@ -1796,7 +1796,7 @@ bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) {
 
 bool CursorVisitor::VisitAttributes(Decl *D) {
   for (const auto *I : D->attrs())
-    if (Visit(MakeCXCursor(I, D, TU)))
+    if (!I->isImplicit() && Visit(MakeCXCursor(I, D, TU)))
         return true;
 
   return false;