reinterpret-cast.cpp revision b464a5b18916b467ed884d07f9e34295d39cec0a
1// RUN: %clang_cc1 -fsyntax-only -verify -ffreestanding %s 2 3#include <stdint.h> 4 5enum test { testval = 1 }; 6struct structure { int m; }; 7typedef void (*fnptr)(); 8 9// Test the conversion to self. 10void self_conversion() 11{ 12 // T*->T* is allowed, T->T in general not. 13 int i = 0; 14 (void)reinterpret_cast<int>(i); // expected-error {{reinterpret_cast from 'int' to 'int' is not allowed}} 15 structure s; 16 (void)reinterpret_cast<structure>(s); // expected-error {{reinterpret_cast from 'structure' to 'structure' is not allowed}} 17 int *pi = 0; 18 (void)reinterpret_cast<int*>(pi); 19} 20 21// Test conversion between pointer and integral types, as in /3 and /4. 22void integral_conversion() 23{ 24 void *vp = reinterpret_cast<void*>(testval); 25 intptr_t i = reinterpret_cast<intptr_t>(vp); 26 (void)reinterpret_cast<float*>(i); 27 fnptr fnp = reinterpret_cast<fnptr>(i); 28 (void)reinterpret_cast<char>(fnp); // expected-error {{cast from pointer to smaller type 'char' loses information}} 29 (void)reinterpret_cast<intptr_t>(fnp); 30} 31 32void pointer_conversion() 33{ 34 int *p1 = 0; 35 float *p2 = reinterpret_cast<float*>(p1); 36 structure *p3 = reinterpret_cast<structure*>(p2); 37 typedef int **ppint; 38 ppint *deep = reinterpret_cast<ppint*>(p3); 39 (void)reinterpret_cast<fnptr*>(deep); 40} 41 42void constness() 43{ 44 int ***const ipppc = 0; 45 // Valid: T1* -> T2 const* 46 int const *icp = reinterpret_cast<int const*>(ipppc); 47 // Invalid: T1 const* -> T2* 48 (void)reinterpret_cast<int*>(icp); // expected-error {{reinterpret_cast from 'const int *' to 'int *' casts away qualifiers}} 49 // Invalid: T1*** -> T2 const* const** 50 int const *const **icpcpp = reinterpret_cast<int const* const**>(ipppc); // expected-error {{reinterpret_cast from 'int ***' to 'const int *const **' casts away qualifiers}} 51 // Valid: T1* -> T2* 52 int *ip = reinterpret_cast<int*>(icpcpp); 53 // Valid: T* -> T const* 54 (void)reinterpret_cast<int const*>(ip); 55 // Valid: T*** -> T2 const* const* const* 56 (void)reinterpret_cast<int const* const* const*>(ipppc); 57} 58 59void fnptrs() 60{ 61 typedef int (*fnptr2)(int); 62 fnptr fp = 0; 63 (void)reinterpret_cast<fnptr2>(fp); 64 void *vp = reinterpret_cast<void*>(fp); 65 (void)reinterpret_cast<fnptr>(vp); 66} 67 68void refs() 69{ 70 long l = 0; 71 char &c = reinterpret_cast<char&>(l); 72 // Bad: from rvalue 73 (void)reinterpret_cast<int&>(&c); // expected-error {{reinterpret_cast from rvalue to reference type 'int &'}} 74} 75 76void memptrs() 77{ 78 const int structure::*psi = 0; 79 (void)reinterpret_cast<const float structure::*>(psi); 80 (void)reinterpret_cast<int structure::*>(psi); // expected-error {{reinterpret_cast from 'const int structure::*' to 'int structure::*' casts away qualifiers}} 81 82 void (structure::*psf)() = 0; 83 (void)reinterpret_cast<int (structure::*)()>(psf); 84 85 (void)reinterpret_cast<void (structure::*)()>(psi); // expected-error {{reinterpret_cast from 'const int structure::*' to 'void (structure::*)()' is not allowed}} 86 (void)reinterpret_cast<int structure::*>(psf); // expected-error {{reinterpret_cast from 'void (structure::*)()' to 'int structure::*' is not allowed}} 87 88 // Cannot cast from integers to member pointers, not even the null pointer 89 // literal. 90 (void)reinterpret_cast<void (structure::*)()>(0); // expected-error {{reinterpret_cast from 'int' to 'void (structure::*)()' is not allowed}} 91 (void)reinterpret_cast<int structure::*>(0); // expected-error {{reinterpret_cast from 'int' to 'int structure::*' is not allowed}} 92} 93 94namespace PR5545 { 95// PR5545 96class A; 97class B; 98void (A::*a)(); 99void (B::*b)() = reinterpret_cast<void (B::*)()>(a); 100} 101 102// <rdar://problem/8018292> 103void const_arrays() { 104 typedef char STRING[10]; 105 const STRING *s; 106 const char *c; 107 108 (void)reinterpret_cast<char *>(s); // expected-error {{reinterpret_cast from 'const STRING *' (aka 'char const (*)[10]') to 'char *' casts away qualifiers}} 109 (void)reinterpret_cast<const STRING *>(c); 110} 111 112namespace PR9564 { 113 struct a { int a : 10; }; a x; 114 int *y = &reinterpret_cast<int&>(x.a); // expected-error {{reinterpret_cast of a bit-field to 'int &' needs its address which is not allowed}} 115} 116