1 // RUN: %clang_cc1 -Wno-c99-extensions -Wno-reorder -fsyntax-only -verify %s
2 // RUN: %clang_cc1 -Wno-c99-extensions -Wno-reorder -fsyntax-only -verify -std=c++98 %s
3 // RUN: %clang_cc1 -Wno-c99-extensions -Wno-reorder -fsyntax-only -verify -std=c++11 %s
4 
5 // Test template instantiation for C99-specific features.
6 
7 // ---------------------------------------------------------------------
8 // Designated initializers
9 // ---------------------------------------------------------------------
10 template<typename T, typename XType, typename YType>
11 struct DesigInit0 {
fDesigInit012   void f(XType x, YType y) {
13     T agg = {
14 #if __cplusplus <= 199711L
15       .y = y, // expected-error{{does not refer}}
16       .x = x  // expected-error{{does not refer}}
17 #else
18       .y = static_cast<float>(y), // expected-error{{does not refer}}
19       .x = static_cast<float>(x)  // expected-error{{does not refer}}
20 #endif
21     };
22   }
23 };
24 
25 struct Point2D {
26   float x, y;
27 };
28 
29 template struct DesigInit0<Point2D, int, double>;
30 
31 struct Point3D {
32   float x, y, z;
33 };
34 
35 template struct DesigInit0<Point3D, int, double>;
36 
37 struct Color {
38   unsigned char red, green, blue;
39 };
40 
41 struct ColorPoint3D {
42   Color color;
43   float x, y, z;
44 };
45 
46 template struct DesigInit0<ColorPoint3D, int, double>;
47 template struct DesigInit0<Color, int, double>; // expected-note{{instantiation}}
48 
49 template<typename T, int Subscript1, int Subscript2,
50          typename Val1, typename Val2>
51 struct DesigArrayInit0 {
fDesigArrayInit052   void f(Val1 val1, Val2 val2) {
53     T array = {
54 #if __cplusplus <= 199711L
55       [Subscript1] = val1,
56 #else
57       [Subscript1] = static_cast<int>(val1),
58 #endif
59       [Subscript2] = val2 // expected-error{{exceeds array bounds}}
60     };
61 
62     int array2[10] = { [5] = 3 };
63   }
64 };
65 
66 template struct DesigArrayInit0<int[8], 5, 3, float, int>;
67 template struct DesigArrayInit0<int[8], 5, 13, float, int>; // expected-note{{instantiation}}
68 
69 template<typename T, int Subscript1, int Subscript2,
70          typename Val1>
71 struct DesigArrayRangeInit0 {
fDesigArrayRangeInit072   void f(Val1 val1) {
73     T array = {
74 #if __cplusplus <= 199711L
75       [Subscript1...Subscript2] = val1 // expected-error{{exceeds}}
76 #else
77       [Subscript1...Subscript2] = static_cast<int>(val1) // expected-error{{exceeds}}
78 #endif
79     };
80   }
81 };
82 
83 template struct DesigArrayRangeInit0<int[8], 3, 5, float>;
84 template struct DesigArrayRangeInit0<int[8], 5, 13, float>; // expected-note{{instantiation}}
85 
86 // ---------------------------------------------------------------------
87 // Compound literals
88 // ---------------------------------------------------------------------
89 template<typename T, typename Arg1, typename Arg2>
90 struct CompoundLiteral0 {
fCompoundLiteral091   T f(Arg1 a1, Arg2 a2) {
92 #if __cplusplus <= 199711L
93     return (T){a1, a2};
94 #else
95     return (T){static_cast<float>(a1), a2};
96 #endif
97   }
98 };
99 
100 template struct CompoundLiteral0<Point2D, int, float>;
101