1 /* Test we do correct thing for adding to / subtracting from a pointer, 2 i.e. that the multiplication by the size of the pointer target type 3 still occurs. */ 4 /* { dg-do run } */ 5 /* { dg-options "-std=c11 -pedantic-errors" } */ 6 7 #define TEST_POINTER_ADD_SUB(TYPE) \ 8 do \ 9 { \ 10 TYPE a[3][3]; \ 11 TYPE (*_Atomic q)[3] = &a[0]; \ 12 ++q; \ 13 if (q != &a[1]) \ 14 __builtin_abort (); \ 15 q++; \ 16 if (q != &a[2]) \ 17 __builtin_abort (); \ 18 --q; \ 19 if (q != &a[1]) \ 20 __builtin_abort (); \ 21 q--; \ 22 if (q != &a[0]) \ 23 __builtin_abort (); \ 24 q += 2; \ 25 if (q != &a[2]) \ 26 __builtin_abort (); \ 27 q -= 2; \ 28 if (q != &a[0]) \ 29 __builtin_abort (); \ 30 } \ 31 while (0) 32 33 int main(void)34main (void) 35 { 36 TEST_POINTER_ADD_SUB (_Bool); 37 TEST_POINTER_ADD_SUB (char); 38 TEST_POINTER_ADD_SUB (signed char); 39 TEST_POINTER_ADD_SUB (unsigned char); 40 TEST_POINTER_ADD_SUB (signed short); 41 TEST_POINTER_ADD_SUB (unsigned short); 42 TEST_POINTER_ADD_SUB (signed int); 43 TEST_POINTER_ADD_SUB (unsigned int); 44 TEST_POINTER_ADD_SUB (signed long); 45 TEST_POINTER_ADD_SUB (unsigned long); 46 TEST_POINTER_ADD_SUB (signed long long); 47 TEST_POINTER_ADD_SUB (unsigned long long); 48 TEST_POINTER_ADD_SUB (float); 49 TEST_POINTER_ADD_SUB (double); 50 TEST_POINTER_ADD_SUB (long double); 51 TEST_POINTER_ADD_SUB (_Complex float); 52 TEST_POINTER_ADD_SUB (_Complex double); 53 TEST_POINTER_ADD_SUB (_Complex long double); 54 } 55