[clang] 88e42c6 - [libclang/python] Fix bugs in custom enum implementation and add tests (#95381)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 14 02:19:33 PDT 2024
Author: Jannick Kremer
Date: 2024-06-14T13:19:28+04:00
New Revision: 88e42c6779067c4b65624939be74db2d56ee017b
URL: https://github.com/llvm/llvm-project/commit/88e42c6779067c4b65624939be74db2d56ee017b
DIFF: https://github.com/llvm/llvm-project/commit/88e42c6779067c4b65624939be74db2d56ee017b.diff
LOG: [libclang/python] Fix bugs in custom enum implementation and add tests (#95381)
Do not allow initialization of enum from negative IDs (e.g. from_id(-1)
currently produces the last known variant)
Rename duplicate enums: CursorKind.OMP_TEAMS_DISTRIBUTE_DIRECTIVE and
TypeKind.OBJCCLASS
Add tests to cover these cases
Added:
clang/bindings/python/tests/cindex/test_enums.py
Modified:
clang/bindings/python/clang/cindex.py
clang/docs/ReleaseNotes.rst
Removed:
################################################################################
diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py
index 302d99dccd77b..b3d51e4d2a668 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -649,7 +649,7 @@ def name(self):
@classmethod
def from_id(cls, id):
- if id >= len(cls._kinds) or cls._kinds[id] is None:
+ if id < 0 or id >= len(cls._kinds) or cls._kinds[id] is None:
raise ValueError("Unknown template argument kind %d" % id)
return cls._kinds[id]
@@ -1336,7 +1336,7 @@ def __repr__(self):
CursorKind.OMP_TEAMS_DISTRIBUTE_DIRECTIVE = CursorKind(271)
# OpenMP teams distribute simd directive.
-CursorKind.OMP_TEAMS_DISTRIBUTE_DIRECTIVE = CursorKind(272)
+CursorKind.OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE = CursorKind(272)
# OpenMP teams distribute parallel for simd directive.
CursorKind.OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE = CursorKind(273)
@@ -2215,7 +2215,7 @@ def name(self):
@staticmethod
def from_id(id):
- if id >= len(StorageClass._kinds) or not StorageClass._kinds[id]:
+ if id < 0 or id >= len(StorageClass._kinds) or not StorageClass._kinds[id]:
raise ValueError("Unknown storage class %d" % id)
return StorageClass._kinds[id]
@@ -2395,7 +2395,7 @@ def __repr__(self):
TypeKind.OCLRESERVEID = TypeKind(160)
TypeKind.OBJCOBJECT = TypeKind(161)
-TypeKind.OBJCCLASS = TypeKind(162)
+TypeKind.OBJCTYPEPARAM = TypeKind(162)
TypeKind.ATTRIBUTED = TypeKind(163)
TypeKind.OCLINTELSUBGROUPAVCMCEPAYLOAD = TypeKind(164)
diff --git a/clang/bindings/python/tests/cindex/test_enums.py b/clang/bindings/python/tests/cindex/test_enums.py
new file mode 100644
index 0000000000000..6fc0e5ed77e3e
--- /dev/null
+++ b/clang/bindings/python/tests/cindex/test_enums.py
@@ -0,0 +1,47 @@
+import unittest
+
+from clang.cindex import (
+ CursorKind,
+ TemplateArgumentKind,
+ ExceptionSpecificationKind,
+ AvailabilityKind,
+ AccessSpecifier,
+ TypeKind,
+ RefQualifierKind,
+ LinkageKind,
+ TLSKind,
+ StorageClass,
+)
+
+
+class TestCursorKind(unittest.TestCase):
+ enums = [
+ CursorKind,
+ TemplateArgumentKind,
+ ExceptionSpecificationKind,
+ AvailabilityKind,
+ AccessSpecifier,
+ TypeKind,
+ RefQualifierKind,
+ LinkageKind,
+ TLSKind,
+ StorageClass,
+ ]
+
+ def test_from_id(self):
+ """Check that kinds can be constructed from valid IDs"""
+ for enum in self.enums:
+ self.assertEqual(enum.from_id(2), enum._kinds[2])
+ with self.assertRaises(ValueError):
+ enum.from_id(len(enum._kinds))
+ with self.assertRaises(ValueError):
+ enum.from_id(-1)
+
+ def test_unique_kinds(self):
+ """Check that no kind name has been used multiple times"""
+ for enum in self.enums:
+ for id in range(len(enum._kinds)):
+ try:
+ enum.from_id(id).name
+ except ValueError:
+ pass
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 68355dbb5861b..bae9f5e1bd02a 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -135,6 +135,14 @@ Clang Frontend Potentially Breaking Changes
- The ``hasTypeLoc`` AST matcher will no longer match a ``classTemplateSpecializationDecl``;
existing uses should switch to ``templateArgumentLoc`` or ``hasAnyTemplateArgumentLoc`` instead.
+Clang Python Bindings Potentially Breaking Changes
+--------------------------------------------------
+- Renamed ``CursorKind`` variant 272 from ``OMP_TEAMS_DISTRIBUTE_DIRECTIVE``
+ to ``OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE``. The previous name was incorrect, it was a duplicate
+ of variant 271.
+- Renamed ``TypeKind`` variant 162 from ``OBJCCLASS`` to ``OBJCTYPEPARAM``.
+ The previous name was incorrect, it was a duplicate of variant 28.
+
What's New in Clang |release|?
==============================
Some of the major new features and improvements to Clang are listed
More information about the cfe-commits
mailing list