summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2016-07-20 00:14:10 +0000
committerEric Fiselier <eric@efcs.ca>2016-07-20 00:14:10 +0000
commitb11642bf947d917c7ec284247fe58eb2a25ab4bd (patch)
treebc491358ed6a8c3f98626a50611c269dc36439a9 /libcxx/test/std
parentd2b886e569fb6c8621cc2b58873fa9e046d47d60 (diff)
downloadbcm5719-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.cpp74
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}}
+ }
+}
OpenPOWER on IntegriCloud