summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bindings/python/clang/cindex.py9
-rw-r--r--bindings/python/tests/cindex/test_cursor.py16
-rw-r--r--include/clang-c/Index.h5
-rw-r--r--test/Index/print-type-declaration.cpp7
-rw-r--r--tools/c-index-test/c-index-test.c2
-rw-r--r--tools/libclang/CIndex.cpp9
-rw-r--r--tools/libclang/libclang.exports1
7 files changed, 49 insertions, 0 deletions
diff --git a/bindings/python/clang/cindex.py b/bindings/python/clang/cindex.py
index 1ca5804919..236803a9ab 100644
--- a/bindings/python/clang/cindex.py
+++ b/bindings/python/clang/cindex.py
@@ -1478,6 +1478,11 @@ class Cursor(Structure):
"""
return conf.lib.clang_CXXMethod_isVirtual(self)
+ def is_scoped_enum(self):
+ """Returns True if the cursor refers to a scoped enum declaration.
+ """
+ return conf.lib.clang_EnumDecl_isScoped(self)
+
def get_definition(self):
"""
If the cursor is a reference to a declaration or a declaration of
@@ -3314,6 +3319,10 @@ functionList = [
[Cursor],
bool),
+ ("clang_EnumDecl_isScoped",
+ [Cursor],
+ bool),
+
("clang_defaultDiagnosticDisplayOptions",
[],
c_uint),
diff --git a/bindings/python/tests/cindex/test_cursor.py b/bindings/python/tests/cindex/test_cursor.py
index 8103e96df4..4787ea931e 100644
--- a/bindings/python/tests/cindex/test_cursor.py
+++ b/bindings/python/tests/cindex/test_cursor.py
@@ -255,6 +255,22 @@ def test_is_virtual_method():
assert foo.is_virtual_method()
assert not bar.is_virtual_method()
+def test_is_scoped_enum():
+ """Ensure Cursor.is_scoped_enum works."""
+ source = 'class X {}; enum RegularEnum {}; enum class ScopedEnum {};'
+ tu = get_tu(source, lang='cpp')
+
+ cls = get_cursor(tu, 'X')
+ regular_enum = get_cursor(tu, 'RegularEnum')
+ scoped_enum = get_cursor(tu, 'ScopedEnum')
+ assert cls is not None
+ assert regular_enum is not None
+ assert scoped_enum is not None
+
+ assert not cls.is_scoped_enum()
+ assert not regular_enum.is_scoped_enum()
+ assert scoped_enum.is_scoped_enum()
+
def test_underlying_type():
tu = get_tu('typedef int foo;')
typedef = get_cursor(tu, 'foo')
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
index f404e6d72e..09f4403556 100644
--- a/include/clang-c/Index.h
+++ b/include/clang-c/Index.h
@@ -4417,6 +4417,11 @@ CINDEX_LINKAGE unsigned clang_CXXMethod_isStatic(CXCursor C);
CINDEX_LINKAGE unsigned clang_CXXMethod_isVirtual(CXCursor C);
/**
+ * \brief Determine if an enum declaration refers to a scoped enum.
+ */
+CINDEX_LINKAGE unsigned clang_EnumDecl_isScoped(CXCursor C);
+
+/**
* \brief Determine if a C++ member function or member function template is
* declared 'const'.
*/
diff --git a/test/Index/print-type-declaration.cpp b/test/Index/print-type-declaration.cpp
index 31c0a73fcd..a0953d1e56 100644
--- a/test/Index/print-type-declaration.cpp
+++ b/test/Index/print-type-declaration.cpp
@@ -7,6 +7,13 @@ int main()
auto b = a;
}
+enum RegularEnum {};
+
+enum class ScopedEnum {};
+
// RUN: c-index-test -test-print-type-declaration -std=c++11 %s | FileCheck %s
// CHECK: VarDecl=a:6:8 (Definition) [typedeclaration=Test] [typekind=Record]
// CHECK: VarDecl=b:7:8 (Definition) [typedeclaration=Test] [typekind=Record]
+// CHECK: EnumDecl=RegularEnum:10:6 (Definition) [typedeclaration=RegularEnum] [typekind=Enum]
+// CHECK: EnumDecl=ScopedEnum:12:12 (Definition) (scoped) [typedeclaration=ScopedEnum] [typekind=Enum]
+
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index 1e925569dd..cf3581e259 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -804,6 +804,8 @@ static void PrintCursor(CXCursor Cursor, const char *CommentSchemaFile) {
printf(" (const)");
if (clang_CXXMethod_isPureVirtual(Cursor))
printf(" (pure)");
+ if (clang_EnumDecl_isScoped(Cursor))
+ printf(" (scoped)");
if (clang_Cursor_isVariadic(Cursor))
printf(" (variadic)");
if (clang_Cursor_isObjCOptional(Cursor))
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 2cbca421c7..236f264c17 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -7807,6 +7807,15 @@ unsigned clang_CXXMethod_isVirtual(CXCursor C) {
return (Method && Method->isVirtual()) ? 1 : 0;
}
+unsigned clang_EnumDecl_isScoped(CXCursor C) {
+ if (!clang_isDeclaration(C.kind))
+ return 0;
+
+ const Decl *D = cxcursor::getCursorDecl(C);
+ auto *Enum = dyn_cast_or_null<EnumDecl>(D);
+ return (Enum && Enum->isScoped()) ? 1 : 0;
+}
+
//===----------------------------------------------------------------------===//
// Attribute introspection.
//===----------------------------------------------------------------------===//
diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports
index e78899e4c7..e0d178a529 100644
--- a/tools/libclang/libclang.exports
+++ b/tools/libclang/libclang.exports
@@ -12,6 +12,7 @@ clang_CXXMethod_isConst
clang_CXXMethod_isPureVirtual
clang_CXXMethod_isStatic
clang_CXXMethod_isVirtual
+clang_EnumDecl_isScoped
clang_Cursor_getArgument
clang_Cursor_getNumTemplateArguments
clang_Cursor_getTemplateArgumentKind