1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <complex>
11
12// Test that UDT's convertible to an integral or floating point type do not
13// participate in overload resolution.
14
15#include <complex>
16#include <type_traits>
17#include <cassert>
18
19template <class IntT>
20struct UDT {
21  operator IntT() const { return 1; }
22};
23
24UDT<float> ft;
25UDT<double> dt;
26UDT<long double> ldt;
27UDT<int> it;
28UDT<unsigned long> uit;
29
30int main()
31{
32    {
33        std::real(ft); // expected-error {{no matching function}}
34        std::real(dt); // expected-error {{no matching function}}
35        std::real(ldt); // expected-error {{no matching function}}
36        std::real(it); // expected-error {{no matching function}}
37        std::real(uit); // expected-error {{no matching function}}
38    }
39    {
40        std::imag(ft); // expected-error {{no matching function}}
41        std::imag(dt); // expected-error {{no matching function}}
42        std::imag(ldt); // expected-error {{no matching function}}
43        std::imag(it); // expected-error {{no matching function}}
44        std::imag(uit); // expected-error {{no matching function}}
45    }
46    {
47        std::arg(ft); // expected-error {{no matching function}}
48        std::arg(dt); // expected-error {{no matching function}}
49        std::arg(ldt); // expected-error {{no matching function}}
50        std::arg(it); // expected-error {{no matching function}}
51        std::arg(uit); // expected-error {{no matching function}}
52    }
53    {
54        std::norm(ft); // expected-error {{no matching function}}
55        std::norm(dt); // expected-error {{no matching function}}
56        std::norm(ldt); // expected-error {{no matching function}}
57        std::norm(it); // expected-error {{no matching function}}
58        std::norm(uit); // expected-error {{no matching function}}
59    }
60    {
61        std::conj(ft); // expected-error {{no matching function}}
62        std::conj(dt); // expected-error {{no matching function}}
63        std::conj(ldt); // expected-error {{no matching function}}
64        std::conj(it); // expected-error {{no matching function}}
65        std::conj(uit); // expected-error {{no matching function}}
66    }
67    {
68        std::proj(ft); // expected-error {{no matching function}}
69        std::proj(dt); // expected-error {{no matching function}}
70        std::proj(ldt); // expected-error {{no matching function}}
71        std::proj(it); // expected-error {{no matching function}}
72        std::proj(uit); // expected-error {{no matching function}}
73    }
74}
75