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

            Bug ID: 117781
           Summary: typeof_unqual should not remove atomic from an array
                    of atomic type
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: luigighiron at gmail dot com
  Target Milestone: ---

The patch to PR112841 introduced a new bug into typeof_unqual:

typedef int x[2];
typedef typeof_unqual(_Atomic int[2])x;
int main(){}

GCC currently accepts this code, and Clang rejects it. This code should be
invalid, and conversely if the first declaration was "typedef _Atomic int
x[2];" then it should be valid. In C23 an array like const int[2] is considered
to be const qualified, but an array like _Atomic int[2] is not considered to be
atomic. So, typeof_unqual should remove const, volatile, and restrict from the
element type of an array but not _Atomic.

> An array and its element type are always considered to be identically
> qualified.
> 
> (footnote) This does not apply to the _Atomic qualifier. Note that qualifiers
> do not have any direct effect on the array type itself, but affect conversion
> rules for pointer types that reference an array type.
Section 6.2.5 "Types" Paragraph 31 ISO/IEC 9899:2024

Reply via email to