[The libc++ code in question appears to not be ready for 32-bit contexts with 64 bit times. Disable experimental/filesystem for now? I've submitted llvm bugzilla 33638 for the issue and have added it to llvm's 25780, the FreeBSD META for clang.]
On 2017-Jun-29, at 2:21 AM, Mark Millard <mar...@dsl-only.net> wrote: > [TARGET_ARCH=powerpc64 fails similarly in its world32 > part of its build.] > > On 2017-Jun-29, at 1:33 AM, Mark Millard <mar...@dsl-only.net> wrote: > >> Beyond static_assert failures and overflow/underflow of long long >> it also it complains in some cases about: >> >> static_assert expression is not an integral constant expression >> >> >> [I will note that attempting a gcc 4.2.1 build did not >> stop and report such things for its libstdc++. The below >> is somehow libc++ and/or clang 4 specific.] >> >> >> Context: >> >> # uname -apKU >> FreeBSD FreeBSDx64OPC 12.0-CURRENT FreeBSD 12.0-CURRENT r320458M amd64 >> amd64 1200036 1200036 >> >> buildworld for TARGET_ARCH=powerpc resulted in: >> >> --- filesystem/operations.o --- >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:579:1: >> error: static_assert failed "" >> static_assert(is_representable({max_time_t, 999999999}), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:580:1: >> error: static_assert failed "" >> static_assert(is_representable({max_time_t, 1000000000}), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:581:1: >> error: static_assert failed "" >> static_assert(is_representable({min_time_t, 0}), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:603:1: >> error: static_assert failed "" >> static_assert(!is_representable(file_time_type::max()), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:604:1: >> error: static_assert failed "" >> static_assert(!is_representable(file_time_type::min()), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:605:15: >> error: static_assert expression is not an integral constant expression >> static_assert(is_representable(file_time_type(seconds(max_time_t))), ""); >> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/include/chrono:386:59: note: value >> 9223372036854775807000000 is outside the range of representable values of >> type 'long long' >> static_cast<_Ct>(__fd.count()) * >> static_cast<_Ct>(_Period::num))); >> ^ >> /usr/src/contrib/libc++/include/chrono:413:12: note: in call to >> '&__duration_cast<duration<long long, std::__1::ratio<1, 1> >, >> std::__1::chrono::duration<long long, std::__1::ratio<1, 1000000> > >> >()->operator()(seconds(max_time_t))' >> return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd); >> ^ >> /usr/src/contrib/libc++/include/chrono:560:26: note: in call to >> 'duration_cast(seconds(max_time_t))' >> : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) >> {} >> ^ >> /usr/src/contrib/libc++/include/__config:390:15: note: expanded from macro >> '_VSTD' >> #define _VSTD std::_LIBCPP_NAMESPACE >> ^ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:605:47: >> note: in call to 'duration(seconds(max_time_t), 0)' >> static_assert(is_representable(file_time_type(seconds(max_time_t))), ""); >> ^ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:606:15: >> error: static_assert expression is not an integral constant expression >> static_assert(is_representable(file_time_type(seconds(min_time_t))), ""); >> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/include/chrono:386:59: note: value >> -9223372036854775808000000 is outside the range of representable values of >> type 'long long' >> static_cast<_Ct>(__fd.count()) * >> static_cast<_Ct>(_Period::num))); >> ^ >> /usr/src/contrib/libc++/include/chrono:413:12: note: in call to >> '&__duration_cast<duration<long long, std::__1::ratio<1, 1> >, >> std::__1::chrono::duration<long long, std::__1::ratio<1, 1000000> > >> >()->operator()(seconds(min_time_t))' >> return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd); >> ^ >> /usr/src/contrib/libc++/include/chrono:560:26: note: in call to >> 'duration_cast(seconds(min_time_t))' >> : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) >> {} >> ^ >> /usr/src/contrib/libc++/include/__config:390:15: note: expanded from macro >> '_VSTD' >> #define _VSTD std::_LIBCPP_NAMESPACE >> ^ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:606:47: >> note: in call to 'duration(seconds(min_time_t), 0)' >> static_assert(is_representable(file_time_type(seconds(min_time_t))), ""); >> ^ >> . . . >> --- lib__L --- >> 7 errors generated. >> *** [filesystem/operations.o] Error code 1 >> >> make[5]: stopped in /usr/src/lib/libc++experimental >> .ERROR_TARGET='filesystem/operations.o' >> .ERROR_META_FILE='/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/lib/libc++experimental/_usr_obj_powerpcvtsc_clang_powerpc.powerpc_usr_src_lib_libc++experimental_filesystem_operations.o.meta' >> .MAKE.LEVEL='5' >> MAKEFILE='' >> .MAKE.MODE='meta missing-filemon=yes missing-meta=yes silent=yes verbose' >> _ERROR_CMD='c++ -target powerpc-unknown-freebsd12.0 >> --sysroot=/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/tmp >> -B/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/tmp/usr/bin -O2 -pipe >> -fstack-protector-strong -Wno-empty-body -Wno-string-plus-int >> -Wno-unused-const-variable -Wno-tautological-compare -Wno-unused-value >> -Wno-parentheses-equality -Wno-unused-function -Wno-enum-conversion >> -Wno-unused-local-typedef -Wno-address-of-packed-member -Wno-switch >> -Wno-switch-enum -Wno-knr-promoted-parameter -Wno-parentheses >> -Qunused-arguments -fpic -isystem /usr/src/contrib/libc++/include >> -nostdinc++ -nostdlib -D_LIBCPP_BUILDING_LIBRARY -DLIBCXXRT -std=c++14 >> -Wno-c++11-extensions -c >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp -o >> filesystem/operations.o;' >> .CURDIR='/usr/src/lib/libc++experimental' >> >> >> # more >> /usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/lib/libc++experimental/_usr_obj_powerpcvtsc_clang_powerpc.powerpc_usr_src_lib_libc++experimental_filesystem_operations.o.meta >> # Meta data file >> /usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/lib/libc++experimental/_usr_obj_powerpcvtsc_clang_powerpc.powerpc_usr_src_lib_libc++experimental_filesystem_operations.o.meta >> CMD c++ -target powerpc-unknown-freebsd12.0 >> --sysroot=/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/tmp >> -B/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/tmp/usr/bin -O2 -pipe >> -fstack-protector-strong -Wno-empty-body -Wno-string-plus-int >> -Wno-unused-const-variable -Wno-tautological-compare -Wno-unused-value >> -Wno-parentheses-equality -Wno-unused-function -Wno-enum-conversion >> -Wno-unused-local-typedef -Wno-address-of-packed-member -Wno-switch >> -Wno-switch-enum -Wno-knr-promoted-parameter -Wno-parentheses >> -Qunused-arguments -fpic -isystem /usr/src/contrib/libc++/include >> -nostdinc++ -nostdlib -D_LIBCPP_BUILDING_LIBRARY -DLIBCXXRT -std=c++14 >> -Wno-c++11-extensions -c >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp -o >> filesystem/operations.o >> CWD /usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/lib/libc++experimental >> TARGET filesystem/operations.o >> -- command output -- >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:579:1: >> error: static_assert failed "" >> static_assert(is_representable({max_time_t, 999999999}), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:580:1: >> error: static_assert failed "" >> static_assert(is_representable({max_time_t, 1000000000}), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:581:1: >> error: static_assert failed "" >> static_assert(is_representable({min_time_t, 0}), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:603:1: >> error: static_assert failed "" >> static_assert(!is_representable(file_time_type::max()), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:604:1: >> error: static_assert failed "" >> static_assert(!is_representable(file_time_type::min()), ""); >> ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:605:15: >> error: static_assert expression is not an integral constant expression >> static_assert(is_representable(file_time_type(seconds(max_time_t))), ""); >> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/include/chrono:386:59: note: value >> 9223372036854775807000000 is outside the range of representable values of >> type 'long long' >> static_cast<_Ct>(__fd.count()) * >> static_cast<_Ct>(_Period::num))); >> ^ >> /usr/src/contrib/libc++/include/chrono:413:12: note: in call to >> '&__duration_cast<duration<long long, std::__1::ratio<1, 1> >, >> std::__1::chrono::duration<long long, std::__1::ratio<1, 1000000> > >> >()->operator()(seconds(max_time_t))' >> return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd); >> ^ >> /usr/src/contrib/libc++/include/chrono:560:26: note: in call to >> 'duration_cast(seconds(max_time_t))' >> : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) >> {} >> ^ >> /usr/src/contrib/libc++/include/__config:390:15: note: expanded from macro >> '_VSTD' >> #define _VSTD std::_LIBCPP_NAMESPACE >> ^ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:605:47: >> note: in call to 'duration(seconds(max_time_t), 0)' >> static_assert(is_representable(file_time_type(seconds(max_time_t))), ""); >> ^ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:606:15: >> error: static_assert expression is not an integral constant expression >> static_assert(is_representable(file_time_type(seconds(min_time_t))), ""); >> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /usr/src/contrib/libc++/include/chrono:386:59: note: value >> -9223372036854775808000000 is outside the range of representable values of >> type 'long long' >> static_cast<_Ct>(__fd.count()) * >> static_cast<_Ct>(_Period::num))); >> ^ >> /usr/src/contrib/libc++/include/chrono:413:12: note: in call to >> '&__duration_cast<duration<long long, std::__1::ratio<1, 1> >, >> std::__1::chrono::duration<long long, std::__1::ratio<1, 1000000> > >> >()->operator()(seconds(min_time_t))' >> return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd); >> ^ >> /usr/src/contrib/libc++/include/chrono:560:26: note: in call to >> 'duration_cast(seconds(min_time_t))' >> : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) >> {} >> ^ >> /usr/src/contrib/libc++/include/__config:390:15: note: expanded from macro >> '_VSTD' >> #define _VSTD std::_LIBCPP_NAMESPACE >> ^ >> /usr/src/contrib/libc++/src/experimental/filesystem/operations.cpp:606:47: >> note: in call to 'duration(seconds(min_time_t), 0)' >> static_assert(is_representable(file_time_type(seconds(min_time_t))), ""); >> ^ >> 7 errors generated. >> *** Error code 1 >> >> >> >> Build configuration: >> >> >> # svnlite info /usr/src/ | grep "Re[plv]" >> Relative URL: ^/head >> Repository Root: svn://svn.freebsd.org/base >> Repository UUID: ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f >> Revision: 320458 >> Last Changed Rev: 320458 >> >> >> # more >> ~/sys_build_scripts.amd64-host/make_powerpcvtsc_nodebug_clang_bootstrap-amd64-host.sh >> >> kldload -n filemon && \ >> script >> ~/sys_typescripts/typescript_make_powerpcvtsc_nodebug_clang_bootstrap-amd64-host-$(date >> +%Y-%m-%d:%H:%M:%S) \ >> env __MAKE_CONF="/root/src.configs/make.conf" SRCCONF="/dev/null" >> SRC_ENV_CONF="/root/src.configs/src.conf.powerpc-clang-bootstrap.amd64-host" >> \ >> WITH_META_MODE=yes \ >> MAKEOBJDIRPREFIX="/usr/obj/powerpcvtsc_clang" \ >> make $* >> >> >> # more /root/src.configs/src.conf.powerpc-clang-bootstrap.amd64-host >> TO_TYPE=powerpc >> # >> KERNCONF=GENERICvtsc-NODBG >> TARGET=${TO_TYPE} >> .if ${.MAKE.LEVEL} == 0 >> TARGET_ARCH=${TO_TYPE} >> .export TARGET_ARCH >> .endif >> # >> WITH_CROSS_COMPILER= >> WITHOUT_SYSTEM_COMPILER= >> # >> WITH_LIBCPLUSPLUS= >> WITH_BINUTILS_BOOTSTRAP= >> WITH_ELFTOOLCHAIN_BOOTSTRAP= >> WITH_CLANG_BOOTSTRAP= >> WITH_CLANG= >> WITH_CLANG_IS_CC= >> WITH_CLANG_FULL= >> WITH_CLANG_EXTRAS= >> WITH_LLD= >> # lldb requires missing atomic 8-byte operations for powerpc (non-64) >> WITHOUT_LLDB= >> # >> WITH_BOOT= >> WITHOUT_LIB32= >> # >> WITHOUT_GCC_BOOTSTRAP= >> WITHOUT_GCC= >> WITHOUT_GCC_IS_CC= >> WITHOUT_GNUCXX= >> # >> NO_WERROR= >> # >> # Use WERROR to avoid stopping at the likes of: >> # error: implicit conversion from 'int' to 'int8_t' (aka 'signed char') >> changes value from 128 to -128 [-Werror,-Wconstant-conversion] >> WERROR= >> MALLOC_PRODUCTION= >> # >> WITH_REPRODUCIBLE_BUILD= >> WITH_DEBUG_FILES= > > > The world32 part of a TARGET_ARCH=powerpc64 cross-buildworld > also gets the same errors. Turns out the libc++ code in question looks like: _LIBCPP_CONSTEXPR_AFTER_CXX11 bool is_representable(TimeSpec const& tm) { if (tm.tv_sec >= 0) { return (tm.tv_sec < max_seconds) || (tm.tv_sec == max_seconds && tm.tv_nsec <= max_nsec); } else if (tm.tv_sec == (min_seconds - 1)) { return tm.tv_nsec >= min_nsec_timespec; } else { return (tm.tv_sec >= min_seconds); } } #ifndef _LIBCPP_HAS_NO_CXX14_CONSTEXPR #if defined(__LP64__) . . . #else static_assert(is_representable({max_time_t, 999999999}), ""); static_assert(is_representable({max_time_t, 1000000000}), ""); static_assert(is_representable({min_time_t, 0}), ""); #endif #endif _LIBCPP_CONSTEXPR_AFTER_CXX11 bool is_representable(file_time_type const& tm) { auto secs = duration_cast<seconds>(tm.time_since_epoch()); auto nsecs = duration_cast<nanoseconds>(tm.time_since_epoch() - secs); if (nsecs.count() < 0) { secs = secs + seconds(1); nsecs = nsecs + seconds(1); } using TLim = numeric_limits<time_t>; if (secs.count() >= 0) return secs.count() <= TLim::max(); return secs.count() >= TLim::min(); } #ifndef _LIBCPP_HAS_NO_CXX14_CONSTEXPR #if defined(__LP64__) . . . #else static_assert(!is_representable(file_time_type::max()), ""); static_assert(!is_representable(file_time_type::min()), ""); static_assert(is_representable(file_time_type(seconds(max_time_t))), ""); static_assert(is_representable(file_time_type(seconds(min_time_t))), ""); #endif #endif _LIBCPP_CONSTEXPR_AFTER_CXX11 file_time_type convert_timespec(TimeSpec const& tm) { auto adj_msec = duration_cast<microseconds>(nanoseconds(tm.tv_nsec)); if (tm.tv_sec >= 0) { auto Dur = seconds(tm.tv_sec) + microseconds(adj_msec); return file_time_type(Dur); } else if (duration_cast<microseconds>(nanoseconds(tm.tv_nsec)).count() == 0) { return file_time_type(seconds(tm.tv_sec)); } else { // tm.tv_sec < 0 auto adj_subsec = duration_cast<microseconds>(seconds(1) - nanoseconds(tm.tv_nsec)); auto Dur = seconds(tm.tv_sec + 1) - adj_subsec; return file_time_type(Dur); } } #ifndef _LIBCPP_HAS_NO_CXX14_CONSTEXPR #if defined(__LP64__) . . . #else // FIXME add tests for 32 bit builds #endif #endif That "FIXME" likely gives a clue as to the status of of the handling for ILP32 contexts. There seems to be the expectation that IPL32 will not have 64-bit time_t as well. === Mark Millard markmi at dsl-only.net _______________________________________________ freebsd-toolchain@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain To unsubscribe, send any mail to "freebsd-toolchain-unsubscr...@freebsd.org"