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

Alexander Monakov <amonakov at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |amonakov at gcc dot gnu.org

--- Comment #3 from Alexander Monakov <amonakov at gcc dot gnu.org> ---
Note that 6.5.6 takes care to allow unevaluated * operator:

    If the result points one past the last element of the array object,
    it shall not be used as the operand of a unary * operator that is
evaluated.

So for example there's no UB in

void bar_aux (int *);
void foo (void)
{
  int i;
  int *p = &i;
  bar_aux (&p[1]);
}

In your example with 'bar', the formal evaluation in the expression 'p[1]' does
not create a copy of the array, it simply strips off one array dimension in the
pointed-to type. So I am pretty sure it was not an intention of the standard to
make that undefined. Perhaps the standard could be edited to make that clearer,
but there's no need to issue a warning here.

Reply via email to