//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // XFAIL: FROZEN-CXX03-HEADERS-FIXME // template complex<__promote_t> pow(const complex&, const U&); // template complex<__promote_t> pow(const complex&, const complex&); // template complex<__promote_t> pow(const T&, const complex&); // Test that these additional overloads are free from catching std::complex, // which is expected by several 3rd party libraries, see https://llvm.org/PR109858. // // Note that we reserve the right to break this in the future if we have a reason to, but for the time being, // make sure we don't break this property unintentionally. #include #include #include #include #include "test_macros.h" namespace usr { struct usr_tag {}; template typename std::enable_if<(std::is_same::value && std::is_floating_point::value) || (std::is_floating_point::value && std::is_same::value), int>::type pow(const T&, const std::complex&) { return std::is_same::value ? 0 : 1; } template typename std::enable_if<(std::is_same::value && std::is_floating_point::value) || (std::is_floating_point::value && std::is_same::value), int>::type pow(const std::complex&, const U&) { return std::is_same::value ? 2 : 3; } template typename std::enable_if<(std::is_same::value && std::is_floating_point::value) || (std::is_floating_point::value && std::is_same::value), int>::type pow(const std::complex&, const std::complex&) { return std::is_same::value ? 4 : 5; } } // namespace usr int main(int, char**) { using std::pow; using usr::pow; usr::usr_tag tag; const std::complex ctag; assert(pow(tag, std::complex(1.0f)) == 0); assert(pow(std::complex(1.0f), tag) == 2); assert(pow(tag, std::complex(1.0)) == 0); assert(pow(std::complex(1.0), tag) == 2); assert(pow(tag, std::complex(1.0l)) == 0); assert(pow(std::complex(1.0l), tag) == 2); assert(pow(1.0f, ctag) == 1); assert(pow(ctag, 1.0f) == 3); assert(pow(1.0, ctag) == 1); assert(pow(ctag, 1.0) == 3); assert(pow(1.0l, ctag) == 1); assert(pow(ctag, 1.0l) == 3); assert(pow(ctag, std::complex(1.0f)) == 4); assert(pow(std::complex(1.0f), ctag) == 5); assert(pow(ctag, std::complex(1.0)) == 4); assert(pow(std::complex(1.0), ctag) == 5); assert(pow(ctag, std::complex(1.0l)) == 4); assert(pow(std::complex(1.0l), ctag) == 5); return 0; }