summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-05-11 14:05:46 -0400
committerJason Merrill <jason@redhat.com>2020-05-11 14:50:41 -0400
commitf315d1477d5164cb8ec1a004ce368dd52d47092a (patch)
tree2af6ff6fd5368ffc7e2955570f0e826bdf5a74b9
parent3a3e1ea9c674e50e402d5410970411ea6590f630 (diff)
c++: Tweak VLA representation.
If we put the SAVE_EXPR for a VLA size inside the MINUS_EXPR rather than outside, it will work better with constant folding. The equivalent change was made in the C front-end in 2004, in commit r0-64535-g8b0b9aefd29dfe6398857bcf5628662e2f0e21f6 gcc/cp/ChangeLog 2020-05-11 Jason Merrill <jason@redhat.com> * decl.c (compute_array_index_type_loc): Stabilize before building the MINUS_EXPR.
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c14
2 files changed, 14 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ab5e6abb866..9831c253668 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2020-05-11 Jason Merrill <jason@redhat.com>
+ * decl.c (compute_array_index_type_loc): Stabilize before building
+ the MINUS_EXPR.
+
+2020-05-11 Jason Merrill <jason@redhat.com>
+
* decl.c (grokdeclarator): Adjust deprecated_state here.
(start_decl): Not here.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index adf94658420..dea1ba07c0e 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -10449,6 +10449,15 @@ compute_array_index_type_loc (location_t name_loc, tree name, tree size,
itype = build_min (MINUS_EXPR, sizetype, size, integer_one_node);
else
{
+ if (!TREE_CONSTANT (size))
+ {
+ /* A variable sized array. Arrange for the SAVE_EXPR on the inside
+ of the MINUS_EXPR, which allows the -1 to get folded with the +1
+ that happens when building TYPE_SIZE. */
+ size = variable_size (size);
+ stabilize_vla_size (size);
+ }
+
/* Compute the index of the largest element in the array. It is
one less than the number of elements in the array. We save
and restore PROCESSING_TEMPLATE_DECL so that computations in
@@ -10466,11 +10475,6 @@ compute_array_index_type_loc (location_t name_loc, tree name, tree size,
if (!TREE_CONSTANT (itype))
{
- /* A variable sized array. */
- itype = variable_size (itype);
-
- stabilize_vla_size (itype);
-
if (sanitize_flags_p (SANITIZE_VLA)
&& current_function_decl != NULL_TREE)
{