reinterpret-cast.cpp [plain text]
#include <stdint.h>
enum test { testval = 1 };
struct structure { int m; };
typedef void (*fnptr)();
void self_conversion()
{
int i = 0;
(void)reinterpret_cast<int>(i);
test e = testval;
(void)reinterpret_cast<test>(e);
int *pi = 0;
(void)reinterpret_cast<int*>(pi);
const int structure::*psi = 0;
(void)reinterpret_cast<const int structure::*>(psi);
structure s;
(void)reinterpret_cast<structure>(s);
float f = 0.0f;
(void)reinterpret_cast<float>(f); }
void integral_conversion()
{
void *vp = reinterpret_cast<void*>(testval);
intptr_t i = reinterpret_cast<intptr_t>(vp);
(void)reinterpret_cast<float*>(i);
fnptr fnp = reinterpret_cast<fnptr>(i);
(void)reinterpret_cast<char>(fnp); (void)reinterpret_cast<intptr_t>(fnp);
}
void pointer_conversion()
{
int *p1 = 0;
float *p2 = reinterpret_cast<float*>(p1);
structure *p3 = reinterpret_cast<structure*>(p2);
typedef int **ppint;
ppint *deep = reinterpret_cast<ppint*>(p3);
(void)reinterpret_cast<fnptr*>(deep);
}
void constness()
{
int ***const ipppc = 0;
int const *icp = reinterpret_cast<int const*>(ipppc);
(void)reinterpret_cast<int*>(icp); int const *const **icpcpp = reinterpret_cast<int const* const**>(ipppc); int *ip = reinterpret_cast<int*>(icpcpp);
(void)reinterpret_cast<int const*>(ip);
(void)reinterpret_cast<int const* const* const*>(ipppc);
}
void fnptrs()
{
typedef int (*fnptr2)(int);
fnptr fp = 0;
(void)reinterpret_cast<fnptr2>(fp);
void *vp = reinterpret_cast<void*>(fp);
(void)reinterpret_cast<fnptr>(vp);
}
void refs()
{
long l = 0;
char &c = reinterpret_cast<char&>(l);
(void)reinterpret_cast<int&>(&c); }
void memptrs()
{
const int structure::*psi = 0;
(void)reinterpret_cast<const float structure::*>(psi);
(void)reinterpret_cast<int structure::*>(psi);
void (structure::*psf)() = 0;
(void)reinterpret_cast<int (structure::*)()>(psf);
(void)reinterpret_cast<void (structure::*)()>(psi); (void)reinterpret_cast<int structure::*>(psf);
(void)reinterpret_cast<void (structure::*)()>(0); (void)reinterpret_cast<int structure::*>(0); }
namespace PR5545 {
class A;
class B;
void (A::*a)();
void (B::*b)() = reinterpret_cast<void (B::*)()>(a);
}
void const_arrays() {
typedef char STRING[10];
const STRING *s;
const char *c;
(void)reinterpret_cast<char *>(s); (void)reinterpret_cast<const STRING *>(c);
}
namespace PR9564 {
struct a { int a : 10; }; a x;
int *y = &reinterpret_cast<int&>(x.a);
__attribute((ext_vector_type(4))) typedef float v4;
float& w(v4 &a) { return reinterpret_cast<float&>(a[1]); } }
void dereference_reinterpret_cast() {
struct A {};
typedef A A2;
class B {};
typedef B B2;
A a;
B b;
A2 a2;
B2 b2;
long l;
double d;
float f;
char c;
unsigned char uc;
void* v_ptr;
(void)reinterpret_cast<double&>(l); (void)*reinterpret_cast<double*>(&l); (void)reinterpret_cast<double&>(f); (void)*reinterpret_cast<double*>(&f); (void)reinterpret_cast<float&>(l); (void)*reinterpret_cast<float*>(&l); (void)reinterpret_cast<float&>(d); (void)*reinterpret_cast<float*>(&d);
(void)reinterpret_cast<A&>(b);
(void)*reinterpret_cast<A*>(&b);
(void)reinterpret_cast<B&>(a);
(void)*reinterpret_cast<B*>(&a);
(void)reinterpret_cast<A2&>(b2);
(void)*reinterpret_cast<A2*>(&b2);
(void)reinterpret_cast<B2&>(a2);
(void)*reinterpret_cast<B2*>(&a2);
(void)reinterpret_cast<A&>(a);
(void)*reinterpret_cast<A*>(&a);
(void)reinterpret_cast<B&>(b);
(void)*reinterpret_cast<B*>(&b);
(void)reinterpret_cast<long&>(l);
(void)*reinterpret_cast<long*>(&l);
(void)reinterpret_cast<double&>(d);
(void)*reinterpret_cast<double*>(&d);
(void)reinterpret_cast<char&>(c);
(void)*reinterpret_cast<char*>(&c);
(void)reinterpret_cast<A&>(c);
(void)*reinterpret_cast<A*>(&c);
(void)reinterpret_cast<B&>(c);
(void)*reinterpret_cast<B*>(&c);
(void)reinterpret_cast<long&>(c);
(void)*reinterpret_cast<long*>(&c);
(void)reinterpret_cast<double&>(c);
(void)*reinterpret_cast<double*>(&c);
(void)reinterpret_cast<char&>(l);
(void)*reinterpret_cast<char*>(&l);
(void)reinterpret_cast<char&>(d);
(void)*reinterpret_cast<char*>(&d);
(void)reinterpret_cast<char&>(f);
(void)*reinterpret_cast<char*>(&f);
(void)*reinterpret_cast<A*>(v_ptr);
(void)*reinterpret_cast<B*>(v_ptr);
(void)*reinterpret_cast<long*>(v_ptr);
(void)*reinterpret_cast<double*>(v_ptr);
(void)*reinterpret_cast<float*>(v_ptr);
(void)*reinterpret_cast<void*>(&a);
(void)*reinterpret_cast<void*>(&b);
(void)*reinterpret_cast<void*>(&l);
(void)*reinterpret_cast<void*>(&d);
(void)*reinterpret_cast<void*>(&f);
}
void reinterpret_cast_whitelist () {
int a;
float b;
(void)reinterpret_cast<int&>(a);
(void)*reinterpret_cast<int*>(&a);
(void)reinterpret_cast<float&>(b);
(void)*reinterpret_cast<float*>(&b);
(void)reinterpret_cast<const int&>(a);
(void)*reinterpret_cast<const int*>(&a);
(void)reinterpret_cast<volatile int&>(a);
(void)*reinterpret_cast<volatile int*>(&a);
(void)reinterpret_cast<const volatile int&>(a);
(void)*reinterpret_cast<const volatile int*>(&a);
(void)reinterpret_cast<const float&>(b);
(void)*reinterpret_cast<const float*>(&b);
(void)reinterpret_cast<volatile float&>(b);
(void)*reinterpret_cast<volatile float*>(&b);
(void)reinterpret_cast<const volatile float&>(b);
(void)*reinterpret_cast<const volatile float*>(&b);
signed d;
unsigned e;
(void)reinterpret_cast<signed&>(d);
(void)*reinterpret_cast<signed*>(&d);
(void)reinterpret_cast<signed&>(e);
(void)*reinterpret_cast<signed*>(&e);
(void)reinterpret_cast<unsigned&>(d);
(void)*reinterpret_cast<unsigned*>(&d);
(void)reinterpret_cast<unsigned&>(e);
(void)*reinterpret_cast<unsigned*>(&e);
(void)reinterpret_cast<const signed&>(d);
(void)*reinterpret_cast<const signed*>(&d);
(void)reinterpret_cast<const signed&>(e);
(void)*reinterpret_cast<const signed*>(&e);
(void)reinterpret_cast<const unsigned&>(d);
(void)*reinterpret_cast<const unsigned*>(&d);
(void)reinterpret_cast<const unsigned&>(e);
(void)*reinterpret_cast<const unsigned*>(&e);
(void)reinterpret_cast<volatile signed&>(d);
(void)*reinterpret_cast<volatile signed*>(&d);
(void)reinterpret_cast<volatile signed&>(e);
(void)*reinterpret_cast<volatile signed*>(&e);
(void)reinterpret_cast<volatile unsigned&>(d);
(void)*reinterpret_cast<volatile unsigned*>(&d);
(void)reinterpret_cast<volatile unsigned&>(e);
(void)*reinterpret_cast<volatile unsigned*>(&e);
(void)reinterpret_cast<const volatile signed&>(d);
(void)*reinterpret_cast<const volatile signed*>(&d);
(void)reinterpret_cast<const volatile signed&>(e);
(void)*reinterpret_cast<const volatile signed*>(&e);
(void)reinterpret_cast<const volatile unsigned&>(d);
(void)*reinterpret_cast<const volatile unsigned*>(&d);
(void)reinterpret_cast<const volatile unsigned&>(e);
(void)*reinterpret_cast<const volatile unsigned*>(&e);
(void)reinterpret_cast<char&>(a);
(void)*reinterpret_cast<char*>(&a);
(void)reinterpret_cast<unsigned char&>(a);
(void)*reinterpret_cast<unsigned char*>(&a);
(void)reinterpret_cast<char&>(b);
(void)*reinterpret_cast<char*>(&b);
(void)reinterpret_cast<unsigned char&>(b);
(void)*reinterpret_cast<unsigned char*>(&b);
}