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

            Bug ID: 92326
           Summary: wrong bound in zero-length array diagnostics
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

r277728 changed the formatting of zero-length arrays in diagnostics to include
their bound, but the change also inadvertently added the zero bound to flexible
array members (because they are gratuitously represented differently between
the front-ends).  The test case below shows the problem.  It only affects C
code:

$ cat x.c && gcc -O2 -S -Wall x.c
struct S0 { int n, a[0]; } s0;
struct Sx { int n, a[]; } sx = { 0 };

void f (void)
{
  s0.a[0] = 0;
  sx.a[0] = 0;
}
x.c: In function ‘f’:
x.c:6:7: warning: array subscript 0 is above array bounds of ‘int[0]’
[-Warray-bounds]
    6 |   s0.a[0] = 0;
      |   ~~~~^~~
x.c:1:20: note: while referencing ‘a’
    1 | struct S0 { int n, a[0]; } s0;
      |                    ^
x.c:1:28: note: defined here ‘s0’
    1 | struct S0 { int n, a[0]; } s0;
      |                            ^~
x.c:7:7: warning: array subscript 0 is above array bounds of ‘int[0]’
[-Warray-bounds]
    7 |   sx.a[0] = 0;
      |   ~~~~^~~
x.c:2:20: note: while referencing ‘a’
    2 | struct Sx { int n, a[]; } sx = { 0 };
      |                    ^
x.c:2:27: note: defined here ‘sx’
    2 | struct Sx { int n, a[]; } sx = { 0 };
      |                           ^~


When compiled by the C++ front-end, the format of the arrays is as expected:

$ gcc -O2 -S -Wall -xc++ x.c
x.c: In function ‘void f()’:
x.c:6:9: warning: array subscript 0 is above array bounds of ‘int [0]’
[-Warray-bounds]
    6 |   s0.a[0] = 0;
      |   ~~~~~~^
x.c:1:20: note: while referencing ‘S0::a’
    1 | struct S0 { int n, a[0]; } s0;
      |                    ^
x.c:1:28: note: defined here ‘s0’
    1 | struct S0 { int n, a[0]; } s0;
      |                            ^~
x.c:7:9: warning: array subscript 0 is above array bounds of ‘int []’
[-Warray-bounds]
    7 |   sx.a[0] = 0;
      |   ~~~~~~^
x.c:2:20: note: while referencing ‘Sx::a’
    2 | struct Sx { int n, a[]; } sx = { 0 };
      |                    ^
x.c:2:27: note: defined here ‘sx’
    2 | struct Sx { int n, a[]; } sx = { 0 };
      |                           ^~

Reply via email to