blob: 2dc91c510bae703f806bd4296e557aaf3b6f1b38 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/* 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" } */
#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);
}
|