[Bug c++/68531] changing bound variable of a VLA type changes type size
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Feb 20 16:36:00 GMT 2020
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;
More information about the Gcc-bugs
mailing list