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)34 main (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