[llvm-bugs] [Bug 33638] New: FreeBSD head -r320347 moved TARGET_ARCH=powerpc to 64-bit time_t but now experimental/filesystem/operations.cpp fails static_asserts and such

via llvm-bugs llvm-bugs at lists.llvm.org
Thu Jun 29 02:46:01 PDT 2017


https://bugs.llvm.org/show_bug.cgi?id=33638

            Bug ID: 33638
           Summary: FreeBSD head -r320347 moved TARGET_ARCH=powerpc to
                    64-bit time_t but now
                    experimental/filesystem/operations.cpp fails
                    static_asserts and such
           Product: libc++
           Version: 4.0
          Hardware: All
                OS: FreeBSD
            Status: NEW
          Severity: normal
          Priority: P
         Component: All Bugs
          Assignee: unassignedclangbugs at nondot.org
          Reporter: markmi at dsl-only.net
                CC: llvm-bugs at lists.llvm.org, mclow.lists at gmail.com

[This was a amd64 -> powerpc (32-bit) cross-buildworld
attempt. It is via the FreeBSD system clang 4 compiler
under head -r320458 .]

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 of 64-bit time_t and the like for
ILP32 contexts.


The error messages produced that stop the buildworld are:

--- 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'

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170629/fa42f4b1/attachment.html>


More information about the llvm-bugs mailing list