Hi all,

I am currently at a conference with limited time to work
on these issues.

Please feel free to temporarily back out the work so the C++
parts can be fixed.  It probably suffices to just make the
<C++20 path unconditional for C++ in general.

Please discuss this further on the pull request:

https://github.com/freebsd/freebsd-src/pull/2203

Yours,
Robert Clausecker

Am Thu, Jun 04, 2026 at 01:47:26PM +0200 schrieb Dimitry Andric:
> On 4 Jun 2026, at 13:38, Dimitry Andric <[email protected]> wrote:
> > 
> > On 4 Jun 2026, at 12:53, Nuno Teixeira <[email protected]> wrote:
> >> 
> >> Not sure if it is related but I'm seing some ports failing recently with 
> >> errors bellow.
> >> ( error: no viable conversion from ... to 'bool' )
> >> 
> >> Similar fails appears at pkg-fallout:
> >> 
> >> https://pkg-status.freebsd.org/beefy24/data/main-amd64-default/p226b23044ee7_s67df3130159/logs/binaryen-130.log
> >> https://pkg-status.freebsd.org/beefy24/data/main-amd64-default/p226b23044ee7_s67df3130159/logs/encryptpad-0.5.0.4_6.log
> >> 
> >> From node24 on main-n286352-73e0d6b44038:
> >> ```
> >> c++ -o 
> >> /wrkdirs/usr/ports/www/node24/work/node-v24.16.0/out/Release/obj.target/node_mksnapshot/tools/snapshot/node_mksnapshot.o
> >>  ../tools/snapshot/node_mksnapshot.cc '-D_GLIBCXX_USE_CXX11_ABI=1' 
> >> '-D_FILE_OFFSET_BITS=64' '-DNODE_OPENSSL_CONF_NAME=nodejs_conf' 
> >> '-DNODE_OPENSSL_CERT_STORE' '-DICU_NO_USER_DATA_OVERRIDE' 
> >> '-D__STDC_FORMAT_MACROS' '-DNODE_WANT_INTERNALS=1' 
> >> '-DNODE_MKSNAPSHOT_USE_ARRAY_LITERALS=1' '-DHAVE_OPENSSL=1' 
> >> '-DNODE_USE_NODE_CODE_CACHE=1' '-DHAVE_INSPECTOR=1' '-D__POSIX__' 
> >> '-DNODE_USE_V8_PLATFORM=1' '-DNODE_HAVE_I18N_SUPPORT=1' '-DHAVE_AMARO=1' 
> >> '-DHAVE_SQLITE=1' '-DHAVE_QUIC=0' -I../src -I../tools/msvs/genfiles
> >> -I../deps/v8/include -I../deps/cares/include -I../deps/uv/include 
> >> -I../deps/ncrypto -I../deps/v8/third_party/simdutf  -Wall -Wextra 
> >> -Wno-unused-parameter -pthread -Wall -Wextra -Wno-unused-parameter 
> >> -Werror=undefined-inline -Werror=extra-semi -Werror=ctad-maybe-unsupported 
> >> -m64 -O3 -fno-omit-frame-pointer -fno-rtti -fno-exceptions 
> >> -fno-strict-aliasing -std=gnu++20 -MMD -MF 
> >> /wrkdirs/usr/ports/www/node24/work/node-v24.16.0/out/Release/.deps//wrkdirs/usr/ports/www/node24/work/node-v24.16.0/out/Release/obj.target/node_mksnapshot/tools/snapshot/node_mksnapshot.o.d.raw
> >>  -isystem /usr/local/include -O2 -pipe -fstack-protector-strong -isystem 
> >> /usr/local/include -fno-strict-aliasing   -isystem /usr/local/include  -c
> >> ../test/embedding/embedtest.cc:138:12: error: no viable conversion from 
> >> 'node::EmbedderSnapshotData::Pointer' (aka 'unique_ptr<const 
> >> EmbedderSnapshotData, DeleteSnapshotData>') to 'bool'
> >>  138 |     assert(snapshot);
> >>      |            ^~~~~~~~
> >> /usr/include/c++/v1/__memory/unique_ptr.h:276:64: note: explicit 
> >> conversion function is not a candidate
> >>  276 |   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit 
> >> operator bool() const _NOEXCEPT {
> >>      |                                                                ^
> >> ../test/embedding/embedtest.cc:216:14: error: no viable conversion from 
> >> 'node::EmbedderSnapshotData::Pointer' (aka 'unique_ptr<const 
> >> EmbedderSnapshotData, DeleteSnapshotData>') to 'bool'
> >>  216 |       assert(snapshot);
> >>      |              ^~~~~~~~
> >> /usr/include/c++/v1/__memory/unique_ptr.h:276:64: note: explicit 
> >> conversion function is not a candidate
> >>  276 |   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit 
> >> operator bool() const _NOEXCEPT {
> >>      |                                                                ^
> >> 2 errors generated.
> >> ```
> >> 
> >> Any clues?
> > 
> > This is because converting a std::unique_ptr to bool requires an explicit 
> > conversion, i.e. "if (my_unique_ptr)" will work, but using it with assert() 
> > will not.
> > 
> > At least, our assert() as defined in /usr/include/assert.h in -CURRENT, has 
> > this contorted definition:
> > 
> > #if __cplusplus < 202002L
> > /*
> > * C++ modes prior to C++20 cannot simultaneously satisfy all three
> > * desirable properties of the sanitiser:
> > *
> > *   Approach                       No double-eval  Lambda support  Arity 
> > check
> > *   -----------------------------  --------------  --------------  
> > -----------
> > *   sizeof(cast(expression))       yes             no              yes
> > *   static_cast<bool>(expression)  no              yes             no
> > *   (void)bool(expression)         no              yes             no
> > *
> > *   NOTE: C++20 introduced lambdas in unevaluated contexts; see P0315R4.
> > *
> > * Since no approach satisfies all three below C++20, the least harmful
> > * choice is to forgo the check entirely rather than silently break one
> > * of the remaining guarantees.
> > *
> > */
> > #define __assert_sanitize(...)  ((void)0)
> > #else
> > #define __assert_sanitize(...)  
> > (void)sizeof(((bool(*)(bool))0)(__VA_ARGS__))
> > #endif /* __cplusplus < 202002L */
> > #else
> > #define __assert_sanitize(...)  
> > (void)sizeof(((_Bool(*)(_Bool))0)(__VA_ARGS__))
> > #endif /* __cplusplus */
> > #define assert(...)     (__assert_sanitize(__VA_ARGS__),       \
> >                            (__VA_ARGS__) ? (void)0 :          \
> >                            __assert(__func__, __FILE__,       \
> >                            __LINE__, #__VA_ARGS__))
> > 
> > which clearly does not work as intended. I would probalby be simpler to to 
> > use "!!" to force an explicit boolean conversion.
> > 
> > For now, the ports could be fixed by changing the asserts to "ptr != 
> > nulltr", or adding an explicit static_cast<bool>. Or we should probably fix 
> > our assert macro.
> 
> That is, the following C++20 program should really successfully compile with 
> our assert():
> 
> #include <cassert>
> #include <memory>
> 
> void f(std::unique_ptr<int> p)
> {
>   assert(p);
> }
> 
> but at the moment it does not:
> 
> unique-ptr-assert.cpp:6:10: error: no viable conversion from 
> 'std::unique_ptr<int>' to 'bool'
>     6 |   assert(p);
>       |          ^
> /usr/include/c++/v1/__memory/unique_ptr.h:276:64: note: explicit conversion 
> function is not a candidate
>   276 |   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit 
> operator bool() const _NOEXCEPT {
>       |                                                                ^
> 
> When compiled with -save-temps, it shows the eventual expression it dies on:
> 
> unique-ptr-assert.cpp:6:36: error: no viable conversion from 
> 'std::unique_ptr<int>' to 'bool'
>     6 |   ((void)sizeof(((bool(*)(bool))0)(p)), (p) ? (void)0 : 
> __assert(__func__, "unique-ptr-assert.cpp", 6, "p"));
>       |                                    ^
> 
> So it seems the recent changes to assert.h broke C++20 behavior.
> 
> -Dimitry
> 
> 
> 

-- 
()  ascii ribbon campaign - for an encoding-agnostic world
/\  - against html email  - against proprietary attachments

Reply via email to