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.
-Dimitry