]> granicus.if.org Git - clang/commitdiff
libclang: add a function to check whether a member function is pure virtual
authorDmitri Gribenko <gribozavr@gmail.com>
Fri, 17 May 2013 18:38:35 +0000 (18:38 +0000)
committerDmitri Gribenko <gribozavr@gmail.com>
Fri, 17 May 2013 18:38:35 +0000 (18:38 +0000)
Patch by Seth Fowler.

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

bindings/python/clang/cindex.py
include/clang-c/Index.h
test/Index/overrides.cpp
tools/c-index-test/c-index-test.c
tools/libclang/CIndex.cpp
tools/libclang/libclang.exports

index 880a1502a4ba52991293ba88a7d88c6d634aa4e5..f2e752aed00d353e28dde428fb53ec95a20a1066 100644 (file)
@@ -2590,6 +2590,10 @@ functionList = [
    [Index, c_char_p],
    c_object_p),
 
+  ("clang_CXXMethod_isPureVirtual",
+   [Cursor],
+   bool),
+
   ("clang_CXXMethod_isStatic",
    [Cursor],
    bool),
index d8c37ebd70f978b52baf563be95c5cf45c1feb5f..21b7dba0763172eb6d5ed37d8a5b81110d91bdd8 100644 (file)
@@ -4034,6 +4034,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'.
index a711d82bea80b44a53fbd3686369f0bce0598832..e311699f866042f1b15520642ce3810088553aca 100644 (file)
@@ -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]
index e5752341679d5715d5d12ac1b946078452d39fb1..a824a9f041a315ac75dc4172bc169d3f0dd4a69f 100644 (file)
@@ -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)");
     
index db7faabbee3e9cae0b6b0749a2f6d70d88dc417d..bd20800993b8d770eadf262806f5a8ea311f5018 100644 (file)
@@ -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;
index 0c9912e5202ff2ac618ada3db4c642b425a215b6..4a134d9d2463bac594cec24be3b0fca4923c58d7 100644 (file)
@@ -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