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 { 25 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 { 38 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 { 52 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 { 65 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 { 78 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 { 91 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 { 102 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 115 void test_derived_to_base(Base *&bp, Derived2<int> *dp) { 116 bp = dp; 117 } 118