@@ -611,6 +611,53 @@ _STD _Common_float_type_t<_Ty1, _Ty2> remquo(_Ty1 _Left, _Ty2 _Right, int* _Pquo
611
611
return __builtin_##NAME(_Xx, _Yx); \
612
612
}
613
613
614
+ #define _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, ARG) \
615
+ template <class _Ty, _STD enable_if_t<_STD is_arithmetic_v<_Ty>, int> = 0> \
616
+ _NODISCARD _Check_return_ inline bool NAME(_In_ ARG _Xx, _In_ _Ty _Yx) noexcept /* strengthened */ { \
617
+ return __builtin_##NAME(static_cast<double>(_Xx), static_cast<double>(_Yx)); \
618
+ }
619
+
620
+ #ifdef __cpp_char8_t
621
+ #define _CLANG_BUILTIN2_ARG_TEMPLATED_CHAR8_T(NAME) \
622
+ template <class _Ty, _STD enable_if_t<_STD is_arithmetic_v<_Ty>, int> = 0> \
623
+ _NODISCARD _Check_return_ inline bool NAME(_In_ char8_t _Xx, _In_ _Ty _Yx) noexcept /* strengthened */ { \
624
+ return __builtin_##NAME(static_cast<double>(_Xx), static_cast<double>(_Yx)); \
625
+ }
626
+ #else // ^^^ defined(__cpp_char8_t) / !defined(__cpp_char8_t) vvv
627
+ #define _CLANG_BUILTIN2_ARG_TEMPLATED_CHAR8_T(NAME)
628
+ #endif // ^^^ !defined(__cpp_char8_t) ^^^
629
+
630
+ #ifdef _NATIVE_WCHAR_T_DEFINED
631
+ #define _CLANG_BUILTIN2_ARG_TEMPLATED_WCHAR_T(NAME) \
632
+ template <class _Ty, _STD enable_if_t<_STD is_arithmetic_v<_Ty>, int> = 0> \
633
+ _NODISCARD _Check_return_ inline bool NAME(_In_ wchar_t _Xx, _In_ _Ty _Yx) noexcept /* strengthened */ { \
634
+ return __builtin_##NAME(static_cast<double>(_Xx), static_cast<double>(_Yx)); \
635
+ }
636
+ #else // ^^^ defined(_NATIVE_WCHAR_T_DEFINED) / !defined(_NATIVE_WCHAR_T_DEFINED) vvv
637
+ #define _CLANG_BUILTIN2_ARG_TEMPLATED_WCHAR_T(NAME)
638
+ #endif // ^^^ !defined(_NATIVE_WCHAR_T_DEFINED) ^^^
639
+
640
+ #define _CLANG_BUILTIN2_TEMPLATED(NAME) \
641
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, float) \
642
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, double) \
643
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, long double) \
644
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, signed char) \
645
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, short) \
646
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, int) \
647
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, long) \
648
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, long long) \
649
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, unsigned char) \
650
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, unsigned short) \
651
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, unsigned int) \
652
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, unsigned long) \
653
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, unsigned long long) \
654
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, bool) \
655
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, char) \
656
+ _CLANG_BUILTIN2_ARG_TEMPLATED_CHAR8_T(NAME) \
657
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, char16_t) \
658
+ _CLANG_BUILTIN2_ARG_TEMPLATED(NAME, char32_t) \
659
+ _CLANG_BUILTIN2_ARG_TEMPLATED_WCHAR_T(NAME)
660
+
614
661
#define _CLANG_BUILTIN1(NAME) \
615
662
_CLANG_BUILTIN1_ARG(NAME, float) \
616
663
_CLANG_BUILTIN1_ARG(NAME, double) \
@@ -633,19 +680,30 @@ _CLANG_BUILTIN2(islessequal)
633
680
_CLANG_BUILTIN2(islessgreater)
634
681
_CLANG_BUILTIN2(isunordered)
635
682
683
+ _CLANG_BUILTIN2_TEMPLATED(isgreater)
684
+ _CLANG_BUILTIN2_TEMPLATED(isgreaterequal)
685
+ _CLANG_BUILTIN2_TEMPLATED(isless)
686
+ _CLANG_BUILTIN2_TEMPLATED(islessequal)
687
+ _CLANG_BUILTIN2_TEMPLATED(islessgreater)
688
+ _CLANG_BUILTIN2_TEMPLATED(isunordered)
689
+
636
690
#undef _CLANG_BUILTIN1_ARG
637
691
#undef _CLANG_BUILTIN2_ARG
638
692
#undef _CLANG_BUILTIN1
639
693
#undef _CLANG_BUILTIN2
694
+ #undef _CLANG_BUILTIN2_ARG_TEMPLATED
695
+ #undef _CLANG_BUILTIN2_ARG_TEMPLATED_CHAR8_T
696
+ #undef _CLANG_BUILTIN2_ARG_TEMPLATED_WCHAR_T
697
+ #undef _CLANG_BUILTIN2_TEMPLATED
640
698
#endif // ^^^ defined(__clang__) ^^^
641
699
642
- // TRANSITION, GH-519 , should be provided by UCRT
700
+ // TRANSITION, DevCom-10294165 , should be provided by UCRT
643
701
template <class _Ty, _STD enable_if_t<_STD is_integral_v<_Ty>, int> = 0>
644
702
_NODISCARD _Check_return_ _CONSTEXPR23 int fpclassify(_In_ const _Ty _Ix) noexcept /* strengthened */ {
645
703
return _Ix == 0 ? FP_ZERO : FP_NORMAL;
646
704
}
647
705
648
- // TRANSITION, GH-519 , should be provided by UCRT
706
+ // TRANSITION, DevCom-10294165 , should be provided by UCRT
649
707
template <class _Ty, _STD enable_if_t<_STD is_integral_v<_Ty>, int> = 0>
650
708
_NODISCARD _Check_return_ _CONSTEXPR23 bool signbit(_In_ const _Ty _Ix) noexcept /* strengthened */ {
651
709
if constexpr (static_cast<_Ty>(-1) < _Ty{}) {
@@ -655,7 +713,7 @@ _NODISCARD _Check_return_ _CONSTEXPR23 bool signbit(_In_ const _Ty _Ix) noexcept
655
713
}
656
714
}
657
715
658
- // TRANSITION, GH-519 , additional overloads are not templated to avoid ambiguity with the major overload in UCRT
716
+ // TRANSITION, DevCom-10294165 , additional overloads are not templated to avoid ambiguity with the overload in UCRT
659
717
#define _GENERIC_MATH_ISNORMAL(TYPE) \
660
718
_NODISCARD _Check_return_ _CONSTEXPR23 bool isnormal(_In_ const TYPE _Ix) noexcept /* strengthened */ { \
661
719
return _Ix != 0; \
@@ -729,7 +787,7 @@ _GENERIC_MATH_ISNORMAL(wchar_t)
729
787
#define _GENERIC_MATH2I(FUN, CLANG_INTRIN, MSVC_INTRIN) _GENERIC_MATH2_BASE(FUN, _CSTD FUN)
730
788
#endif // ^^^ intrinsics unavailable ^^^
731
789
732
- // TRANSITION, GH-519 , additional overloads are not templated to avoid ambiguity with the major overload in UCRT
790
+ // TRANSITION, DevCom-10294165 , additional overloads are not templated to avoid ambiguity with the overload in UCRT
733
791
#define _GENERIC_MATH_CLASSIFY1_RETV_INTEGER(FUN, RETV, TYPE) \
734
792
_NODISCARD _Check_return_ _CONSTEXPR23 bool FUN(_In_ TYPE) noexcept /* strengthened */ { \
735
793
return RETV; \
0 commit comments