Add SFINAE on additional overloads of std::complex functions. Fixes PR19921.

The functions arg, conj, imag, norm, proj, and real have additional overloads
for arguments of integral or floating point types. However these overloads should
not allow conversions to the integral/floating point types, only exact matches.

This patch constrains these functions so they no longer allow conversions.


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@276067 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2016-07-20 00:14:10 +00:00
parent 99029f12eb
commit 781fb2a738
3 changed files with 137 additions and 147 deletions

View File

@@ -0,0 +1,74 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <complex>
// Test that UDT's convertible to an integral or floating point type do not
// participate in overload resolution.
#include <complex>
#include <type_traits>
#include <cassert>
template <class IntT>
struct UDT {
operator IntT() const { return 1; }
};
UDT<float> ft;
UDT<double> dt;
UDT<long double> ldt;
UDT<int> it;
UDT<unsigned long> uit;
int main()
{
{
std::real(ft); // expected-error {{no matching function}}
std::real(dt); // expected-error {{no matching function}}
std::real(ldt); // expected-error {{no matching function}}
std::real(it); // expected-error {{no matching function}}
std::real(uit); // expected-error {{no matching function}}
}
{
std::imag(ft); // expected-error {{no matching function}}
std::imag(dt); // expected-error {{no matching function}}
std::imag(ldt); // expected-error {{no matching function}}
std::imag(it); // expected-error {{no matching function}}
std::imag(uit); // expected-error {{no matching function}}
}
{
std::arg(ft); // expected-error {{no matching function}}
std::arg(dt); // expected-error {{no matching function}}
std::arg(ldt); // expected-error {{no matching function}}
std::arg(it); // expected-error {{no matching function}}
std::arg(uit); // expected-error {{no matching function}}
}
{
std::norm(ft); // expected-error {{no matching function}}
std::norm(dt); // expected-error {{no matching function}}
std::norm(ldt); // expected-error {{no matching function}}
std::norm(it); // expected-error {{no matching function}}
std::norm(uit); // expected-error {{no matching function}}
}
{
std::conj(ft); // expected-error {{no matching function}}
std::conj(dt); // expected-error {{no matching function}}
std::conj(ldt); // expected-error {{no matching function}}
std::conj(it); // expected-error {{no matching function}}
std::conj(uit); // expected-error {{no matching function}}
}
{
std::proj(ft); // expected-error {{no matching function}}
std::proj(dt); // expected-error {{no matching function}}
std::proj(ldt); // expected-error {{no matching function}}
std::proj(it); // expected-error {{no matching function}}
std::proj(uit); // expected-error {{no matching function}}
}
}