summaryrefslogtreecommitdiff
path: root/src/tc-cast.c
blob: 73b7d666ea661f74bc4e2a2ee51fecec7b97f032 (plain)
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
/*
 *	Testing for compile error in the cast helpers
 *	written by Jan Engelhardt
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the WTF Public License version 2 or
 *	(at your option) any later version.
 */
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <libHX/defs.h>
#include <libHX/init.h>
#include "internal.h"
#define UNUSED __attribute__((unused))

static void c_signed(void)
{
	const char *si_00 = "foo";
	char *si_01 = const_cast1(char *, si_00);
	signed char *si_02 UNUSED = signed_cast(signed char *, si_01);
	unsigned char *si_03 UNUSED = signed_cast(unsigned char *, si_01);
	const signed char *si_04 UNUSED = signed_cast(const signed char *, si_00);
	const unsigned char *si_05 UNUSED = signed_cast(const unsigned char *, si_00);
	si_00 = signed_cast(const char *, si_05);
}

static void c_reinterpret(void)
{
	const char *si_00 = "foo";
	void *sr_00 = reinterpret_cast(void *, static_cast(uintptr_t, 8));
	int sr_01 = reinterpret_cast(uintptr_t, sr_00);
	void *sr_02 = reinterpret_cast(void *, static_cast(uintptr_t, static_cast(unsigned int, reinterpret_cast(uintptr_t, &si_00))));
	printf("sr: %p %u; %p[%p]\n", sr_00, sr_01, sr_02, &si_00);
}

static void c_static(void)
{
	double st_00 = sqrt(static_cast(int,
		10 * sqrt(static_cast(double, 3) / 4)));
	printf("st: %f\n", st_00);
}

static void c_const1(void)
{
	const int *co_00 = NULL;
	int *co_01 = const_cast1(int *, co_00);
	co_00 = co_01;
}

static void c_const2(void)
{
	const int **co_02 = NULL;
	int **co_03 UNUSED = const_cast2(int **, co_02);
	int *const *co_04 = const_cast2(int *const *, co_02);
	const int *const *co_05 = const_cast2(const int *const *, co_02);
	co_02 = const_cast2(const int **, co_05);
	co_04 = const_cast2(int *const *, co_05);
}

static void c_const3(void)
{
	const int *const *const *co_06 = NULL;
	int ***co_07 UNUSED = const_cast3(int ***,
		(printf("If this line is only printed once when the program "
		"is run, __builtin_choose_expr works as desired.\n"), co_06));
}

static void c_constA(void)
{
	static const char r1[] = "static";
	char *w1 UNUSED = const_cast1(char *, r1);

	static const char *const r2[] = {"static"};
	char **w2 UNUSED = const_cast2(char **, r2);

	static const char *const *const r3[] = {NULL};
	char ***w3 UNUSED = const_cast3(char ***, r3);
}

int main(void)
{
	if (HX_init() <= 0)
		abort();
	c_signed();
	c_reinterpret();
	c_static();
	c_const1();
	c_const2();
	c_const3();
	c_constA();
	HX_exit();
	return 0;
}