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

--- Comment #18 from Martin Sebor <msebor at gcc dot gnu.org> ---
Let me explain how this works.  The VLA bounds in function parameters are used
in two ways:
1) in the front end, to check function redeclarations involving arrays and VLAs
for equivalence,
2) in the middle end, to check function calls for out of bounds accesses.

As an example of (1) consider the following declarations of function f():

  void f (int X, int, int A[X], int B[foo()]);
and
  void f (int, int J, int A[J], int B[foo() + 1]);

The bounds in the parameters A and B are different and we'd like them
diagnosed.  The bound X is the first parameter in the first declaration of f
but J is the second parameter in the second f().  Because the bounds are also
parameters, we use their positions in the argument list to determine that they
don't match.

Likewise, the bound foo() in B is different from foo() + 1, but because neither
is a parameter the only way to determine whether they match is by comparing
them for equivalence.  The code uses operand_equal_p(..., OEP_LEXICOGRAPHIC).

(2) is done only for bounds that are parameters.  Other bounds are not used for
anything, but they're still stored in the attributes so they can be compared in
the redeclarations.

Since the "complex" bounds aren't used after the front end is done with them,
unless there's a way to remove them at some point after the front end is done
(or set them to NULL or something), the LTO streaming code could ignore them
instead of asserting on them.  Alternatively, instead of storing them in their
tree form they could be stored as strings instead.  I list these in the order
of my preference for GCC 11.

Reply via email to