Home | History | Annotate | Download | only in SemaTemplate
      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