| // RUN: clang-cc -fsyntax-only -verify %s | 
 |  | 
 | // Test template instantiation for C99-specific features. | 
 |  | 
 | // --------------------------------------------------------------------- | 
 | // Designated initializers | 
 | // --------------------------------------------------------------------- | 
 | template<typename T, typename XType, typename YType> | 
 | struct DesigInit0 { | 
 |   void f(XType x, YType y) { | 
 |     T agg = {  | 
 |       .y = y, // expected-error{{does not refer}} | 
 |       .x = x  // expected-error{{does not refer}} | 
 |     }; | 
 |   } | 
 | }; | 
 |  | 
 | struct Point2D { | 
 |   float x, y; | 
 | }; | 
 |  | 
 | template struct DesigInit0<Point2D, int, double>; | 
 |  | 
 | struct Point3D { | 
 |   float x, y, z; | 
 | }; | 
 |  | 
 | template struct DesigInit0<Point3D, int, double>; | 
 |  | 
 | struct Color {  | 
 |   unsigned char red, green, blue; | 
 | }; | 
 |  | 
 | struct ColorPoint3D { | 
 |   Color color; | 
 |   float x, y, z; | 
 | }; | 
 |  | 
 | template struct DesigInit0<ColorPoint3D, int, double>; | 
 | template struct DesigInit0<Color, int, double>; // expected-note{{instantiation}} | 
 |  | 
 | template<typename T, int Subscript1, int Subscript2, | 
 |          typename Val1, typename Val2> | 
 | struct DesigArrayInit0 { | 
 |   void f(Val1 val1, Val2 val2) { | 
 |     T array = { | 
 |       [Subscript1] = val1, | 
 |       [Subscript2] = val2 // expected-error{{exceeds array bounds}} | 
 |     }; | 
 |  | 
 |     int array2[10] = { [5] = 3 }; | 
 |   } | 
 | }; | 
 |  | 
 | template struct DesigArrayInit0<int[8], 5, 3, float, int>; | 
 | template struct DesigArrayInit0<int[8], 5, 13, float, int>; // expected-note{{instantiation}} | 
 |  | 
 | template<typename T, int Subscript1, int Subscript2, | 
 |          typename Val1> | 
 | struct DesigArrayRangeInit0 { | 
 |   void f(Val1 val1) { | 
 |     T array = { | 
 |       [Subscript1...Subscript2] = val1 // expected-error{{exceeds}} | 
 |     }; | 
 |   } | 
 | }; | 
 |  | 
 | template struct DesigArrayRangeInit0<int[8], 3, 5, float>; | 
 | template struct DesigArrayRangeInit0<int[8], 5, 13, float>; // expected-note{{instantiation}} | 
 |  | 
 | // --------------------------------------------------------------------- | 
 | // Compound literals | 
 | // --------------------------------------------------------------------- | 
 | template<typename T, typename Arg1, typename Arg2> | 
 | struct CompoundLiteral0 { | 
 |   T f(Arg1 a1, Arg2 a2) { | 
 |     return (T){a1, a2}; | 
 |   } | 
 | }; | 
 |  | 
 | template struct CompoundLiteral0<Point2D, int, float>; |