1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
| // Integer literals
const char Ch1 = 'a';
const signed char Ch2 = 'b';
const unsigned char Ch3 = 'c';
const wchar_t Ch4 = L'd';
const signed wchar_t Ch5 = L'e';
const unsigned wchar_t Ch6 = L'f';
const short C1 = 12;
const unsigned short C2 = 13;
const int C3 = 12;
const unsigned int C4 = 13;
const long C5 = 22;
const unsigned long C6 = 23;
const long long C7 = 66;
const unsigned long long C8 = 67;
// String literals
const char str1[] = "ABCD";
const char str2[] = "ABCD" "0123";
const wchar_t wstr1[] = L"DEF";
const wchar_t wstr2[] = L"DEF" L"123";
// Boolean literals
const bool bval1 = true;
const bool bval2 = false;
// Floating Literals
const float F1 = 12.2F;
const double F2 = 1E4;
const long double F3 = 1.2E-3L;
// nullptr literal
const void *vptr = nullptr;
int glb_1[4] = { 10, 20, 30, 40 };
struct S1 {
int a;
int b[3];
};
struct S2 {
int c;
S1 d;
};
S2 glb_2 = { 22, .d.a = 44, .d.b[0] = 55, .d.b[1] = 66 };
void testNewThrowDelete() {
throw;
char *p = new char[10];
delete[] p;
}
int testArrayElement(int *x, int n) {
return x[n];
}
int testTernaryOp(int c, int x, int y) {
return c ? x : y;
}
S1 &testConstCast(const S1 &x) {
return const_cast<S1&>(x);
}
S1 &testStaticCast(S1 &x) {
return static_cast<S1&>(x);
}
S1 &testReinterpretCast(S1 &x) {
return reinterpret_cast<S1&>(x);
}
S1 &testDynamicCast(S1 &x) {
return dynamic_cast<S1&>(x);
}
int testScalarInit(int x) {
return int(x);
}
struct S {
float f;
double d;
};
struct T {
int i;
struct S s[10];
};
void testOffsetOf() {
__builtin_offsetof(struct T, s[2].d);
}
int testDefaultArg(int a = 2*2) {
return a;
}
int testDefaultArgExpr() {
return testDefaultArg();
}
template <typename T> // T has TemplateTypeParmType
void testTemplateTypeParmType(int i);
void useTemplateType() {
testTemplateTypeParmType<char>(4);
}
const bool ExpressionTrait = __is_lvalue_expr(1);
const unsigned ArrayRank = __array_rank(int[10][20]);
const unsigned ArrayExtent = __array_extent(int[10][20], 1);
constexpr int testLambdaAdd(int toAdd) {
const int Captured1 = 1, Captured2 = 2;
constexpr auto LambdaAdd = [Captured1, Captured2](int k) -> int {
return Captured1 + Captured2 + k;
};
return LambdaAdd(toAdd);
}
template<typename T>
struct TestLambdaTemplate {
T i, j;
TestLambdaTemplate(T i, const T &j) : i(i), j(j) {}
T testLambda(T k) {
return [this](T k) -> decltype(auto) { return i + j + k; }(k);
}
};
|