1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2
3 struct A { int x; }; // expected-note 2 {{candidate constructor}}
4
5 class Base {
6 public:
7 virtual void f();
8 };
9
10 class Derived : public Base { };
11
12 struct ConvertibleToInt {
13 operator int() const;
14 };
15
16 struct Constructible {
17 Constructible(int, float);
18 };
19
20 // ---------------------------------------------------------------------
21 // C-style casts
22 // ---------------------------------------------------------------------
23 template<typename T, typename U>
24 struct CStyleCast0 {
fCStyleCast025 void f(T t) {
26 (void)((U)t); // expected-error{{cannot convert 'A' to 'int' without a conversion operator}}
27 }
28 };
29
30 template struct CStyleCast0<int, float>;
31 template struct CStyleCast0<A, int>; // expected-note{{instantiation}}
32
33 // ---------------------------------------------------------------------
34 // static_cast
35 // ---------------------------------------------------------------------
36 template<typename T, typename U>
37 struct StaticCast0 {
fStaticCast038 void f(T t) {
39 (void)static_cast<U>(t); // expected-error{{no matching conversion for static_cast from 'int' to 'A'}}
40 }
41 };
42
43 template struct StaticCast0<ConvertibleToInt, bool>;
44 template struct StaticCast0<int, float>;
45 template struct StaticCast0<int, A>; // expected-note{{instantiation}}
46
47 // ---------------------------------------------------------------------
48 // dynamic_cast
49 // ---------------------------------------------------------------------
50 template<typename T, typename U>
51 struct DynamicCast0 {
fDynamicCast052 void f(T t) {
53 (void)dynamic_cast<U>(t); // expected-error{{not a reference or pointer}}
54 }
55 };
56
57 template struct DynamicCast0<Base*, Derived*>;
58 template struct DynamicCast0<Base*, A>; // expected-note{{instantiation}}
59
60 // ---------------------------------------------------------------------
61 // reinterpret_cast
62 // ---------------------------------------------------------------------
63 template<typename T, typename U>
64 struct ReinterpretCast0 {
fReinterpretCast065 void f(T t) {
66 (void)reinterpret_cast<U>(t); // expected-error{{qualifiers}}
67 }
68 };
69
70 template struct ReinterpretCast0<void (*)(int), void (*)(float)>;
71 template struct ReinterpretCast0<int const *, float *>; // expected-note{{instantiation}}
72
73 // ---------------------------------------------------------------------
74 // const_cast
75 // ---------------------------------------------------------------------
76 template<typename T, typename U>
77 struct ConstCast0 {
fConstCast078 void f(T t) {
79 (void)const_cast<U>(t); // expected-error{{not allowed}}
80 }
81 };
82
83 template struct ConstCast0<int const * *, int * *>;
84 template struct ConstCast0<int const *, float *>; // expected-note{{instantiation}}
85
86 // ---------------------------------------------------------------------
87 // C++ functional cast
88 // ---------------------------------------------------------------------
89 template<typename T, typename U>
90 struct FunctionalCast1 {
fFunctionalCast191 void f(T t) {
92 (void)U(t); // expected-error{{cannot convert 'A' to 'int' without a conversion operator}}
93 }
94 };
95
96 template struct FunctionalCast1<int, float>;
97 template struct FunctionalCast1<A, int>; // expected-note{{instantiation}}
98
99 // Generates temporaries, which we cannot handle yet.
100 template<int N, long M>
101 struct FunctionalCast2 {
fFunctionalCast2102 void f() {
103 (void)Constructible(N, M);
104 }
105 };
106
107 template struct FunctionalCast2<1, 3>;
108
109 // ---------------------------------------------------------------------
110 // implicit casting
111 // ---------------------------------------------------------------------
112 template<typename T>
113 struct Derived2 : public Base { };
114
test_derived_to_base(Base * & bp,Derived2<int> * dp)115 void test_derived_to_base(Base *&bp, Derived2<int> *dp) {
116 bp = dp;
117 }
118