public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Adhemerval Zanella <azanella@sourceware.org>
To: glibc-cvs@sourceware.org
Subject: [glibc/azanella/clang] stdlib: Fix stdbit.h with -Wconversion for clang
Date: Mon, 29 Jan 2024 17:54:02 +0000 (GMT)	[thread overview]
Message-ID: <20240129175403.A9D6C385840B@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=baadeb59c9a279c6bcf723cf7f55159b57b50a91

commit baadeb59c9a279c6bcf723cf7f55159b57b50a91
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Thu Jan 4 14:59:28 2024 -0300

    stdlib: Fix stdbit.h with -Wconversion for clang
    
    With clang 14 and also with main the tst-stdbit-Wconversion
    issues the warnings:
    
      ../stdlib/stdbit.h:701:40: error: implicit conversion loses integer
      precision: 'int' to 'uint16_t' (aka 'unsigned short')
      [-Werror,-Wimplicit-int-conversion]
        return __x == 0 ? 0 : ((uint16_t) 1) << (__bw16_inline (__x) - 1);
        ~~~~~~                ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ../stdlib/stdbit.h:707:39: error: implicit conversion loses integer
      precision: 'int' to 'uint8_t' (aka 'unsigned char')
      [-Werror,-Wimplicit-int-conversion]
        return __x == 0 ? 0 : ((uint8_t) 1) << (__bw8_inline (__x) - 1);
        ~~~~~~                ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
      ../stdlib/stdbit.h:751:40: error: implicit conversion loses integer
      precision: 'int' to 'uint16_t' (aka 'unsigned short')
      [-Werror,-Wimplicit-int-conversion]
        return __x <= 1 ? 1 : ((uint16_t) 2) << (__bw16_inline (__x - 1) - 1);
        ~~~~~~                ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ../stdlib/stdbit.h:757:39: error: implicit conversion loses integer
      precision: 'int' to 'uint8_t' (aka 'unsigned char')
      [-Werror,-Wimplicit-int-conversion]
        return __x <= 1 ? 1 : ((uint8_t) 2) << (__bw8_inline (__x - 1) - 1);
        ~~~~~~                ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      tst-stdbit-Wconversion.c:45:31: error: implicit conversion loses integer
      precision: 'unsigned short' to 'uint8_t' (aka 'unsigned char')
      [-Werror,-Wimplicit-int-conversion]
        (void) stdc_trailing_zeros (us);
               ~~~~~~~~~~~~~~~~~~~~~^~~
      ../stdlib/stdbit.h:164:30: note: expanded from macro
      'stdc_trailing_zeros'
         : stdc_trailing_zeros_uc (x))
           ~~~~~~~~~~~~~~~~~~~~~~~~^~
      ../stdlib/stdbit.h:191:52: note: expanded from macro
      'stdc_trailing_zeros_uc'
      # define stdc_trailing_zeros_uc(x) (__ctz8_inline (x))
                                          ~~~~~~~~~~~~~  ^
      tst-stdbit-Wconversion.c:46:31: error: implicit conversion loses integer
      precision: 'unsigned int' to 'uint16_t' (aka 'unsigned short')
      [-Werror,-Wimplicit-int-conversion]
        (void) stdc_trailing_zeros (ui);
               ~~~~~~~~~~~~~~~~~~~~~^~~
      ../stdlib/stdbit.h:163:48: note: expanded from macro
      'stdc_trailing_zeros'
         : sizeof (x) == 2 ? stdc_trailing_zeros_us (x)       \
                             ~~~~~~~~~~~~~~~~~~~~~~~~^~
      ../stdlib/stdbit.h:192:53: note: expanded from macro
      'stdc_trailing_zeros_us'
      # define stdc_trailing_zeros_us(x) (__ctz16_inline (x))
                                          ~~~~~~~~~~~~~~  ^
      tst-stdbit-Wconversion.c:46:31: error: implicit conversion loses integer
      precision: 'unsigned int' to 'uint8_t' (aka 'unsigned char')
      [-Werror,-Wimplicit-int-conversion]
        (void) stdc_trailing_zeros (ui);
               ~~~~~~~~~~~~~~~~~~~~~^~~
      ../stdlib/stdbit.h:164:30: note: expanded from macro
      'stdc_trailing_zeros'
         : stdc_trailing_zeros_uc (x))
           ~~~~~~~~~~~~~~~~~~~~~~~~^~
      ../stdlib/stdbit.h:191:52: note: expanded from macro
      'stdc_trailing_zeros_uc'
      # define stdc_trailing_zeros_uc(x) (__ctz8_inline (x))
                                          ~~~~~~~~~~~~~  ^
      tst-stdbit-Wconversion.c:47:31: error: implicit conversion loses integer
      precision: 'unsigned long' to 'uint16_t' (aka 'unsigned short')
      [-Werror,-Wimplicit-int-conversion]
        (void) stdc_trailing_zeros (ul);
               ~~~~~~~~~~~~~~~~~~~~~^~~
      ../stdlib/stdbit.h:163:48: note: expanded from macro
      'stdc_trailing_zeros'
         : sizeof (x) == 2 ? stdc_trailing_zeros_us (x)       \
                             ~~~~~~~~~~~~~~~~~~~~~~~~^~
      ../stdlib/stdbit.h:192:53: note: expanded from macro
      'stdc_trailing_zeros_us'
      # define stdc_trailing_zeros_us(x) (__ctz16_inline (x))
                                          ~~~~~~~~~~~~~~  ^
      [...]
    
    It seems to boiler down to __builtin_clz not having a variant for 8 or
    16 bits.  Fix it by explicit casting to the expected types.  Although
    not strickly required for older gcc, using the same __pacify macro
    simpify the required code.
    
    Checked on x86_64-linux-gnu and i686-linux-gnu.

