diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-02-04 14:09:54 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-02-04 14:09:54 +0100 |
commit | bd82d030011cd8b9655e5ded6b6df9343b42a6bd (patch) | |
tree | de82d886dfea0cb7dbb6e80436218a25cb211bc3 /src/tc-cast.c |
Imported Upstream version 3.22upstream/3.22
Diffstat (limited to 'src/tc-cast.c')
-rw-r--r-- | src/tc-cast.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/tc-cast.c b/src/tc-cast.c new file mode 100644 index 0000000..73b7d66 --- /dev/null +++ b/src/tc-cast.c @@ -0,0 +1,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; +} |