Skip to content

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

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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