| /* Test we do correct thing for adding to / subtracting from a pointer, |
| i.e. that the multiplication by the size of the pointer target type |
| still occurs. */ |
| /* { dg-do run } */ |
| /* { dg-options "-std=c11 -pedantic-errors" } */ |
| /* { dg-xfail-run-if "PR97444: stack atomics" { nvptx*-*-* } }*/ |
| |
| #define TEST_POINTER_ADD_SUB(TYPE) \ |
| do \ |
| { \ |
| TYPE a[3][3]; \ |
| TYPE (*_Atomic q)[3] = &a[0]; \ |
| ++q; \ |
| if (q != &a[1]) \ |
| __builtin_abort (); \ |
| q++; \ |
| if (q != &a[2]) \ |
| __builtin_abort (); \ |
| --q; \ |
| if (q != &a[1]) \ |
| __builtin_abort (); \ |
| q--; \ |
| if (q != &a[0]) \ |
| __builtin_abort (); \ |
| q += 2; \ |
| if (q != &a[2]) \ |
| __builtin_abort (); \ |
| q -= 2; \ |
| if (q != &a[0]) \ |
| __builtin_abort (); \ |
| } \ |
| while (0) |
| |
| int |
| main (void) |
| { |
| TEST_POINTER_ADD_SUB (_Bool); |
| TEST_POINTER_ADD_SUB (char); |
| TEST_POINTER_ADD_SUB (signed char); |
| TEST_POINTER_ADD_SUB (unsigned char); |
| TEST_POINTER_ADD_SUB (signed short); |
| TEST_POINTER_ADD_SUB (unsigned short); |
| TEST_POINTER_ADD_SUB (signed int); |
| TEST_POINTER_ADD_SUB (unsigned int); |
| TEST_POINTER_ADD_SUB (signed long); |
| TEST_POINTER_ADD_SUB (unsigned long); |
| TEST_POINTER_ADD_SUB (signed long long); |
| TEST_POINTER_ADD_SUB (unsigned long long); |
| TEST_POINTER_ADD_SUB (float); |
| TEST_POINTER_ADD_SUB (double); |
| TEST_POINTER_ADD_SUB (long double); |
| TEST_POINTER_ADD_SUB (_Complex float); |
| TEST_POINTER_ADD_SUB (_Complex double); |
| TEST_POINTER_ADD_SUB (_Complex long double); |
| } |