Bug #21024
closedRuby including <cstdbool> generates compilation warning with GCC 15, header is deprecated in C++17,
Description
C++ compiler in GCC 15 now generates a warning when trying to include <cstdbool>
.
This file is being included when compiling with C++ compiler from include/ruby/internal/stdbool.h
.
In C++, true, false and bool are keywords so including headers for boolean definitions should not be necessary.
Alternatively, just including <stdbool.h> should be sufficient as that is what the #include <cstdbool>
results in with GCC.
Simplest fix is just deleting the lines that are including the file (see attached patch and comments 2 and 3 from downstream issue linked in the bottom section "Additional info").
Considering the wide array of compilers Ruby aims to support to be compiled with I wanted to make an issue here first to make sure
there isn't a supported compiler that wouldn't agree with this approach.
Reproduction:
Obtain GCC 15, for Fedora Rawhide there is currently a repo of maintainer, I use it in Fedora Rawhide container (podman is replaceable for docker here):
host$ podman run -it --rm registry.fedoraproject.org/fedora:rawhide bash
container# echo "[gcc_15]
name=pre-release GCC 15 Repo
baseurl=https://fedorapeople.org/~dmalcolm/gcc/gcc-15-mass-prebuild/$basearch
type=rpm-md
skip_if_unavailable=True
gpgcheck=0
repo_gpgcheck=0
enabled=1
enabled_metadata=1" > /etc/yum.repos.d/gcc_15.repo
container# dnf install --assumeyes g++ ruby-devel
^ should install g++-15.0.0
and ruby.h
needed for the reproducer.
Note: that baseurl is a custom space of a Fedora maintainer.
Have a file named for example main.cpp
:
#include <ruby.h>
int main(void) {
return 0;
}
Compile with GCC 15
$ g++ main.cpp
Current behavior:
Compiling throws warning:
$ g++ main.cpp
In file included from /usr/include/ruby/internal/stdbool.h:30,
from /usr/include/ruby/backward/2/bool.h:22,
from /usr/include/ruby/defines.h:74,
from /usr/include/ruby/ruby.h:25,
from /usr/include/ruby.h:38,
from reproducer.cpp:1:
/usr/include/c++/15/cstdbool:48:6: warning: #warning "<cstdbool> is deprecated in C++17, remove the #include" [-Wcpp]
48 | # warning "<cstdbool> is deprecated in C++17, remove the #include"
| ^~~~~~~
Expected:
Compilation throws no warnings and compiles the executable:
$ g++ reproducer.cpp
$ echo $?
0
Additional info:
$ g++ --version
g++ (GCC) 15.0.0 20241203 (Red Hat 15.0.0-0)
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
This was met during recompilation of libdnf5 that includes -Werror
in their compilation flags,
See downstream discussion: https://bugzilla.redhat.com/show_bug.cgi?id=2336567
Considering the inclusion of the throws me up to 5 years ago back ( https://github.com/ruby/ruby/blob/9e6e39c3512f7a962c44dc3729c98a0f8be90341/include/ruby/3/stdbool.h ), I assume this warning will be the case with older rubies as well as newest master when using GCC 15.
Files
Updated by nobu (Nobuyoshi Nakada) 19 days ago
That patch will break C++-11 and C++-14.
Updated by nobu (Nobuyoshi Nakada) 19 days ago
- Status changed from Open to Closed
Applied in changeset git|1b3037081ef9fc121b83e213d997a069acd5904b.
[Bug #21024] header is deprecated in C++17
Updated by jaruga (Jun Aruga) 16 days ago
For the record, nobu sent the following PR, and merged.
Updated by jprokop (Jarek Prokop) 6 days ago
Sent a backport for Ruby 3.4 as well https://github.com/ruby/ruby/pull/12628
as that the Ruby we ship in Fedora in combination with GCC 15 where the warning was encountered.
Updated by nobu (Nobuyoshi Nakada) 6 days ago
- Backport changed from 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN to 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: REQUIRED
Updated by nobu (Nobuyoshi Nakada) 6 days ago
Marked backport to 3.4: required.