diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2013-05-17 18:38:35 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2013-05-17 18:38:35 +0000 |
commit | 62770bea4b0bd203c7ad09f57cf68bfc16a58612 (patch) | |
tree | 4b5f7b8171e65861e90237aaf0842e9ca0f548e7 /clang | |
parent | 858885578d6bdf82527c2d895368fc0140536b83 (diff) | |
download | bcm5719-llvm-62770bea4b0bd203c7ad09f57cf68bfc16a58612.tar.gz bcm5719-llvm-62770bea4b0bd203c7ad09f57cf68bfc16a58612.zip |
libclang: add a function to check whether a member function is pure virtual
Patch by Seth Fowler.
llvm-svn: 182139
Diffstat (limited to 'clang')
-rw-r--r-- | clang/bindings/python/clang/cindex.py | 4 | ||||
-rw-r--r-- | clang/include/clang-c/Index.h | 6 | ||||
-rw-r--r-- | clang/test/Index/overrides.cpp | 7 | ||||
-rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 3 | ||||
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 14 | ||||
-rw-r--r-- | clang/tools/libclang/libclang.exports | 1 |
6 files changed, 34 insertions, 1 deletions
diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py index 880a1502a4b..f2e752aed00 100644 --- a/clang/bindings/python/clang/cindex.py +++ b/clang/bindings/python/clang/cindex.py @@ -2590,6 +2590,10 @@ functionList = [ [Index, c_char_p], c_object_p), + ("clang_CXXMethod_isPureVirtual", + [Cursor], + bool), + ("clang_CXXMethod_isStatic", [Cursor], bool), diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index d8c37ebd70f..21b7dba0763 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -4035,6 +4035,12 @@ CINDEX_LINKAGE CXString clang_FullComment_getAsXML(CXComment Comment); */ /** + * \brief Determine if a C++ member function or member function template is + * pure virtual. + */ +CINDEX_LINKAGE unsigned clang_CXXMethod_isPureVirtual(CXCursor C); + +/** * \brief Determine if a C++ member function or member function template is * declared 'static'. */ diff --git a/clang/test/Index/overrides.cpp b/clang/test/Index/overrides.cpp index a711d82bea8..e311699f866 100644 --- a/clang/test/Index/overrides.cpp +++ b/clang/test/Index/overrides.cpp @@ -17,7 +17,14 @@ struct D : C { void C::g() {} +struct E { + virtual void h() = 0; + template <typename T> void i(T); +}; + // RUN: c-index-test -test-load-source local %s | FileCheck %s // CHECK: overrides.cpp:11:16: CXXMethod=g:11:16 (virtual) [Overrides @7:16] Extent=[11:3 - 11:19] // CHECK: overrides.cpp:15:16: CXXMethod=f:15:16 (virtual) [Overrides @2:16, @6:16] Extent=[15:3 - 15:22] // CHECK: overrides.cpp:18:9: CXXMethod=g:18:9 (Definition) (virtual) [Overrides @7:16] Extent=[18:1 - 18:15] +// CHECK: overrides.cpp:21:16: CXXMethod=h:21:16 (virtual) (pure) Extent=[21:3 - 21:23] +// CHECK: overrides.cpp:22:30: FunctionTemplate=i:22:30 Extent=[22:3 - 22:34] diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index e5752341679..a824a9f041a 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -694,7 +694,8 @@ static void PrintCursor(CXCursor Cursor, printf(" (static)"); if (clang_CXXMethod_isVirtual(Cursor)) printf(" (virtual)"); - + if (clang_CXXMethod_isPureVirtual(Cursor)) + printf(" (pure)"); if (clang_Cursor_isVariadic(Cursor)) printf(" (variadic)"); diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index db7faabbee3..bd20800993b 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -6118,6 +6118,20 @@ CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU, //===----------------------------------------------------------------------===// extern "C" { +unsigned clang_CXXMethod_isPureVirtual(CXCursor C) { + if (!clang_isDeclaration(C.kind)) + return 0; + + const CXXMethodDecl *Method = 0; + const Decl *D = cxcursor::getCursorDecl(C); + if (const FunctionTemplateDecl *FunTmpl = + dyn_cast_or_null<FunctionTemplateDecl>(D)) + Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl()); + else + Method = dyn_cast_or_null<CXXMethodDecl>(D); + return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0; +} + unsigned clang_CXXMethod_isStatic(CXCursor C) { if (!clang_isDeclaration(C.kind)) return 0; diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index 0c9912e5202..4a134d9d246 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -2,6 +2,7 @@ clang_CXCursorSet_contains clang_CXCursorSet_insert clang_CXIndex_getGlobalOptions clang_CXIndex_setGlobalOptions +clang_CXXMethod_isPureVirtual clang_CXXMethod_isStatic clang_CXXMethod_isVirtual clang_Cursor_getArgument |