[llvm-branch-commits] [clang] Fix evaluation of the unsigned enumeration values, #108766 (PR #108768)

2024-09-15 Thread Dmitry Fursov via llvm-branch-commits

https://github.com/fursov created 
https://github.com/llvm/llvm-project/pull/108768

If the type of an enumeration is not native (e.g. uint8_t) but is unsigned then 
evaluation of the value might get wrong: for values bigger than half of type 
range the return value will be negative. This happens because for non-native 
enum types the TypeKind is ELABORATED. To get the real integer type, the 
conversion to canonical type is required before the enum_value() function can 
decide about type being signed or unsigned.

>From 7b21ad1d04153c3b27850626403e33eda85d9c3d Mon Sep 17 00:00:00 2001
From: Dmitry Fursov 
Date: Sun, 15 Sep 2024 18:14:48 +0300
Subject: [PATCH] Fix evaluation of the unsigned enumeration values

If the type of an enumeration is not native (e.g. uint8_t) but
is unsigned then evaluation of the value might get wrong: for
values bigger than half of type range the return value will be
negative. This happens because for non-native enum types the TypeKind
is ELABORATED. To get the real integer type, the conversion to
canonical type is required before the enum_value() function can
decide about type being signed or unsigned.
---
 clang/bindings/python/clang/cindex.py |  2 ++
 .../python/tests/cindex/test_cursor.py| 19 +++
 2 files changed, 21 insertions(+)

diff --git a/clang/bindings/python/clang/cindex.py 
b/clang/bindings/python/clang/cindex.py
index 754f03d718e882..67215f0b7fdcb7 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -1831,6 +1831,8 @@ def enum_value(self):
 underlying_type = self.type
 if underlying_type.kind == TypeKind.ENUM:
 underlying_type = underlying_type.get_declaration().enum_type
+if underlying_type.kind == TypeKind.ELABORATED:
+underlying_type = underlying_type.get_canonical()
 if underlying_type.kind in (
 TypeKind.CHAR_U,
 TypeKind.UCHAR,
diff --git a/clang/bindings/python/tests/cindex/test_cursor.py 
b/clang/bindings/python/tests/cindex/test_cursor.py
index 84cd8139418447..5cb3e638c94a60 100644
--- a/clang/bindings/python/tests/cindex/test_cursor.py
+++ b/clang/bindings/python/tests/cindex/test_cursor.py
@@ -511,6 +511,25 @@ def test_enum_values_cpp(self):
 self.assertEqual(ham.kind, CursorKind.ENUM_CONSTANT_DECL)
 self.assertEqual(ham.enum_value, 0x100)
 
+def test_enum_values_on_elaborated_type(self):
+tu = get_tu(
+"using myUType = unsigned char; enum TEST : myUType { SPAM = 1, 
HAM = 0xff;", lang="cpp"
+)
+enum = get_cursor(tu, "TEST")
+self.assertIsNotNone(enum)
+
+self.assertEqual(enum.kind, CursorKind.ENUM_DECL)
+
+enum_constants = list(enum.get_children())
+self.assertEqual(len(enum_constants), 2)
+
+spam, ham = enum_constants
+
+self.assertEqual(spam.kind, CursorKind.ENUM_CONSTANT_DECL)
+self.assertEqual(spam.enum_value, 1)
+self.assertEqual(ham.kind, CursorKind.ENUM_CONSTANT_DECL)
+self.assertEqual(ham.enum_value, 255)
+
 def test_annotation_attribute(self):
 tu = get_tu(
 'int foo (void) __attribute__ ((annotate("here be annotation 
attribute")));'

___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] Fix evaluation of the unsigned enumeration values, #108766 (PR #108768)

2024-09-16 Thread Dmitry Fursov via llvm-branch-commits

https://github.com/fursov closed 
https://github.com/llvm/llvm-project/pull/108768
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits