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;