-
Eric Müller authored
This introduces some LLVM patches to enable code generation via genpybind.
6cdef93b
llvm11-0005-libclang-WIP-Fix-get_tokens-in-macro-expansion.patch 2.38 KiB
From 0fa84bbd8c6f8eb8eb6a3bc30e4efe3f2cf4c283 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Johann=20Kl=C3=A4hn?= <johann.klaehn@kip.uni-heidelberg.de>
Date: Mon, 31 Jul 2017 14:09:52 +0200
Subject: [PATCH 5/5] [libclang] WIP: Fix get_tokens in macro expansion
---
clang/bindings/python/tests/cindex/test_cursor.py | 15 +++++++++++++++
clang/tools/libclang/CIndex.cpp | 2 +-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/tools/clang/bindings/python/tests/cindex/test_cursor.py b/clang/bindings/python/tests/cindex/test_cursor.py
index d061f37c25c..38702df74f2 100644
--- a/tools/clang/bindings/python/tests/cindex/test_cursor.py
+++ b/tools/clang/bindings/python/tests/cindex/test_cursor.py
@@ -552,6 +552,21 @@ class TestCursor(unittest.TestCase):
r_cursor = t_cursor.referenced # should not raise an exception
self.assertEqual(r_cursor.kind, CursorKind.CLASS_DECL)
+ def test_get_tokens_in_macro_expansion(self):
+ """regression test"""
+ source = "#define IMPL(name) struct name { name(int v = 123); }; \n IMPL(X)"
+ tu = get_tu(source, lang="cpp")
+ ctor = get_cursors(tu, "X")[1]
+ self.assertEqual(ctor.kind, CursorKind.CONSTRUCTOR)
+ p = next(ctor.get_children())
+ self.assertEqual(p.kind, CursorKind.PARM_DECL, (p.kind, p.spelling))
+ children = list(p.get_children())
+ self.assertEqual(len(children), 1, [(c.kind, c.spelling) for c in children])
+ expr = children[0]
+ tokens = list(expr.get_tokens())
+ self.assertEqual(len(tokens), 1, [t.spelling for t in tokens])
+ self.assertEqual(tokens[0].spelling, "123")
+
def test_get_arguments(self):
tu = get_tu('void foo(int i, int j);')
foo = get_cursor(tu, 'foo')
diff --git a/tools/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 7ee6b704647..e4b95436704 100644
--- a/tools/clang/tools/libclang/CIndex.cpp
+++ b/tools/clang/tools/libclang/CIndex.cpp
@@ -147,7 +147,7 @@ CXSourceRange cxloc::translateSourceRang
// location accordingly.
SourceLocation EndLoc = R.getEnd();
bool IsTokenRange = R.isTokenRange();
- if (EndLoc.isValid() && EndLoc.isMacroID() &&
+ if (false && EndLoc.isValid() && EndLoc.isMacroID() &&
!SM.isMacroArgExpansion(EndLoc)) {
CharSourceRange Expansion = SM.getExpansionRange(EndLoc);
EndLoc = Expansion.getEnd();
--
2.23.0