Skip to content

<chrono>: Cannot construct an hh_mm_ss object from an unsigned duration #5569

Description

Describe the bug

An hh_mm_ss cannot be constructed from an unsigned duration.

Command-line test case

C:\Temp>type repro.cpp
#include <chrono>

int main() {
  std::chrono::duration<std::uint32_t> dur{1};
  auto hms = std::chrono::hh_mm_ss(dur);
}

$ cl /EHsc /W4 /WX /std:c++latest repro.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.44.35208 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

/std:c++latest is provided as a preview of language features from the latest C++
working draft, and we're eager to hear about bugs and suggestions for improvements.
However, note that these features are provided as-is without support, and subject
to changes or removal as the working draft evolves. See
https://go.microsoft.com/fwlink/?linkid=2045807 for details.

repro.cpp
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1635): error C2672: 'std::chrono::abs': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/__msvc_chrono.hpp(506): note: could be 'std::chrono::duration<_Rep,_Period> std::chrono::abs(const std::chrono::duration<_Rep,_Period>) noexcept(<expr>)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1635): note: 'std::chrono::duration<_Rep,_Period> std::chrono::abs(const std::chrono::duration<_Rep,_Period>) noexcept(<expr>)': could not deduce template argument for '__formal'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/__msvc_chrono.hpp(505): note: 'std::enable_if_t<false,int>' : Failed to specialize alias template
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1635): note: the template instantiation context (the oldest one first) is
repro.cpp(5): note: see reference to class template instantiation 'std::chrono::hh_mm_ss<std::chrono::duration<uint32_t,std::ratio<1,1>>>' being compiled
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1633): note: while compiling class template member function 'std::chrono::hh_mm_ss<std::chrono::duration<uint32_t,std::ratio<1,1>>>::hh_mm_ss(_Duration)'
        with
        [
            _Duration=std::chrono::duration<uint32_t,std::ratio<1,1>>
        ]
repro.cpp(5): note: see the first reference to 'std::chrono::hh_mm_ss<std::chrono::duration<uint32_t,std::ratio<1,1>>>::hh_mm_ss' in 'main'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1635): error C2672: 'std::chrono::_Duration_cast_underflow_to_zero': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1583): note: could be '_To std::chrono::_Duration_cast_underflow_to_zero(const _From &)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1637): error C2672: 'std::chrono::abs': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/__msvc_chrono.hpp(506): note: could be 'std::chrono::duration<_Rep,_Period> std::chrono::abs(const std::chrono::duration<_Rep,_Period>) noexcept(<expr>)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1637): note: 'std::chrono::duration<_Rep,_Period> std::chrono::abs(const std::chrono::duration<_Rep,_Period>) noexcept(<expr>)': could not deduce template argument for '__formal'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/__msvc_chrono.hpp(505): note: 'std::enable_if_t<false,int>' : Failed to specialize alias template
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1637): error C2672: 'std::chrono::_Remove_duration_part': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1592): note: could be 'common_type<_Ty1,_Ty2>::type std::chrono::_Remove_duration_part(const _From &)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1636): error C2672: 'std::chrono::_Duration_cast_underflow_to_zero': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1583): note: could be '_To std::chrono::_Duration_cast_underflow_to_zero(const _From &)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1639): error C2672: 'std::chrono::abs': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/__msvc_chrono.hpp(506): note: could be 'std::chrono::duration<_Rep,_Period> std::chrono::abs(const std::chrono::duration<_Rep,_Period>) noexcept(<expr>)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1639): note: 'std::chrono::duration<_Rep,_Period> std::chrono::abs(const std::chrono::duration<_Rep,_Period>) noexcept(<expr>)': could not deduce template argument for '__formal'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/__msvc_chrono.hpp(505): note: 'std::enable_if_t<false,int>' : Failed to specialize alias template
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1639): error C2672: 'std::chrono::_Remove_duration_part': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1592): note: could be 'common_type<_Ty1,_Ty2>::type std::chrono::_Remove_duration_part(const _From &)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1639): error C2672: 'std::chrono::_Remove_duration_part': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1592): note: could be 'common_type<_Ty1,_Ty2>::type std::chrono::_Remove_duration_part(const _From &)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1638): error C2672: 'std::chrono::_Duration_cast_underflow_to_zero': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1583): note: could be '_To std::chrono::_Duration_cast_underflow_to_zero(const _From &)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1644): error C2672: 'std::chrono::abs': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/__msvc_chrono.hpp(506): note: could be 'std::chrono::duration<_Rep,_Period> std::chrono::abs(const std::chrono::duration<_Rep,_Period>) noexcept(<expr>)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1644): note: 'std::chrono::duration<_Rep,_Period> std::chrono::abs(const std::chrono::duration<_Rep,_Period>) noexcept(<expr>)': could not deduce template argument for '__formal'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/__msvc_chrono.hpp(505): note: 'std::enable_if_t<false,int>' : Failed to specialize alias template
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1644): error C2672: 'std::chrono::_Remove_duration_part': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1592): note: could be 'common_type<_Ty1,_Ty2>::type std::chrono::_Remove_duration_part(const _From &)'
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/chrono(1644): error C2672: 'std::chrono::duration_cast': no matching overloaded function found
/home/md5i/src/msvc-wine/msvc/vc/tools/msvc/14.44.35207/include/__msvc_chrono.hpp(87): note: could be '_To std::chrono::duration_cast(const std::chrono::duration<_Rep,_Period> &) noexcept(<expr>)'

Expected behavior

The expected behavior is for this to compile.

Additional context

Possibly related: #4144
Compiler explorer output: https://godbolt.org/z/844Wob4av
Similar bug from libstdc++: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108265

Metadata

Metadata

Assignees

No one assigned

    Labels

    chronoC++20 chronofixedSomething works now, yay!

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions