1*67e74705SXin Li // RUN: %clang_cc1 -verify -Warray-bounds-pointer-arithmetic %s 2*67e74705SXin Li 3*67e74705SXin Li // Test case from PR10615 4*67e74705SXin Li struct ext2_super_block{ 5*67e74705SXin Li unsigned char s_uuid[8]; // expected-note {{declared here}} 6*67e74705SXin Li }; ext2_statfs(struct ext2_super_block * es,int a)7*67e74705SXin Livoid* ext2_statfs (struct ext2_super_block *es,int a) 8*67e74705SXin Li { 9*67e74705SXin Li return (void *)es->s_uuid + sizeof(int); // no-warning 10*67e74705SXin Li } broken(struct ext2_super_block * es,int a)11*67e74705SXin Livoid* broken (struct ext2_super_block *es,int a) 12*67e74705SXin Li { 13*67e74705SXin Li return (void *)es->s_uuid + 80; // expected-warning {{refers past the end of the array}} 14*67e74705SXin Li } 15*67e74705SXin Li 16*67e74705SXin Li // Test case reduced from PR11594 17*67e74705SXin Li struct S { int n; }; pr11594(struct S * s)18*67e74705SXin Livoid pr11594(struct S *s) { 19*67e74705SXin Li int a[10]; 20*67e74705SXin Li int *p = a - s->n; 21*67e74705SXin Li } 22*67e74705SXin Li 23*67e74705SXin Li // Test case reduced from <rdar://problem/11387038>. This resulted in 24*67e74705SXin Li // an assertion failure because of the typedef instead of an explicit 25*67e74705SXin Li // constant array type. 26*67e74705SXin Li struct RDar11387038 {}; 27*67e74705SXin Li typedef struct RDar11387038 RDar11387038Array[1]; 28*67e74705SXin Li struct RDar11387038_Table { 29*67e74705SXin Li RDar11387038Array z; 30*67e74705SXin Li }; 31*67e74705SXin Li typedef struct RDar11387038_Table * TPtr; 32*67e74705SXin Li typedef TPtr *TabHandle; 33*67e74705SXin Li struct RDar11387038_B { TabHandle x; }; 34*67e74705SXin Li typedef struct RDar11387038_B RDar11387038_B; 35*67e74705SXin Li radar11387038()36*67e74705SXin Livoid radar11387038() { 37*67e74705SXin Li RDar11387038_B *pRDar11387038_B; 38*67e74705SXin Li struct RDar11387038* y = &(*pRDar11387038_B->x)->z[4]; 39*67e74705SXin Li } 40