Bug #18823
closed_Bool not defined for C++
Description
When a _Bool argument is added to rb_fd_select ruby cannot be compiled on
VisualStudio 2022
VisualStudio 2019
gcc-5
gcc-4.8
clang-5
clang-4
clang-3.9
c++98 (llvm 14)
c++2a (llvm 14)
which suggests that if defined(HAVE_STDBOOL_H) && (__cplusplus >= 201103L)
in include/ruby/internal/stdbool.h
may not be a great way to detect that C++ has bool, especially on Visual Studio.
Updated by michals (Michal Suchánek) over 2 years ago
Apparently for MSVC to report the correct c++ version it needs the /Zc:__cplusplus flag.
I don't know where to inject this flag, though.
The other failure cases are probably really obsolete.
Updated by mame (Yusuke Endoh) over 2 years ago
- Status changed from Open to Feedback
When a _Bool argument is added to rb_fd_select
I cannot understand what do you mean. Could you elaborate how to reproduce your issue and show the error log?
Updated by michals (Michal Suchánek) over 2 years ago
I added a _Bool argument as part of other development which prevents ruby from building on older compiler versions and VS - eg. https://github.com/ruby/ruby/commit/6c72653d98c36c2a816bfff4e4e9b1c451154a9e
Updated by michals (Michal Suchánek) over 2 years ago
generating cxxanyargs-x64-mswin64_140.def
compiling ../../../../src/ext/-test-/cxxanyargs/cxxanyargs.cpp
cxxanyargs.cpp
D:\a\ruby\ruby\src\include\ruby/internal/intern/select/win32.h(213): error C2061: syntax error: identifier '_Bool'
D:\a\ruby\ruby\src\include\ruby/internal/intern/select.h(84): error C2061: syntax error: identifier '_Bool'
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64\cl.EXE"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64\nmake.EXE"' : return code '0x2'
Run ../src/configure -C ${default_configure} ${append_configure} --with-gcc="${default_cc} ${append_cc}" --enable-shared
configure: creating cache config.cache
checking for ruby... /usr/bin/ruby
made symlink config.guess to .downloaded-cache/config.guess
made symlink config.sub to .downloaded-cache/config.sub
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for llvm-ar-14... llvm-ar-14
checking for clang++-14... clang++-14
checking for llvm-nm-14... llvm-nm-14
checking for llvm-objcopy-14... llvm-objcopy-14
checking for llvm-objdump-14... llvm-objdump-14
checking for llvm-ranlib-14... llvm-ranlib-14
checking for llvm-strip-14... llvm-strip-14
checking for gcc... clang-14
...
compiling ../../../../src/ext/-test-/debug/init.c
In file included from ../../../../src/ext/-test-/cxxanyargs/cxxanyargs.cpp:1:
In file included from ../../../../src/include/ruby/ruby.h:193:
In file included from ../../../../src/include/ruby/intern.h:54:
In file included from ../../../../src/include/ruby/internal/intern/select.h:35:
../../../../src/include/ruby/internal/intern/select/largesize.h:179:127: error: unknown type name '_Bool'
int rb_fd_select(int nfds, rb_fdset_t *rfds, rb_fdset_t *wfds, rb_fdset_t *efds ,rb_fdset_t *errfds, struct timeval *timeout, _Bool select);
^
In file included from ../../../../src/ext/-test-/cxxanyargs/cxxanyargs.cpp:1:
In file included from ../../../../src/include/ruby/ruby.h:193:
In file included from ../../../../src/include/ruby/intern.h:54:
../../../../src/include/ruby/internal/intern/select.h:84:134: error: unknown type name '_Bool'
int rb_thread_fd_select(int nfds, rb_fdset_t *rfds, rb_fdset_t *wfds, rb_fdset_t *efds ,rb_fdset_t *errfds, struct timeval *timeout, _Bool select);
^
2 errors generated.
Updated by mame (Yusuke Endoh) over 2 years ago
- Status changed from Feedback to Rejected
michals (Michal Suchánek) wrote in #note-3:
I added a _Bool argument as part of other development which prevents ruby from building on older compiler versions and VS - eg. https://github.com/ruby/ruby/commit/6c72653d98c36c2a816bfff4e4e9b1c451154a9e
I think include/ruby/internal/stdbool.h defines "bool", not "_Bool".
BTW, I don't know of any actual examples that uses "bool" in the public API signature. I guess it is defined just for internal.
Updated by michals (Michal Suchánek) over 2 years ago
include/ruby/internal/stdbool.h defines _Bool, and in most cases just uses bool defined by the runtime.
I have no idea how there would even be _Bool if not defined there.
_Bools is used in bigdecimal and detected in extconf so it's not strictly internal.
Also rb_fd_select does not sound like public API and is not used by the bundled extensions but might be used by something like eventmachine.
Extensions do get the internal headers included, though. Hence the error when _Bool is used in function prototypes in one of these internal headers.
Updated by mame (Yusuke Endoh) over 2 years ago
michals (Michal Suchánek) wrote in #note-6:
include/ruby/internal/stdbool.h defines _Bool, and in most cases just uses bool defined by the runtime.
No. C99 defines "_Bool" as an intrinsic type, and C's stdbool.h defines "bool" as an alias to "_Bool". See the specification of the C language and https://pubs.opengroup.org/onlinepubs/009696799/basedefs/stdbool.h.html .
include/ruby/internal/stdbool.h attempts to define "bool" in C89, C99, and C++. C++ provides "bool" as an intrinsic type, so the header does almost nothing.
BTW, I am a little baffled by a bug report like "ruby does not compile if I modify its source code".
Updated by michals (Michal Suchánek) over 2 years ago
Thanks for the clarification.
I see that ruby core uses bool pretty consistently, and _Bool is used only in a few places.
Not sure where I copied it from.