1 /* { dg-do compile } */
2 /* { dg-options "-O2" } */
3 #include <stddef.h>
4 void *a;
5 int *b;
6 struct c {void * a;} c;
7 struct d {short * a;} d;
8 
9 int *ip= (int *)(size_t)2;
10 int **ipp = &ip;
11 
12 int
main()13 main()
14 {
15   float **ptr;
16   void **uptr;
17   int* const* cipp = (int* const*)ipp;
18   /* as an extension we consider void * universal. Writes to it should alias.  */
19   asm ("":"=r"(ptr):"0"(&a));
20   a=NULL;
21   *ptr=(float*)(size_t)1;
22   if (!a)
23     __builtin_abort ();
24   a=NULL;
25   if (*ptr)
26     __builtin_abort ();
27 
28   asm ("":"=r"(uptr):"0"(&b));
29   b=NULL;
30   *uptr=(void*)(size_t)1;
31   if (!b)
32     __builtin_abort ();
33   b=NULL;
34   if (*uptr)
35     __builtin_abort ();
36 
37   /* Check that we disambiguate int * and char *.  */
38   asm ("":"=r"(ptr):"0"(&b));
39   b=NULL;
40   *ptr=(float*)(size_t)1;
41   if (b)
42     __builtin_abort ();
43 
44   /* Again we should make void * in the structure conflict with any pointer.  */
45   asm ("":"=r"(ptr):"0"(&c));
46   c.a=NULL;
47   *ptr=(float*)(size_t)1;
48   if (!c.a)
49     __builtin_abort ();
50   c.a=NULL;
51   if (*ptr)
52     __builtin_abort ();
53 
54   asm ("":"=r"(uptr):"0"(&d));
55   d.a=NULL;
56   *uptr=(void*)(size_t)1;
57   if (!d.a)
58     __builtin_abort ();
59   d.a=NULL;
60   if (*uptr)
61     __builtin_abort ();
62 
63   if ((void *)*cipp != (void*)(size_t)2)
64     __builtin_abort ();
65   *ipp = NULL;
66   if (*cipp)
67     __builtin_abort ();
68 
69   return 0;
70 }
71