https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119481

            Bug ID: 119481
           Summary: -fplan9-extensions violates the C standard (6.3.3.3p7)
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alx at kernel dot org
  Target Milestone: ---

<https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3467.pdf#subsubsection.0.6.3.3.3>

```
alx@devuan:~/tmp$ cat cast.c | grep -Tn ^
                  1:    #include <stdio.h>
                  2:
                  3:    struct B {
                  4:            int i;
                  5:    };
                  6:    struct A {
                  7:            int j;
                  8:            struct B;
                  9:    };
                 10:
                 11:    int
                 12:    main(void)
                 13:    {
                 14:            struct A  a;
                 15:            struct B  *b;
                 16:            int       x;
                 17:
                 18:            b = (struct B *) &a;
                 19:            x = (&a == (struct A *) b);
                 20:
                 21:            printf("%d\n", x);
                 22:
                 23:            b = &a;
                 24:            x = (&a == (struct A *) b);
                 25:
                 26:            printf("%d\n", x);
                 27:    }
alx@devuan:~/tmp$ gcc -Wall -Wextra -fplan9-extensions cast.c 
alx@devuan:~/tmp$ ./a.out 
1
0
```

While some Plan9 extensions are interesting, there should be a diagnostic when
an implicit conversion adds an offset to a pointer.

The referenced paragraph from ISO C23 that is violated by this extension says:

```
A pointer to an object type can be converted to a pointer to a different object
type. [...] when converted back again, the result shall compare equal to the
original pointer.
```

Reply via email to