1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -Wcast-align -verify %s 2*67e74705SXin Li 3*67e74705SXin Li // Simple casts. test0(char * P)4*67e74705SXin Livoid test0(char *P) { 5*67e74705SXin Li char *a = (char*) P; 6*67e74705SXin Li short *b = (short*) P; // expected-warning {{cast from 'char *' to 'short *' increases required alignment from 1 to 2}} 7*67e74705SXin Li int *c = (int*) P; // expected-warning {{cast from 'char *' to 'int *' increases required alignment from 1 to 4}} 8*67e74705SXin Li } 9*67e74705SXin Li 10*67e74705SXin Li // Casts from void* are a special case. test1(void * P)11*67e74705SXin Livoid test1(void *P) { 12*67e74705SXin Li char *a = (char*) P; 13*67e74705SXin Li short *b = (short*) P; 14*67e74705SXin Li int *c = (int*) P; 15*67e74705SXin Li 16*67e74705SXin Li const volatile void *P2 = P; 17*67e74705SXin Li char *d = (char*) P2; 18*67e74705SXin Li short *e = (short*) P2; 19*67e74705SXin Li int *f = (int*) P2; 20*67e74705SXin Li 21*67e74705SXin Li const char *g = (const char*) P2; 22*67e74705SXin Li const short *h = (const short*) P2; 23*67e74705SXin Li const int *i = (const int*) P2; 24*67e74705SXin Li 25*67e74705SXin Li const volatile char *j = (const volatile char*) P2; 26*67e74705SXin Li const volatile short *k = (const volatile short*) P2; 27*67e74705SXin Li const volatile int *l = (const volatile int*) P2; 28*67e74705SXin Li } 29*67e74705SXin Li 30*67e74705SXin Li // Aligned struct. 31*67e74705SXin Li struct __attribute__((aligned(16))) A { 32*67e74705SXin Li char buffer[16]; 33*67e74705SXin Li }; test2(char * P)34*67e74705SXin Livoid test2(char *P) { 35*67e74705SXin Li struct A *a = (struct A*) P; // expected-warning {{cast from 'char *' to 'struct A *' increases required alignment from 1 to 16}} 36*67e74705SXin Li } 37*67e74705SXin Li 38*67e74705SXin Li // Incomplete type. test3(char * P)39*67e74705SXin Livoid test3(char *P) { 40*67e74705SXin Li struct B *b = (struct B*) P; 41*67e74705SXin Li } 42