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

            Bug ID: 77767
           Summary: Side-effect from VLA array parameters lost
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jsm28 at gcc dot gnu.org
  Target Milestone: ---

The program

#include <stdio.h>
int
f (int a, int b[a++], int c, int d[c++])
{
  printf ("%d %d\n", a, c);
}

int
main (void)
{
  int dummy[10];
  f (1, dummy, 1, dummy);
  return 0;
}

outputs "1 2".  It should output "2 2".

Side-effects from size expressions for array parameters are handled through the
pending_sizes member of struct c_arg_info.  c_parser_parms_list_declarator may
call push_parm_decl any number of times, and push_parm_decl calls
grokdeclarator, and each grokdeclarator call overwrites the previous value of
expr storing expressions to evaluate on function entry, when what is required
is to update it instead.

Either push_parm_decl (or something further up the call chain) needs to deal
with merging with an existing value, or grokdeclarator could be made to do so
but then all callers wanting the existing overwriting would need to be updated
to pass a pointer to a variable with a NULL_TREE value, rather than an old
value that should be overwritten or an uninitialized variable.

Reply via email to