142 lines
2.4 KiB
C++
142 lines
2.4 KiB
C++
|
// 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);
|
||
|
}
|
||
|
};
|