1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,alpha.unix,alpha.security.ArrayBound -analyzer-store=region -verify %s 2*67e74705SXin Li // expected-no-diagnostics 3*67e74705SXin Li 4*67e74705SXin Li //===----------------------------------------------------------------------===// 5*67e74705SXin Li // This file tests cases where we should not flag out-of-bounds warnings. 6*67e74705SXin Li //===----------------------------------------------------------------------===// 7*67e74705SXin Li f()8*67e74705SXin Livoid f() { 9*67e74705SXin Li long x = 0; 10*67e74705SXin Li char *y = (char*) &x; 11*67e74705SXin Li char c = y[0] + y[1] + y[2]; // no-warning 12*67e74705SXin Li short *z = (short*) &x; 13*67e74705SXin Li short s = z[0] + z[1]; // no-warning 14*67e74705SXin Li } 15*67e74705SXin Li g()16*67e74705SXin Livoid g() { 17*67e74705SXin Li int a[2]; 18*67e74705SXin Li char *b = (char*)a; 19*67e74705SXin Li b[3] = 'c'; // no-warning 20*67e74705SXin Li } 21*67e74705SXin Li 22*67e74705SXin Li typedef typeof(sizeof(int)) size_t; 23*67e74705SXin Li void *malloc(size_t); 24*67e74705SXin Li void free(void *); 25*67e74705SXin Li field()26*67e74705SXin Livoid field() { 27*67e74705SXin Li struct vec { size_t len; int data[0]; }; 28*67e74705SXin Li struct vec *a = malloc(sizeof(struct vec) + 10*sizeof(int)); 29*67e74705SXin Li a->len = 10; 30*67e74705SXin Li a->data[1] = 5; // no-warning 31*67e74705SXin Li free(a); 32*67e74705SXin Li } 33