1246057Sganbold/* { dg-do run } */ 2266337Sian/* { dg-options "-O2" } */ 3246057Sganbold 4246057Sganboldtypedef __SIZE_TYPE__ size_t; 5246057Sganboldextern void abort (void); 6246057Sganboldextern void exit (int); 7246057Sganboldextern void *malloc (size_t); 8246057Sganboldextern void *calloc (size_t, size_t); 9246057Sganboldextern void *alloca (size_t); 10246057Sganboldextern void *memcpy (void *, const void *, size_t); 11246057Sganboldextern void *memset (void *, int, size_t); 12246057Sganboldextern char *strcpy (char *, const char *); 13246057Sganbold 14246057Sganboldstruct A 15246057Sganbold{ 16246057Sganbold char a[10]; 17246057Sganbold int b; 18246057Sganbold char c[10]; 19246057Sganbold} y, w[4]; 20246057Sganbold 21246057Sganboldextern char exta[]; 22246057Sganboldextern char extb[30]; 23246057Sganboldextern struct A extc[]; 24246057Sganboldstruct A zerol[0]; 25246057Sganbold 26246057Sganboldvoid 27246057Sganbold__attribute__ ((noinline)) 28246057Sganboldtest1 (void *q, int x) 29246057Sganbold{ 30246057Sganbold struct A a; 31246057Sganbold void *p = &a.a[3], *r; 32246057Sganbold char var[x + 10]; 33246057Sganbold struct A vara[x + 10]; 34246057Sganbold if (x < 0) 35246057Sganbold r = &a.a[9]; 36246057Sganbold else 37246057Sganbold r = &a.c[1]; 38246057Sganbold if (__builtin_object_size (p, 3) != sizeof (a.a) - 3) 39246057Sganbold abort (); 40246057Sganbold if (__builtin_object_size (&a.c[9], 3) 41246057Sganbold != sizeof (a.c) - 9) 42246057Sganbold abort (); 43246375Sganbold if (__builtin_object_size (q, 3) != 0) 44246057Sganbold abort (); 45246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.a) - 9) 46246057Sganbold abort (); 47246057Sganbold if (x < 6) 48246057Sganbold r = &w[2].a[1]; 49246057Sganbold else 50246057Sganbold r = &a.a[6]; 51246057Sganbold if (__builtin_object_size (&y, 3) != sizeof (y)) 52246057Sganbold abort (); 53246057Sganbold if (__builtin_object_size (w, 3) != sizeof (w)) 54246057Sganbold abort (); 55246057Sganbold if (__builtin_object_size (&y.b, 3) != sizeof (a.b)) 56246057Sganbold abort (); 57246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.a) - 6) 58246057Sganbold abort (); 59246057Sganbold if (x < 20) 60246057Sganbold r = malloc (30); 61246057Sganbold else 62246375Sganbold r = calloc (2, 16); 63246375Sganbold if (__builtin_object_size (r, 3) != 30) 64246057Sganbold abort (); 65246057Sganbold if (x < 20) 66246057Sganbold r = malloc (30); 67246057Sganbold else 68246057Sganbold r = calloc (2, 14); 69246057Sganbold if (__builtin_object_size (r, 3) != 2 * 14) 70246057Sganbold abort (); 71246057Sganbold if (x < 30) 72246057Sganbold r = malloc (sizeof (a)); 73246057Sganbold else 74246057Sganbold r = &a.a[3]; 75246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.a) - 3) 76246375Sganbold abort (); 77246057Sganbold r = memcpy (r, "a", 2); 78246851Sgonzo if (__builtin_object_size (r, 3) != sizeof (a.a) - 3) 79246375Sganbold abort (); 80246057Sganbold r = memcpy (r + 2, "b", 2) + 2; 81246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.a) - 3 - 4) 82246057Sganbold abort (); 83246057Sganbold r = &a.a[4]; 84246057Sganbold r = memset (r, 'a', 2); 85246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.a) - 4) 86246057Sganbold abort (); 87246057Sganbold r = memset (r + 2, 'b', 2) + 2; 88246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.a) - 8) 89246057Sganbold abort (); 90246057Sganbold r = &a.a[1]; 91246057Sganbold r = strcpy (r, "ab"); 92246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.a) - 1) 93246057Sganbold abort (); 94246057Sganbold r = strcpy (r + 2, "cd") + 2; 95246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.a) - 5) 96266152Sian abort (); 97266152Sian if (__builtin_object_size (exta, 3) != 0) 98266152Sian abort (); 99266152Sian if (__builtin_object_size (exta + 10, 3) != 0) 100246057Sganbold abort (); 101246057Sganbold if (__builtin_object_size (&exta[5], 3) != 0) 102246057Sganbold abort (); 103246057Sganbold if (__builtin_object_size (extb, 3) != sizeof (extb)) 104246057Sganbold abort (); 105246057Sganbold if (__builtin_object_size (extb + 10, 3) != sizeof (extb) - 10) 106246057Sganbold abort (); 107246057Sganbold if (__builtin_object_size (&extb[5], 3) != sizeof (extb) - 5) 108246057Sganbold abort (); 109246057Sganbold if (__builtin_object_size (extc, 3) != 0) 110246057Sganbold abort (); 111246057Sganbold if (__builtin_object_size (extc + 10, 3) != 0) 112246057Sganbold abort (); 113246375Sganbold if (__builtin_object_size (&extc[5], 3) != 0) 114246057Sganbold abort (); 115246057Sganbold if (__builtin_object_size (&extc->a, 3) != 0) 116246057Sganbold abort (); 117246057Sganbold if (__builtin_object_size (&(extc + 10)->b, 3) != 0) 118246057Sganbold abort (); 119246057Sganbold if (__builtin_object_size (&extc[5].c[3], 3) != 0) 120246057Sganbold abort (); 121246057Sganbold if (__builtin_object_size (var, 3) != 0) 122246057Sganbold abort (); 123246057Sganbold if (__builtin_object_size (var + 10, 3) != 0) 124246057Sganbold abort (); 125246057Sganbold if (__builtin_object_size (&var[5], 3) != 0) 126246057Sganbold abort (); 127246057Sganbold if (__builtin_object_size (vara, 3) != 0) 128246057Sganbold abort (); 129246057Sganbold if (__builtin_object_size (vara + 10, 3) != 0) 130246057Sganbold abort (); 131246057Sganbold if (__builtin_object_size (&vara[5], 3) != 0) 132246057Sganbold abort (); 133246057Sganbold if (__builtin_object_size (&vara[0].a, 3) != sizeof (vara[0].a)) 134246057Sganbold abort (); 135246057Sganbold if (__builtin_object_size (&vara[10].a[0], 3) != sizeof (vara[0].a)) 136246057Sganbold abort (); 137246057Sganbold if (__builtin_object_size (&vara[5].a[4], 3) != sizeof (vara[0].a) - 4) 138246057Sganbold abort (); 139246057Sganbold if (__builtin_object_size (&vara[5].b, 3) != sizeof (vara[0].b)) 140246057Sganbold abort (); 141246057Sganbold if (__builtin_object_size (&vara[7].c[7], 3) != sizeof (vara[0].c) - 7) 142246057Sganbold abort (); 143246057Sganbold if (__builtin_object_size (zerol, 3) != 0) 144246057Sganbold abort (); 145246057Sganbold if (__builtin_object_size (&zerol, 3) != 0) 146246057Sganbold abort (); 147246057Sganbold if (__builtin_object_size (&zerol[0], 3) != 0) 148246057Sganbold abort (); 149246057Sganbold if (__builtin_object_size (zerol[0].a, 3) != 0) 150246057Sganbold abort (); 151246057Sganbold if (__builtin_object_size (&zerol[0].a[0], 3) != 0) 152246057Sganbold abort (); 153246057Sganbold if (__builtin_object_size (&zerol[0].b, 3) != 0) 154246057Sganbold abort (); 155246057Sganbold if (__builtin_object_size ("abcdefg", 3) != sizeof ("abcdefg")) 156246057Sganbold abort (); 157246057Sganbold if (__builtin_object_size ("abcd\0efg", 3) != sizeof ("abcd\0efg")) 158246057Sganbold abort (); 159246057Sganbold if (__builtin_object_size (&"abcd\0efg", 3) != sizeof ("abcd\0efg")) 160246057Sganbold abort (); 161246057Sganbold if (__builtin_object_size (&"abcd\0efg"[0], 3) != sizeof ("abcd\0efg")) 162246057Sganbold abort (); 163246057Sganbold if (__builtin_object_size (&"abcd\0efg"[4], 3) != sizeof ("abcd\0efg") - 4) 164246057Sganbold abort (); 165246057Sganbold if (__builtin_object_size ("abcd\0efg" + 5, 3) != sizeof ("abcd\0efg") - 5) 166246375Sganbold abort (); 167246375Sganbold if (__builtin_object_size (L"abcdefg", 3) != sizeof (L"abcdefg")) 168246375Sganbold abort (); 169246375Sganbold r = (char *) L"abcd\0efg"; 170246375Sganbold if (__builtin_object_size (r + 2, 3) != sizeof (L"abcd\0efg") - 2) 171246375Sganbold abort (); 172246375Sganbold} 173246057Sganbold 174246057Sganboldsize_t l1 = 1; 175246057Sganbold 176246057Sganboldvoid 177246057Sganbold__attribute__ ((noinline)) 178246057Sganboldtest2 (void) 179246057Sganbold{ 180246057Sganbold struct B { char buf1[10]; char buf2[10]; } a; 181246057Sganbold char *r, buf3[20]; 182246057Sganbold int i; 183246057Sganbold 184246057Sganbold if (sizeof (a) != 20) 185246057Sganbold return; 186246375Sganbold 187246375Sganbold r = buf3; 188246375Sganbold for (i = 0; i < 4; ++i) 189246375Sganbold { 190246851Sgonzo if (i == l1 - 1) 191246851Sgonzo r = &a.buf1[1]; 192246851Sgonzo else if (i == l1) 193246851Sgonzo r = &a.buf2[7]; 194246057Sganbold else if (i == l1 + 1) 195246057Sganbold r = &buf3[5]; 196246057Sganbold else if (i == l1 + 2) 197246057Sganbold r = &a.buf1[9]; 198246057Sganbold } 199246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.buf1) - 9) 200246057Sganbold abort (); 201246057Sganbold r = &buf3[20]; 202246057Sganbold for (i = 0; i < 4; ++i) 203246057Sganbold { 204246057Sganbold if (i == l1 - 1) 205246057Sganbold r = &a.buf1[7]; 206246057Sganbold else if (i == l1) 207246057Sganbold r = &a.buf2[7]; 208246057Sganbold else if (i == l1 + 1) 209246057Sganbold r = &buf3[5]; 210246057Sganbold else if (i == l1 + 2) 211246057Sganbold r = &a.buf1[9]; 212246057Sganbold } 213246057Sganbold if (__builtin_object_size (r, 3) != 0) 214246057Sganbold abort (); 215246057Sganbold r = &buf3[1]; 216246057Sganbold for (i = 0; i < 4; ++i) 217246057Sganbold { 218246057Sganbold if (i == l1 - 1) 219246057Sganbold r = &a.buf1[6]; 220246057Sganbold else if (i == l1) 221246057Sganbold r = &a.buf2[4]; 222246057Sganbold else if (i == l1 + 1) 223246057Sganbold r = &buf3[5]; 224246057Sganbold else if (i == l1 + 2) 225246057Sganbold r = &a.buf1[2]; 226246057Sganbold } 227246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.buf1) - 6) 228246057Sganbold abort (); 229246057Sganbold r += 2; 230246057Sganbold if (__builtin_object_size (r, 3) != sizeof (a.buf1) - 6 - 2) 231246057Sganbold abort (); 232246057Sganbold if (__builtin_object_size (r + 1, 3) != sizeof (a.buf1) - 6 - 3) 233246057Sganbold abort (); 234246057Sganbold} 235246057Sganbold 236246057Sganboldvoid 237246057Sganbold__attribute__ ((noinline)) 238246057Sganboldtest3 (void) 239246057Sganbold{ 240246057Sganbold char buf4[10]; 241246057Sganbold struct B { struct A a[2]; struct A b; char c[4]; char d; double e; 242246057Sganbold _Complex double f; } x; 243246057Sganbold double y; 244246057Sganbold _Complex double z; 245246057Sganbold double *dp; 246246057Sganbold 247246057Sganbold if (__builtin_object_size (buf4, 3) != sizeof (buf4)) 248246057Sganbold abort (); 249246057Sganbold if (__builtin_object_size (&buf4, 3) != sizeof (buf4)) 250246057Sganbold abort (); 251246057Sganbold if (__builtin_object_size (&buf4[0], 3) != sizeof (buf4)) 252246057Sganbold abort (); 253246057Sganbold if (__builtin_object_size (&buf4[1], 3) != sizeof (buf4) - 1) 254246057Sganbold abort (); 255246057Sganbold if (__builtin_object_size (&x, 3) != sizeof (x)) 256246057Sganbold abort (); 257246057Sganbold if (__builtin_object_size (&x.a, 3) != sizeof (x.a)) 258246057Sganbold abort (); 259246057Sganbold if (__builtin_object_size (&x.a[0], 3) != sizeof (x.a)) 260246057Sganbold abort (); 261246057Sganbold if (__builtin_object_size (&x.a[0].a, 3) != sizeof (x.a[0].a)) 262246057Sganbold abort (); 263246057Sganbold if (__builtin_object_size (&x.a[0].a[0], 3) != sizeof (x.a[0].a)) 264246057Sganbold abort (); 265246057Sganbold if (__builtin_object_size (&x.a[0].a[3], 3) != sizeof (x.a[0].a) - 3) 266246057Sganbold abort (); 267246057Sganbold if (__builtin_object_size (&x.a[0].b, 3) != sizeof (x.a[0].b)) 268246057Sganbold abort (); 269246057Sganbold if (__builtin_object_size (&x.a[1].c, 3) != sizeof (x.a[1].c)) 270246057Sganbold abort (); 271246057Sganbold if (__builtin_object_size (&x.a[1].c[0], 3) != sizeof (x.a[1].c)) 272246057Sganbold abort (); 273246057Sganbold if (__builtin_object_size (&x.a[1].c[3], 3) != sizeof (x.a[1].c) - 3) 274246057Sganbold abort (); 275246057Sganbold if (__builtin_object_size (&x.b, 3) != sizeof (x.b)) 276246057Sganbold abort (); 277246057Sganbold if (__builtin_object_size (&x.b.a, 3) != sizeof (x.b.a)) 278246057Sganbold abort (); 279246057Sganbold if (__builtin_object_size (&x.b.a[0], 3) != sizeof (x.b.a)) 280246057Sganbold abort (); 281246057Sganbold if (__builtin_object_size (&x.b.a[3], 3) != sizeof (x.b.a) - 3) 282246057Sganbold abort (); 283246057Sganbold if (__builtin_object_size (&x.b.b, 3) != sizeof (x.b.b)) 284246057Sganbold abort (); 285246057Sganbold if (__builtin_object_size (&x.b.c, 3) != sizeof (x.b.c)) 286246057Sganbold abort (); 287246057Sganbold if (__builtin_object_size (&x.b.c[0], 3) != sizeof (x.b.c)) 288246057Sganbold abort (); 289246057Sganbold if (__builtin_object_size (&x.b.c[3], 3) != sizeof (x.b.c) - 3) 290246057Sganbold abort (); 291246057Sganbold if (__builtin_object_size (&x.c, 3) != sizeof (x.c)) 292246057Sganbold abort (); 293246057Sganbold if (__builtin_object_size (&x.c[0], 3) != sizeof (x.c)) 294246057Sganbold abort (); 295246057Sganbold if (__builtin_object_size (&x.c[1], 3) != sizeof (x.c) - 1) 296246057Sganbold abort (); 297246057Sganbold if (__builtin_object_size (&x.d, 3) != sizeof (x.d)) 298246057Sganbold abort (); 299246057Sganbold if (__builtin_object_size (&x.e, 3) != sizeof (x.e)) 300246057Sganbold abort (); 301246057Sganbold if (__builtin_object_size (&x.f, 3) != sizeof (x.f)) 302246057Sganbold abort (); 303246057Sganbold dp = &__real__ x.f; 304246057Sganbold if (__builtin_object_size (dp, 3) != sizeof (x.f) / 2) 305 abort (); 306 dp = &__imag__ x.f; 307 if (__builtin_object_size (dp, 3) != sizeof (x.f) / 2) 308 abort (); 309 dp = &y; 310 if (__builtin_object_size (dp, 3) != sizeof (y)) 311 abort (); 312 if (__builtin_object_size (&z, 3) != sizeof (z)) 313 abort (); 314 dp = &__real__ z; 315 if (__builtin_object_size (dp, 3) != sizeof (z) / 2) 316 abort (); 317 dp = &__imag__ z; 318 if (__builtin_object_size (dp, 3) != sizeof (z) / 2) 319 abort (); 320} 321 322struct S { unsigned int a; }; 323 324char * 325__attribute__ ((noinline)) 326test4 (char *x, int y) 327{ 328 register int i; 329 struct A *p; 330 331 for (i = 0; i < y; i++) 332 { 333 p = (struct A *) x; 334 x = (char *) &p[1]; 335 if (__builtin_object_size (p, 3) != 0) 336 abort (); 337 } 338 return x; 339} 340 341void 342__attribute__ ((noinline)) 343test5 (size_t x) 344{ 345 struct T { char buf[64]; char buf2[64]; } t; 346 char *p = &t.buf[8]; 347 size_t i; 348 349 for (i = 0; i < x; ++i) 350 p = p + 4; 351 if (__builtin_object_size (p, 3) != 0) 352 abort (); 353 memset (p, ' ', sizeof (t.buf) - 8 - 4 * 4); 354} 355 356void 357__attribute__ ((noinline)) 358test6 (void) 359{ 360 char buf[64]; 361 struct T { char buf[64]; char buf2[64]; } t; 362 char *p = &buf[64], *q = &t.buf[64]; 363 364 if (__builtin_object_size (p + 64, 3) != 0) 365 abort (); 366 if (__builtin_object_size (q + 0, 3) != 0) 367 abort (); 368 if (__builtin_object_size (q + 64, 3) != 0) 369 abort (); 370} 371 372void 373__attribute__ ((noinline)) 374test7 (void) 375{ 376 struct T { char buf[10]; char buf2[10]; } t; 377 char *p = &t.buf2[-4]; 378 char *q = &t.buf2[0]; 379 if (__builtin_object_size (p, 3) != 0) 380 abort (); 381 if (__builtin_object_size (q, 3) != sizeof (t.buf2)) 382 abort (); 383 q = &t.buf[10]; 384 if (__builtin_object_size (q, 3) != 0) 385 abort (); 386 q = &t.buf[11]; 387 if (__builtin_object_size (q, 3) != 0) 388 abort (); 389 p = &t.buf[-4]; 390 if (__builtin_object_size (p, 3) != 0) 391 abort (); 392} 393 394int 395main (void) 396{ 397 struct S s[10]; 398 __asm ("" : "=r" (l1) : "0" (l1)); 399 test1 (main, 6); 400 test2 (); 401 test3 (); 402 test4 ((char *) s, 10); 403 test5 (4); 404 test6 (); 405 test7 (); 406 exit (0); 407} 408