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