Fixed signedness detection for function return values
authorRobert Pengelly <robertapengelly@hotmail.com>
Mon, 31 Aug 2026 09:46:55 +0000 (10:46 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Mon, 31 Aug 2026 09:46:55 +0000 (10:46 +0100)
amd64.c
i386.c

diff --git a/amd64.c b/amd64.c
index 90b44d1c5b336873a9a9db4e380bcc971148b3f4..c56c89ff082bef5c2a3169268ded5df892145030 100644 (file)
--- a/amd64.c
+++ b/amd64.c
@@ -8843,7 +8843,7 @@ static void parse_block (void) {
                         set_global_symbol_pointer_info (name, declarator_effective_pointer_depth_now (),
                             declarator_effective_pointed_size_now (parsed_type_size, object_fields, object_field_count));
                         set_global_symbol_tag_name (name, parsed_type_tag_name);
-                        set_global_symbol_unsigned (name, (declarator_is_pointer || declarator_has_function) ? 0 : parsed_type_is_unsigned);
+                        set_global_symbol_unsigned (name, declarator_is_pointer ? 0 : parsed_type_is_unsigned);
                         set_global_symbol_floating (name, (declarator_is_pointer || (declarator_has_function && declarator_function_is_pointer)) ? 0 : parsed_type_is_floating);
                         set_global_symbol_returns_void (name, declarator_has_function && parsed_type_is_void && !declarator_is_pointer && !declarator_function_is_pointer);
                         
@@ -38697,7 +38697,7 @@ static void parse_function_body (const char *name, int storage_class, int is_inl
         }
         
         set_global_symbol_size (name, return_is_void ? DATA_VOID : return_size);
-        set_global_symbol_unsigned (name, 0);
+        set_global_symbol_unsigned (name, return_pointer_depth > 0 ? 0 : return_is_unsigned);
         set_global_symbol_floating (name, return_is_floating);
         set_global_symbol_returns_void (name, return_is_void);
         set_global_symbol_noreturn (name, effective_noreturn);
@@ -40611,7 +40611,7 @@ static void parse_external_after_type (void) {
                     set_global_symbol_pointer_info (name, declarator_effective_pointer_depth_now (),
                         declarator_effective_pointed_size_now (parsed_type_size, object_fields, object_field_count));
                     set_global_symbol_tag_name (name, parsed_type_tag_name);
-                    set_global_symbol_unsigned (name, 0);
+                    set_global_symbol_unsigned (name, declarator_is_pointer ? 0 : parsed_type_is_unsigned);
                     set_global_symbol_floating (name, declarator_is_pointer ? 0 : parsed_type_is_floating);
                     set_global_symbol_returns_void (name, parsed_type_is_void && !declarator_is_pointer && !declarator_function_is_pointer);
                     
diff --git a/i386.c b/i386.c
index 650d2180f09a1b6d7f4ce35d69f7f44c69f17e63..7a5ca228c3a1ebc9fa515a96c1eddb94059b1536 100644 (file)
--- a/i386.c
+++ b/i386.c
@@ -8079,7 +8079,7 @@ static void parse_block (void) {
                         set_global_symbol_pointer_info (name, declarator_effective_pointer_depth_now (),
                             declarator_effective_pointed_size_now (parsed_type_size, object_fields, object_field_count));
                         set_global_symbol_tag_name (name, parsed_type_tag_name);
-                        set_global_symbol_unsigned (name, (declarator_is_pointer || declarator_has_function) ? 0 : parsed_type_is_unsigned);
+                        set_global_symbol_unsigned (name, declarator_is_pointer ? 0 : parsed_type_is_unsigned);
                         set_global_symbol_floating (name, (declarator_is_pointer || (declarator_has_function && declarator_function_is_pointer)) ? 0 : parsed_type_is_floating);
                         set_global_symbol_returns_void (name, declarator_has_function && parsed_type_is_void && !declarator_is_pointer && !declarator_function_is_pointer);
                         
@@ -36107,7 +36107,7 @@ static void parse_function_body (const char *name, int storage_class, int is_inl
         }
         
         set_global_symbol_size (name, return_is_void ? DATA_VOID : return_size);
-        set_global_symbol_unsigned (name, 0);
+        set_global_symbol_unsigned (name, return_is_unsigned);
         set_global_symbol_floating (name, return_is_floating);
         set_global_symbol_returns_void (name, return_is_void);
         set_global_symbol_noreturn (name, effective_noreturn);
@@ -37908,7 +37908,7 @@ static void parse_external_after_type (void) {
                     set_global_symbol_pointer_info (name, declarator_effective_pointer_depth_now (),
                         declarator_effective_pointed_size_now (parsed_type_size, object_fields, object_field_count));
                     set_global_symbol_tag_name (name, parsed_type_tag_name);
-                    set_global_symbol_unsigned (name, 0);
+                    set_global_symbol_unsigned (name, declarator_is_pointer ? 0 : parsed_type_is_unsigned);
                     set_global_symbol_floating (name, declarator_is_pointer ? 0 : parsed_type_is_floating);
                     set_global_symbol_returns_void (name, parsed_type_is_void && !declarator_is_pointer && !declarator_function_is_pointer);