diff options
author | Eric Fiselier <eric@efcs.ca> | 2016-07-20 00:14:10 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2016-07-20 00:14:10 +0000 |
commit | b11642bf947d917c7ec284247fe58eb2a25ab4bd (patch) | |
tree | bc491358ed6a8c3f98626a50611c269dc36439a9 /libcxx/test/std | |
parent | d2b886e569fb6c8621cc2b58873fa9e046d47d60 (diff) | |
download | bcm5719-llvm-b11642bf947d917c7ec284247fe58eb2a25ab4bd.tar.gz bcm5719-llvm-b11642bf947d917c7ec284247fe58eb2a25ab4bd.zip |
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.
llvm-svn: 276067
Diffstat (limited to 'libcxx/test/std')
-rw-r--r-- | libcxx/test/std/numerics/complex.number/cmplx.over/UDT_is_rejected.fail.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/libcxx/test/std/numerics/complex.number/cmplx.over/UDT_is_rejected.fail.cpp b/libcxx/test/std/numerics/complex.number/cmplx.over/UDT_is_rejected.fail.cpp new file mode 100644 index 00000000000..6a3ae48d7bb --- /dev/null +++ b/libcxx/test/std/numerics/complex.number/cmplx.over/UDT_is_rejected.fail.cpp @@ -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}} + } +} |