Diff:
---
 stdlib/stdbit.h | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/stdlib/stdbit.h b/stdlib/stdbit.h
index f334eb174d..624c566be8 100644
--- a/stdlib/stdbit.h
+++ b/stdlib/stdbit.h
@@ -199,8 +199,8 @@ __ctz8_inline (uint8_t __x)
   return __x == 0 ? 8U : (unsigned int) __builtin_ctz (__x);
 }
 
-# define stdc_trailing_zeros_uc(x) (__ctz8_inline (x))
-# define stdc_trailing_zeros_us(x) (__ctz16_inline (x))
+# define stdc_trailing_zeros_uc(x) (__ctz8_inline (__pacify_uint8 (x)))
+# define stdc_trailing_zeros_us(x) (__ctz16_inline (__pacify_uint16 (x)))
 # define stdc_trailing_zeros_ui(x) (__ctz32_inline (x))
 # if __WORDSIZE == 64
 #  define stdc_trailing_zeros_ul(x) (__ctz64_inline (x))
@@ -303,8 +303,8 @@ __flz8_inline (uint8_t __x)
   return __x == (uint8_t) -1 ? 0 : 1 + __clo8_inline (__x);
 }
 
-# define stdc_first_leading_zero_uc(x) (__flz8_inline (x))
-# define stdc_first_leading_zero_us(x) (__flz16_inline (x))
+# define stdc_first_leading_zero_uc(x) (__flz8_inline (__pacify_uint8 (x)))
+# define stdc_first_leading_zero_us(x) (__flz16_inline (__pacify_uint16 (x)))
 # define stdc_first_leading_zero_ui(x) (__flz32_inline (x))
 # if __WORDSIZE == 64
 #  define stdc_first_leading_zero_ul(x) (__flz64_inline (x))
@@ -357,8 +357,8 @@ __flo8_inline (uint8_t __x)
   return __x == 0 ? 0 : 1 + __clz8_inline (__x);
 }
 
-# define stdc_first_leading_one_uc(x) (__flo8_inline (x))
-# define stdc_first_leading_one_us(x) (__flo16_inline (x))
+# define stdc_first_leading_one_uc(x) (__flo8_inline (__pacify_uint8 (x)))
+# define stdc_first_leading_one_us(x) (__flo16_inline (__pacify_uint16 (x)))
 # define stdc_first_leading_one_ui(x) (__flo32_inline (x))
 # if __WORDSIZE == 64
 #  define stdc_first_leading_one_ul(x) (__flo64_inline (x))
@@ -411,8 +411,8 @@ __ftz8_inline (uint8_t __x)
   return __x == (uint8_t) -1 ? 0 : 1 + __cto8_inline (__x);
 }
 
-# define stdc_first_trailing_zero_uc(x) (__ftz8_inline (x))
-# define stdc_first_trailing_zero_us(x) (__ftz16_inline (x))
+# define stdc_first_trailing_zero_uc(x) (__ftz8_inline (__pacify_uint8 (x)))
+# define stdc_first_trailing_zero_us(x) (__ftz16_inline (__pacify_uint16 (x)))
 # define stdc_first_trailing_zero_ui(x) (__ftz32_inline (x))
 # if __WORDSIZE == 64
 #  define stdc_first_trailing_zero_ul(x) (__ftz64_inline (x))
@@ -465,8 +465,8 @@ __fto8_inline (uint8_t __x)
   return __x == 0 ? 0 : 1 + __ctz8_inline (__x);
 }
 
-# define stdc_first_trailing_one_uc(x) (__fto8_inline (x))
-# define stdc_first_trailing_one_us(x) (__fto16_inline (x))
+# define stdc_first_trailing_one_uc(x) (__fto8_inline (__pacify_uint8 (x)))
+# define stdc_first_trailing_one_us(x) (__fto16_inline (__pacify_uint16 (x)))
 # define stdc_first_trailing_one_ui(x) (__fto32_inline (x))
 # if __WORDSIZE == 64
 #  define stdc_first_trailing_one_ul(x) (__fto64_inline (x))

                 reply	other threads:[~2024-01-29 17:54 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240129175403.A9D6C385840B@sourceware.org \
    --to=azanella@sourceware.org \
    --cc=glibc-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).