1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li // Test template instantiation for C99-specific features. 4*67e74705SXin Li 5*67e74705SXin Li // --------------------------------------------------------------------- 6*67e74705SXin Li // Designated initializers 7*67e74705SXin Li // --------------------------------------------------------------------- 8*67e74705SXin Li template<typename T, typename XType, typename YType> 9*67e74705SXin Li struct DesigInit0 { fDesigInit010*67e74705SXin Li void f(XType x, YType y) { 11*67e74705SXin Li T agg = { 12*67e74705SXin Li .y = y, // expected-error{{does not refer}} 13*67e74705SXin Li .x = x // expected-error{{does not refer}} 14*67e74705SXin Li }; 15*67e74705SXin Li } 16*67e74705SXin Li }; 17*67e74705SXin Li 18*67e74705SXin Li struct Point2D { 19*67e74705SXin Li float x, y; 20*67e74705SXin Li }; 21*67e74705SXin Li 22*67e74705SXin Li template struct DesigInit0<Point2D, int, double>; 23*67e74705SXin Li 24*67e74705SXin Li struct Point3D { 25*67e74705SXin Li float x, y, z; 26*67e74705SXin Li }; 27*67e74705SXin Li 28*67e74705SXin Li template struct DesigInit0<Point3D, int, double>; 29*67e74705SXin Li 30*67e74705SXin Li struct Color { 31*67e74705SXin Li unsigned char red, green, blue; 32*67e74705SXin Li }; 33*67e74705SXin Li 34*67e74705SXin Li struct ColorPoint3D { 35*67e74705SXin Li Color color; 36*67e74705SXin Li float x, y, z; 37*67e74705SXin Li }; 38*67e74705SXin Li 39*67e74705SXin Li template struct DesigInit0<ColorPoint3D, int, double>; 40*67e74705SXin Li template struct DesigInit0<Color, int, double>; // expected-note{{instantiation}} 41*67e74705SXin Li 42*67e74705SXin Li template<typename T, int Subscript1, int Subscript2, 43*67e74705SXin Li typename Val1, typename Val2> 44*67e74705SXin Li struct DesigArrayInit0 { fDesigArrayInit045*67e74705SXin Li void f(Val1 val1, Val2 val2) { 46*67e74705SXin Li T array = { 47*67e74705SXin Li [Subscript1] = val1, 48*67e74705SXin Li [Subscript2] = val2 // expected-error{{exceeds array bounds}} 49*67e74705SXin Li }; 50*67e74705SXin Li 51*67e74705SXin Li int array2[10] = { [5] = 3 }; 52*67e74705SXin Li } 53*67e74705SXin Li }; 54*67e74705SXin Li 55*67e74705SXin Li template struct DesigArrayInit0<int[8], 5, 3, float, int>; 56*67e74705SXin Li template struct DesigArrayInit0<int[8], 5, 13, float, int>; // expected-note{{instantiation}} 57*67e74705SXin Li 58*67e74705SXin Li template<typename T, int Subscript1, int Subscript2, 59*67e74705SXin Li typename Val1> 60*67e74705SXin Li struct DesigArrayRangeInit0 { fDesigArrayRangeInit061*67e74705SXin Li void f(Val1 val1) { 62*67e74705SXin Li T array = { 63*67e74705SXin Li [Subscript1...Subscript2] = val1 // expected-error{{exceeds}} 64*67e74705SXin Li }; 65*67e74705SXin Li } 66*67e74705SXin Li }; 67*67e74705SXin Li 68*67e74705SXin Li template struct DesigArrayRangeInit0<int[8], 3, 5, float>; 69*67e74705SXin Li template struct DesigArrayRangeInit0<int[8], 5, 13, float>; // expected-note{{instantiation}} 70*67e74705SXin Li 71*67e74705SXin Li // --------------------------------------------------------------------- 72*67e74705SXin Li // Compound literals 73*67e74705SXin Li // --------------------------------------------------------------------- 74*67e74705SXin Li template<typename T, typename Arg1, typename Arg2> 75*67e74705SXin Li struct CompoundLiteral0 { fCompoundLiteral076*67e74705SXin Li T f(Arg1 a1, Arg2 a2) { 77*67e74705SXin Li return (T){a1, a2}; 78*67e74705SXin Li } 79*67e74705SXin Li }; 80*67e74705SXin Li 81*67e74705SXin Li template struct CompoundLiteral0<Point2D, int, float>; 82