#1890·abseil-cpp

[Bug]: Incorrect absl::bit_width return type for gcc <= 12

Author: jmrCreated May 19, 2025Updated Aug 7, 2026

Describe the issue

absl::bit_width(0UL) should return an int. With gcc <= 12 and C++20, it's unsigned long since absl::bit_width is an alias for std::bit_width.

https://github.com/abseil/abseil-cpp/blob/41a1f434d40bc6089acaf026b00c5f8f917e8706/absl/numeric/bits.h#L148

libcstdc++ fixed this in https://github.com/gcc-mirror/gcc/commit/4581328022615c2cb732cfb404151c4b059d26e3#diff-b38391c368270ae056dc788c5adfd749d9fd6fffc9a7c2287da44ce88b6139fd

Steps to reproduce the problem

https://godbolt.org/z/jebjo6GKb

static_assert(std::is_same_v<decltype(std::bit_width(0UL)), int>);

What version of Abseil are you using?

LTS 20250512.0

What operating system and version are you using?

debian testing

What compiler and version are you using?

Using built-in specs.
COLLECT_GCC=/opt/compiler-explorer/gcc-12.4.0/bin/g++
Target: x86_64-linux-gnu
Configured with: ../gcc-12.4.0/configure --prefix=/opt/compiler-explorer/gcc-build/staging --enable-libstdcxx-backtrace=yes --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --disable-bootstrap --enable-multiarch --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --enable-clocale=gnu --enable-languages=c,c++,fortran,ada,objc,obj-c++,go,d --enable-ld=yes --enable-gold=yes --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-linker-build-id --enable-lto --enable-plugins --enable-threads=posix --with-pkgversion=Compiler-Explorer-Build-gcc--binutils-2.42
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 12.4.0 (Compiler-Explorer-Build-gcc--binutils-2.42) 
COLLECT_GCC_OPTIONS='-fdiagnostics-color=always' '-g' '-o' '/app/output.s' '-masm=intel' '-fno-verbose-asm' '-S' '-std=c++20' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' '/app/'
 /opt/compiler-explorer/gcc-12.4.0/bin/../libexec/gcc/x86_64-linux-gnu/12.4.0/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -iprefix /opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/x86_64-linux-gnu/12.4.0/ -D_GNU_SOURCE <source> -quiet -dumpdir /app/ -dumpbase output.cpp -dumpbase-ext .cpp -masm=intel -mtune=generic -march=x86-64 -g -std=c++20 -version -fdiagnostics-color=always -fno-verbose-asm -o /app/output.s
GNU C++20 (Compiler-Explorer-Build-gcc--binutils-2.42) version 12.4.0 (x86_64-linux-gnu)
	compiled by GNU C version 11.4.0, GMP version 6.2.1, MPFR version 4.1.0, MPC version 1.2.1, isl version isl-0.24-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/x86_64-linux-gnu/12.4.0/../../../../x86_64-linux-gnu/include"
ignoring duplicate directory "/opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/12.4.0/../../../../include/c++/12.4.0"
ignoring duplicate directory "/opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/12.4.0/../../../../include/c++/12.4.0/x86_64-linux-gnu"
ignoring duplicate directory "/opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/12.4.0/../../../../include/c++/12.4.0/backward"
ignoring duplicate directory "/opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/12.4.0/include"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring duplicate directory "/opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/12.4.0/include-fixed"
ignoring nonexistent directory "/opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/../../lib/gcc/x86_64-linux-gnu/12.4.0/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/x86_64-linux-gnu/12.4.0/../../../../include/c++/12.4.0
 /opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/x86_64-linux-gnu/12.4.0/../../../../include/c++/12.4.0/x86_64-linux-gnu
 /opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/x86_64-linux-gnu/12.4.0/../../../../include/c++/12.4.0/backward
 /opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/x86_64-linux-gnu/12.4.0/include
 /opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/x86_64-linux-gnu/12.4.0/include-fixed
 /usr/local/include
 /opt/compiler-explorer/gcc-12.4.0/bin/../lib/gcc/../../include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C++20 (Compiler-Explorer-Build-gcc--binutils-2.42) version 12.4.0 (x86_64-linux-gnu)
	compiled by GNU C version 11.4.0, GMP version 6.2.1, MPFR version 4.1.0, MPC version 1.2.1, isl version isl-0.24-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: c7335fbf28754d6313ca2e82b97549fe
<source>:4:20: error: static assertion failed
    4 | static_assert(std::is_same_v<decltype(std::bit_width(0UL)), int>);
      |               ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Compiler returned: 1

What build system are you using?

n/a

Additional context

No response