Issue 110241
Summary [libc++] Are some standard overloads of `std::pow` missing?
Labels libc++
Assignees
Reporter frederick-vs-ja
    I'm referring to C++20/[WG21 N4868](https://wg21.link/n4868) here, because the changes of additional overloads of `std::pow` introduced in C++23 by [P1467R9](https://wg21.link/p1467r9) look defective and libc++ hasn't implemented P1467R9 yet.

In [N4868 [complex.syn]](https://timsong-cpp.github.io/cppwp/n4868/complex.syn) there were 3 explicitly specified standard overloads of `pow`:
```C++
 template<class T> complex<T> pow  (const complex<T>&, const T&);
 template<class T> complex<T> pow  (const complex<T>&, const complex<T>&);
 template<class T> complex<T> pow  (const T&, const complex<T>&);
```

And then, several additional overloads were specified in [N4868 [cmplx.over]/3](https://timsong-cpp.github.io/cppwp/n4868/cmplx.over#3), but their exact forms were not specified.

Currently, libc++ provides 4 overloads:
https://github.com/llvm/llvm-project/blob/1c26e2b6f90253efdf38a5a70d011722d4eb1216/libcxx/include/complex#L1095-L1116

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
1. whether libc++ is effectively conforming now, i.e. lacking of these 2 overloads isn't observable in any conforming program, and
2. whether there's any defect in the specification of explicitly overloads (effectively unchanged since C++20, see [[complex.syn]](https://eel.is/c++draft/complex.syn)) as they possibly cause `std::complex<std::complex<T>>` to be instantiated.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to