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

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|2016-07-11 00:00:00         |2020-2-20
            Summary|incorrect code for VLA in   |changing bound variable of
                   |C++                         |a VLA type changes type
                   |                            |size
      Known to fail|                            |10.0, 6.3.0, 7.0.1, 8.3.0,
                   |                            |9.1.0

--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> ---
No change in GCC 10.  The root cause of the problem can be seen in the original
dump:

$ gcc -Wall -Wextra  -fdump-tree-original=/dev/stdout pr68531.C

;; Function int main() (null)
;; enabled by -tree-original


{
  int nelems = 7;
  typedef char A[0:(sizetype) (SAVE_EXPR <(ssizetype) nelems + -1>)];
  char a[0:(sizetype) (SAVE_EXPR <(ssizetype) nelems + -1>)];

  <<cleanup_point   int nelems = 7;>>;
  <<cleanup_point <<< Unknown tree: expr_stmt
  (void) (nelems = 2) >>>>>;
  <<cleanup_point   char a[0:(sizetype) (SAVE_EXPR <(ssizetype) nelems +
-1>)];>>;
  if (SAVE_EXPR <(ssizetype) nelems + -1> != 6 || SAVE_EXPR <(ssizetype) nelems
+ -1> != 6)
    {
      <<cleanup_point <<< Unknown tree: expr_stmt
  __builtin_abort () >>>>>;
    }
}
return <retval> = 0;


The C front-end emits the correct code:

;; Function main (null)
;; enabled by -tree-original


{
  int nelems = 7;
  typedef char A[0:(sizetype) ((long int) SAVE_EXPR <nelems> + -1)];
  char a[0:(sizetype) ((long int) SAVE_EXPR <nelems> + -1)];

    int nelems = 7;
  (void) SAVE_EXPR <nelems>;
    typedef char A[0:(sizetype) ((long int) SAVE_EXPR <nelems> + -1)];
  nelems = 2;
    char a[0:(sizetype) ((long int) SAVE_EXPR <nelems> + -1)];
  if (SAVE_EXPR <nelems> != 7 || (a, SAVE_EXPR <nelems> != 7;))
    {
      __builtin_abort ();
    }
}
return 0;

Reply via email to