Skip to content

<chrono>: cannot format unsigned durations with error error C2668: 'abs': ambiguous call to overloaded function #5945

@Stovent

Description

@Stovent

Describe the bug

I know that #5893 has been merged, but it seems specific to hh_mm_ss and not duration in general.

The following code does not compile with MSVC 19.latest on godbolt : https://godbolt.org/z/b1ejY1YrK
It also does not compile with MSVC from build tools 2026 (18.0.2), nor with clang 21.1.6 on Windows that uses MSVC STL.

Command-line test case

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

std::string test()
{
    const std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
    const std::chrono::high_resolution_clock::time_point finish = std::chrono::high_resolution_clock::now();
    const std::chrono::nanoseconds delta = finish - start;

    size_t frames = 60;
    std::chrono::duration<size_t, std::nano> res = delta / frames;
    return std::format("{}", res);
}

Expected behavior

This compiles fine on GCC or clang with libc++.

STL version

[cmake] -- The CXX compiler identification is MSVC 19.50.35719.0

  • Option 2: _MSVC_STL_UPDATE value
static_assert(202508L == _MSVC_STL_UPDATE); // is true

Additional context

The clang error output if necessary

[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\chrono:1637:78: error: no matching function for call to 'abs'
[build]  1637 |               _Hours{_CHRONO _Duration_cast_underflow_to_zero<_CHRONO hours>(_CHRONO abs(_Dur))},
[build]       |                                                                              ^~~~~~~~~~~
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\yvals_core.h:1946:17: note: expanded from macro '_CHRONO'
[build]  1946 | #define _CHRONO ::std::chrono::
[build]       |                 ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\chrono:5048:37: note: in instantiation of member function 'std::chrono::hh_mm_ss<std::chrono::duration<unsigned long long, std::ratio<1, 1000000000>>>::hh_mm_ss' requested here
[build]  5048 |             return _CHRONO _Fill_tm(hh_mm_ss{_Val});
[build]       |                                     ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\chrono:5866:55: note: in instantiation of function template specialization 'std::chrono::_Fill_tm<std::chrono::duration<unsigned long long, std::ratio<1, 1000000000>>>' requested here
[build]  5866 |         return _Impl._Write(_FormatCtx, _Val, _CHRONO _Fill_tm(_Val));
[build]       |                                                       ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\print:295:10: note: in instantiation of function template specialization 'std::_Print_impl<std::chrono::duration<unsigned long long, std::ratio<1, 1000000000>>>' requested here
[build]   295 |     _STD _Print_impl(_Add_newline::_Yes, _Stream, _Fmt, _STD forward<_Types>(_Args)...);
[build]       |          ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\print:314:10: note: in instantiation of function template specialization 'std::println<std::chrono::duration<unsigned long long, std::ratio<1, 1000000000>>>' requested here
[build]   314 |     _STD println(stdout, _Fmt, _STD forward<_Types>(_Args)...);
[build]       |          ^
[build] C:/Users/Stovent/Dropbox/Dev/CeDImu/benchmarks/benchmarkRenderers.cpp:63:10: note: in instantiation of function template specialization 'std::println<std::chrono::duration<unsigned long long, std::ratio<1, 1000000000>>>' requested here
[build]    63 |     std::println("{}/f", delta / FRAMES_CURSOR);
[build]       |          ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\__msvc_chrono.hpp:506:50: note: candidate template ignored: requirement 'numeric_limits<unsigned long long>::is_signed' was not satisfied [with _Rep = unsigned long long, _Period = std::ratio<1, 1000000000>]
[build]   506 |     _NODISCARD constexpr duration<_Rep, _Period> abs(const duration<_Rep, _Period> _Dur)
[build]       |                                                  ^
[build] In file included from C:/Users/Stovent/Dropbox/Dev/CeDImu/benchmarks/benchmarkRenderers.cpp:5:
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\chrono:1639:64: error: no matching function for call to 'abs'
[build]  1639 |                   _CHRONO _Remove_duration_part<_CHRONO hours>(_CHRONO abs(_Dur)))},
[build]       |                                                                ^~~~~~~~~~~
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\yvals_core.h:1946:17: note: expanded from macro '_CHRONO'
[build]  1946 | #define _CHRONO ::std::chrono::
[build]       |                 ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\__msvc_chrono.hpp:506:50: note: candidate template ignored: requirement 'numeric_limits<unsigned long long>::is_signed' was not satisfied [with _Rep = unsigned long long, _Period = std::ratio<1, 1000000000>]
[build]   506 |     _NODISCARD constexpr duration<_Rep, _Period> abs(const duration<_Rep, _Period> _Dur)
[build]       |                                                  ^
[build] In file included from C:/Users/Stovent/Dropbox/Dev/CeDImu/benchmarks/benchmarkRenderers.cpp:5:
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\chrono:1642:68: error: no matching function for call to 'abs'
[build]  1642 |                       _CHRONO _Remove_duration_part<_CHRONO hours>(_CHRONO abs(_Dur))))} {
[build]       |                                                                    ^~~~~~~~~~~
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\yvals_core.h:1946:17: note: expanded from macro '_CHRONO'
[build]  1946 | #define _CHRONO ::std::chrono::
[build]       |                 ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\__msvc_chrono.hpp:506:50: note: candidate template ignored: requirement 'numeric_limits<unsigned long long>::is_signed' was not satisfied [with _Rep = unsigned long long, _Period = std::ratio<1, 1000000000>]
[build]   506 |     _NODISCARD constexpr duration<_Rep, _Period> abs(const duration<_Rep, _Period> _Dur)
[build]       |                                                  ^
[build] In file included from C:/Users/Stovent/Dropbox/Dev/CeDImu/benchmarks/benchmarkRenderers.cpp:5:
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\chrono:1648:101: error: no matching function for call to 'abs'
[build]  1648 |                     _CHRONO duration_cast<precision>(_CHRONO _Remove_duration_part<_CHRONO seconds>(_CHRONO abs(_Dur)));
[build]       |                                                                                                     ^~~~~~~~~~~
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\yvals_core.h:1946:17: note: expanded from macro '_CHRONO'
[build]  1946 | #define _CHRONO ::std::chrono::
[build]       |                 ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\__msvc_chrono.hpp:506:50: note: candidate template ignored: requirement 'numeric_limits<unsigned long long>::is_signed' was not satisfied [with _Rep = unsigned long long, _Period = std::ratio<1, 1000000000>]
[build]   506 |     _NODISCARD constexpr duration<_Rep, _Period> abs(const duration<_Rep, _Period> _Dur)
[build]       |                                                  ^
[build] In file included from C:/Users/Stovent/Dropbox/Dev/CeDImu/benchmarks/benchmarkRenderers.cpp:5:
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\chrono:5624:28: error: call to 'abs' is ambiguous
[build]  5624 |                     _Os << _STD abs(_Val.count());
[build]       |                            ^~~~~~~~
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\yvals_core.h:1945:17: note: expanded from macro '_STD'
[build]  1945 | #define _STD    ::std::
[build]       |                 ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\chrono:5494:25: note: in instantiation of function template specialization 'std::chrono::_Chrono_formatter<char>::_Custom_write<std::chrono::duration<unsigned long long, std::ratio<1, 1000000000>>>' requested here
[build]  5494 |                     if (_Custom_write(_Stream, _Spec, _Time, _Val)) {
[build]       |                         ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\print:295:10: note: in instantiation of function template specialization 'std::_Print_impl<std::chrono::duration<unsigned long long, std::ratio<1, 1000000000>>>' requested here
[build]   295 |     _STD _Print_impl(_Add_newline::_Yes, _Stream, _Fmt, _STD forward<_Types>(_Args)...);
[build]       |          ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\print:314:10: note: in instantiation of function template specialization 'std::println<std::chrono::duration<unsigned long long, std::ratio<1, 1000000000>>>' requested here
[build]   314 |     _STD println(stdout, _Fmt, _STD forward<_Types>(_Args)...);
[build]       |          ^
[build] C:/Users/Stovent/Dropbox/Dev/CeDImu/benchmarks/benchmarkRenderers.cpp:63:10: note: in instantiation of function template specialization 'std::println<std::chrono::duration<unsigned long long, std::ratio<1, 1000000000>>>' requested here
[build]    63 |     std::println("{}/f", delta / FRAMES_CURSOR);
[build]       |          ^
[build] C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\ucrt\stdlib.h:293:34: note: candidate function
[build]   293 | _Check_return_ int       __cdecl abs   (_In_ int       _Number);
[build]       |                                  ^
[build] C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\ucrt\stdlib.h:363:17: note: candidate function
[build]   363 |     inline long abs(long const _X) throw()
[build]       |                 ^
[build] C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\ucrt\stdlib.h:368:22: note: candidate function
[build]   368 |     inline long long abs(long long const _X) throw()
[build]       |                      ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\cstdlib:23:41: note: candidate function
[build]    23 | _NODISCARD _Check_return_ inline double abs(_In_ double _Xx) noexcept /* strengthened */ {
[build]       |                                         ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\cstdlib:27:40: note: candidate function
[build]    27 | _NODISCARD _Check_return_ inline float abs(_In_ float _Xx) noexcept /* strengthened */ {
[build]       |                                        ^
[build] C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\include\cstdlib:31:46: note: candidate function
[build]    31 | _NODISCARD _Check_return_ inline long double abs(_In_ long double _Xx) noexcept /* strengthened */ {
[build]       |                                              ^
[build] 5 errors generated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingchronoC++20 chronofixedSomething works now, yay!formatC++20/23 format

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions