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