You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
libc++libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.questionA question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!
I'm referring to C++20/WG21 N4868 here, because the changes of additional overloads of std::pow introduced in C++23 by P1467R9 look defective and libc++ hasn't implemented P1467R9 yet.
In N4868 [complex.syn] there were 3 explicitly specified standard overloads of pow:
If I understood correctly, only the first one is an explicitly specified overload, and the rest are additional overloads. So it seems that the remaining 2 overloads are missing.
However, when I attempted to added them during handling #110235, I found that it's very hard, if not impossible, to portably verify that these overloads are added. Because instantiating std::complex<NonFP> is unspecified and in some cases std::complex<std::complex<T>> would be instantiated when using braced-init-list due to the form of these overloads.
E.g. according to the current standard overload set, std::pow(std::complex<float>(1.0f), {1l, 1l}) would cause pow(const T&, const complex<T>&) (where T is complex<float>) to be detected, which in turn instantiates (probably nonsense) std::complex<std::complex<float>>.
It's not clear to me
whether libc++ is effectively conforming now, i.e. lacking of these 2 overloads isn't observable in any conforming program, and
whether there's any defect in the specification of explicitly overloads (effectively unchanged since C++20, see [complex.syn]) as they possibly cause std::complex<std::complex<T>> to be instantiated.
I think our overloads that use __promote might have been an undocumented extension we provided by mistake. I'd be curious to try removing them and replace them by the Standard ones.
I don't think it's possible to observe that we don't provide the overloads exactly as specified in the Standard, because those overloads are only enabled for arithmetic types and std::complex<T> can only be instantiated for T = {float, double, long double}. However, it might still be worth getting back in line with what the spec says.
libc++libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.questionA question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!
I'm referring to C++20/WG21 N4868 here, because the changes of additional overloads of
std::pow
introduced in C++23 by P1467R9 look defective and libc++ hasn't implemented P1467R9 yet.In N4868 [complex.syn] there were 3 explicitly specified standard overloads of
pow
:And then, several additional overloads were specified in N4868 [cmplx.over]/3, but their exact forms were not specified.
Currently, libc++ provides 4 overloads:
llvm-project/libcxx/include/complex
Lines 1095 to 1116 in 1c26e2b
If I understood correctly, only the first one is an explicitly specified overload, and the rest are additional overloads. So it seems that the remaining 2 overloads are missing.
However, when I attempted to added them during handling #110235, I found that it's very hard, if not impossible, to portably verify that these overloads are added. Because instantiating
std::complex<NonFP>
is unspecified and in some casesstd::complex<std::complex<T>>
would be instantiated when using braced-init-list due to the form of these overloads.E.g. according to the current standard overload set,
std::pow(std::complex<float>(1.0f), {1l, 1l})
would causepow(const T&, const complex<T>&)
(whereT
iscomplex<float>
) to be detected, which in turn instantiates (probably nonsense)std::complex<std::complex<float>>
.It's not clear to me
std::complex<std::complex<T>>
to be instantiated.Edit: LWG3693 is somehow related.
The text was updated successfully, but these errors were encountered: