https://github.com/efriedma-quic updated https://github.com/llvm/llvm-project/pull/120483
>From 4a525f61f9b67fcd887ed64a8c80521f7a21016d Mon Sep 17 00:00:00 2001 From: Eli Friedman <efrie...@quicinc.com> Date: Wed, 18 Dec 2024 13:55:40 -0800 Subject: [PATCH] [cindex] Add python binding for clang_Cursor_isAnonymousRecordDecl This function allows checking whether a declaration declares an anonymous union (as opposed to clang_Cursor_isAnonymous, which just checks if the declaration has a name). --- clang/bindings/python/clang/cindex.py | 21 ++++++++++++++++--- .../bindings/python/tests/cindex/test_type.py | 3 +++ clang/docs/ReleaseNotes.rst | 2 ++ 3 files changed, 23 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) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index b2231bb4584aae..4ddc47fc8bf606 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -883,6 +883,8 @@ Sanitizers Python Binding Changes ---------------------- - Fixed an issue that led to crashes when calling ``Type.get_exception_specification_kind``. +- Added binding for clang_Cursor_isAnonymousRecordDecl, which allows checking if a type is + an anonymous union. OpenMP Support -------------- _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits