Clang Project

clang_source_code/test/SemaTemplate/instantiate-c99.cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s
2// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4
5// Test template instantiation for C99-specific features.
6
7// ---------------------------------------------------------------------
8// Designated initializers
9// ---------------------------------------------------------------------
10template<typename T, typename XType, typename YType>
11struct DesigInit0 {
12  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
25struct Point2D {
26  float x, y;
27};
28
29template struct DesigInit0<Point2D, int, double>;
30
31struct Point3D {
32  float x, y, z;
33};
34
35template struct DesigInit0<Point3D, int, double>;
36
37struct Color { 
38  unsigned char red, green, blue;
39};
40
41struct ColorPoint3D {
42  Color color;
43  float x, y, z;
44};
45
46template struct DesigInit0<ColorPoint3D, int, double>;
47template struct DesigInit0<Color, int, double>; // expected-note{{instantiation}}
48
49template<typename T, int Subscript1, int Subscript2,
50         typename Val1, typename Val2>
51struct DesigArrayInit0 {
52  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
66template struct DesigArrayInit0<int[8], 5, 3, float, int>;
67template struct DesigArrayInit0<int[8], 5, 13, float, int>; // expected-note{{instantiation}}
68
69template<typename T, int Subscript1, int Subscript2,
70         typename Val1>
71struct DesigArrayRangeInit0 {
72  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
83template struct DesigArrayRangeInit0<int[8], 3, 5, float>;
84template struct DesigArrayRangeInit0<int[8], 5, 13, float>; // expected-note{{instantiation}}
85
86// ---------------------------------------------------------------------
87// Compound literals
88// ---------------------------------------------------------------------
89template<typename T, typename Arg1, typename Arg2>
90struct CompoundLiteral0 {
91  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
100template struct CompoundLiteral0<Point2D, int, float>;
101