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