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

            Bug ID: 116728
           Summary: c23 tag compatibility broken with pointers to
                    incomplete types
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: himehaieto at gmail dot com
  Target Milestone: ---

Created attachment 59117
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59117&action=edit
tag-compat-pointer-bug.i

C23 changed struct tag compatibility rules to allow for structs with the same
tag and multiple non-conflicting definitions to be compatible, and for
incomplete types to be defined and established as compatible later in the
translation unit.  However, when the attached code attempts to use such an
incomplete type for a function, the compiler instead gives the familiar pre-C23
error about incompatible types (i.e., "struct foo *" vs "struct foo *").

A forward declaration at the start (i.e., struct_foo;) and/or an inline
definition of the struct within the function signature (i.e., void bar(struct
foo {int value;} *foo) {}) allow the code to compile without issues, but in
their absence it breaks.

Note that this issue has a lot more potential subtlety with language lawyer
standardese than it may seem at first, but I'm 95% sure that tag compatibility
is supposed to allow for code like the attached to work now.  See the below for
additional reproducibility information.

`uname -a`:
Linux votocon 4.19.0-21-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30) x86_64
GNU/Linux

`lsb_release -a`:
Distributor ID: Devuan
Description:    Devuan GNU/Linux 5 (daedalus)
Release:        5
Codename:       daedalus

gcc configure options:
../../configure --prefix=/opt/gcc/14.2.0 --enable-lto

compiler command/options:
gcc --std=c23 tag-compat-pointer-bug.c

Reply via email to