xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-c99.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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