Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -verify %s
      2 
      3 // ---------------------------------------------------------------------
      4 // Imaginary literals
      5 // ---------------------------------------------------------------------
      6 template<typename T>
      7 struct ImaginaryLiteral0 {
      8   void f(T &x) {
      9     x = 3.0I; // expected-error{{incompatible type}}
     10   }
     11 };
     12 
     13 template struct ImaginaryLiteral0<_Complex float>;
     14 template struct ImaginaryLiteral0<int*>; // expected-note{{instantiation}}
     15 
     16 // ---------------------------------------------------------------------
     17 // Compound assignment operator
     18 // ---------------------------------------------------------------------
     19 namespace N1 {
     20   struct X { };
     21 
     22   int& operator+=(X&, int); // expected-note{{candidate}}
     23 }
     24 
     25 namespace N2 {
     26   long& operator+=(N1::X&, long); // expected-note{{candidate}}
     27 
     28   template<typename T, typename U, typename Result>
     29   struct PlusEquals0 {
     30     void f(T t, U u) {
     31       Result r = t += u; // expected-error{{ambiguous}}
     32     }
     33   };
     34 }
     35 
     36 namespace N3 {
     37   struct Y : public N1::X {
     38     short& operator+=(long); // expected-note{{candidate}}
     39   };
     40 }
     41 
     42 template struct N2::PlusEquals0<N1::X, int, int&>;
     43 template struct N2::PlusEquals0<N1::X, long, long&>;
     44 template struct N2::PlusEquals0<N3::Y, long, short&>;
     45 template struct N2::PlusEquals0<int, int, int&>;
     46 template struct N2::PlusEquals0<N3::Y, int, short&>; // expected-note{{instantiation}}
     47 
     48 // ---------------------------------------------------------------------
     49 // Conditional operator
     50 // ---------------------------------------------------------------------
     51 template<typename T, typename U, typename Result>
     52 struct Conditional0 {
     53   void f(T t, U u) {
     54     Result result = t? : u;
     55   }
     56 };
     57 
     58 template struct Conditional0<int, int, int>;
     59 
     60 // ---------------------------------------------------------------------
     61 // Statement expressions
     62 // ---------------------------------------------------------------------
     63 template<typename T>
     64 struct StatementExpr0 {
     65   void f(T t) {
     66     (void)({
     67         if (t) // expected-error{{contextually convertible}}
     68           t = t + 17;
     69         t + 12; // expected-error{{invalid operands}}
     70       });
     71   }
     72 };
     73 
     74 template struct StatementExpr0<int>;
     75 template struct StatementExpr0<N1::X>; // expected-note{{instantiation}}
     76 
     77 // ---------------------------------------------------------------------
     78 // __builtin_choose_expr
     79 // ---------------------------------------------------------------------
     80 template<bool Cond, typename T, typename U, typename Result>
     81 struct Choose0 {
     82   void f(T t, U u) {
     83     Result r = __builtin_choose_expr(Cond, t, u); // expected-error{{lvalue}}
     84   }
     85 };
     86 
     87 template struct Choose0<true, int, float, int&>;
     88 template struct Choose0<false, int, float, float&>;
     89 template struct Choose0<true, int, float, float&>; // expected-note{{instantiation}}
     90 
     91 // ---------------------------------------------------------------------
     92 // __builtin_va_arg
     93 // ---------------------------------------------------------------------
     94 template<typename ArgType>
     95 struct VaArg0 {
     96   void f(int n, ...) {
     97     __builtin_va_list va;
     98     __builtin_va_start(va, n);
     99     for (int i = 0; i != n; ++i)
    100       (void)__builtin_va_arg(va, ArgType);
    101     __builtin_va_end(va);
    102   }
    103 };
    104 
    105 template struct VaArg0<int>;
    106 
    107 template<typename VaList, typename ArgType>
    108 struct VaArg1 {
    109   void f(int n, ...) {
    110     VaList va;
    111     __builtin_va_start(va, n); // expected-error{{int}} expected-error{{char *}}
    112     for (int i = 0; i != n; ++i)
    113       (void)__builtin_va_arg(va, ArgType); // expected-error{{int}}
    114     __builtin_va_end(va); // expected-error{{int}} expected-error{{char *}}
    115   }
    116 };
    117 
    118 template struct VaArg1<__builtin_va_list, int>;
    119 template struct VaArg1<__builtin_ms_va_list, int>; // expected-note{{instantiation}}
    120 template struct VaArg1<int, int>; // expected-note{{instantiation}}
    121 
    122 template<typename ArgType>
    123 struct VaArg2 {
    124   void __attribute__((ms_abi)) f(int n, ...) {
    125     __builtin_ms_va_list va;
    126     __builtin_ms_va_start(va, n);
    127     for (int i = 0; i != n; ++i)
    128       (void)__builtin_va_arg(va, ArgType);
    129     __builtin_ms_va_end(va);
    130   }
    131 };
    132 
    133 template struct VaArg2<int>;
    134 
    135 template<typename VaList, typename ArgType>
    136 struct VaArg3 {
    137   void __attribute__((ms_abi)) f(int n, ...) {
    138     VaList va;
    139     __builtin_ms_va_start(va, n); // expected-error{{int}} expected-error{{__va_list_tag}}
    140     for (int i = 0; i != n; ++i)
    141       (void)__builtin_va_arg(va, ArgType); // expected-error{{int}}
    142     __builtin_ms_va_end(va); // expected-error{{int}} expected-error{{__va_list_tag}}
    143   }
    144 };
    145 
    146 template struct VaArg3<__builtin_ms_va_list, int>;
    147 template struct VaArg3<__builtin_va_list, int>; // expected-note{{instantiation}}
    148 template struct VaArg3<int, int>; // expected-note{{instantiation}}
    149