[clang] [cindex] Add python binding for clang_Cursor_isAnonymousRecordDecl (PR #120483)
Eli Friedman via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 18 13:57:30 PST 2024
https://github.com/efriedma-quic created https://github.com/llvm/llvm-project/pull/120483
None
>From 16e84acd0e86bf2653d4b3fa132bcf661a34e62f Mon Sep 17 00:00:00 2001
From: Eli Friedman <efriedma at quicinc.com>
Date: Wed, 18 Dec 2024 13:55:40 -0800
Subject: [PATCH] [cindex] Add python binding for
clang_Cursor_isAnonymousRecordDecl
---
clang/bindings/python/clang/cindex.py | 21 ++++++++++++++++---
.../bindings/python/tests/cindex/test_type.py | 3 +++
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py
index f8a20a1e224724..b6e0d71c1ae1b9 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -2125,12 +2125,26 @@ def get_field_offsetof(self):
def is_anonymous(self):
"""
- Check if the record is anonymous.
+ Check whether this is a record type without a name, or a field where
+ the type is a record type without a name.
+
+ Use is_anonymous_record_decl to check whether a record is an
+ "anonymous union" as defined in the C/C++ standard.
"""
if self.kind == CursorKind.FIELD_DECL:
return self.type.get_declaration().is_anonymous()
return conf.lib.clang_Cursor_isAnonymous(self) # type: ignore [no-any-return]
+ def is_anonymous_record_decl(self):
+ """
+ Check if the record is an anonymous union as defined in the C/C++ standard
+ (or an "anonymous struct", the corresponding non-standard extension for
+ structs).
+ """
+ if self.kind == CursorKind.FIELD_DECL:
+ return self.type.get_declaration().is_anonymous_record_decl()
+ return conf.lib.clang_Cursor_isAnonymousRecordDecl(self) # type: ignore [no-any-return]
+
def is_bitfield(self):
"""
Check if the field is a bitfield.
@@ -3902,12 +3916,13 @@ def write_main_file_to_stdout(self):
("clang_Cursor_getTemplateArgumentType", [Cursor, c_uint], Type),
("clang_Cursor_getTemplateArgumentValue", [Cursor, c_uint], c_longlong),
("clang_Cursor_getTemplateArgumentUnsignedValue", [Cursor, c_uint], c_ulonglong),
- ("clang_Cursor_isAnonymous", [Cursor], bool),
- ("clang_Cursor_isBitField", [Cursor], bool),
("clang_Cursor_getBinaryOpcode", [Cursor], c_int),
("clang_Cursor_getBriefCommentText", [Cursor], _CXString),
("clang_Cursor_getRawCommentText", [Cursor], _CXString),
("clang_Cursor_getOffsetOfField", [Cursor], c_longlong),
+ ("clang_Cursor_isAnonymous", [Cursor], bool),
+ ("clang_Cursor_isAnonymousRecordDecl", [Cursor], bool),
+ ("clang_Cursor_isBitField", [Cursor], bool),
("clang_Location_isInSystemHeader", [SourceLocation], bool),
("clang_Type_getAlignOf", [Type], c_longlong),
("clang_Type_getClassType", [Type], Type),
diff --git a/clang/bindings/python/tests/cindex/test_type.py b/clang/bindings/python/tests/cindex/test_type.py
index ce05fdb1a1ebc0..e1d8c2aad1c3a4 100644
--- a/clang/bindings/python/tests/cindex/test_type.py
+++ b/clang/bindings/python/tests/cindex/test_type.py
@@ -463,8 +463,11 @@ def test_offset(self):
self.assertNotEqual(children[0].spelling, "typeanon")
self.assertEqual(children[1].spelling, "typeanon")
self.assertEqual(fields[0].kind, CursorKind.FIELD_DECL)
+ self.assertTrue(fields[0].is_anonymous())
+ self.assertFalse(fields[0].is_anonymous_record_decl())
self.assertEqual(fields[1].kind, CursorKind.FIELD_DECL)
self.assertTrue(fields[1].is_anonymous())
+ self.assertTrue(fields[1].is_anonymous_record_decl())
self.assertEqual(teststruct.type.get_offset("typeanon"), f1)
self.assertEqual(teststruct.type.get_offset("bariton"), bariton)
self.assertEqual(teststruct.type.get_offset("foo"), foo)
More information about the cfe-commits
mailing list