From 9b638c031a7ec32d422e150f613f1ce718305a2a Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 29 Jul 2010 12:31:29 +0000 Subject: [PATCH] tree.c (build_vector): Assert that the vector constant has enough elements. 2010-07-29 Richard Guenther * tree.c (build_vector): Assert that the vector constant has enough elements. (build_vector_from_ctor): Pad with trailing zeros. From-SVN: r162677 --- gcc/ChangeLog | 6 ++++++ gcc/tree.c | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 45155e417f5..44353ab7ec8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-07-29 Richard Guenther + + * tree.c (build_vector): Assert that the vector constant + has enough elements. + (build_vector_from_ctor): Pad with trailing zeros. + 2010-07-29 Richard Guenther PR tree-optimization/45120 diff --git a/gcc/tree.c b/gcc/tree.c index a33f22b40f5..f40114575e8 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -1318,6 +1318,7 @@ build_vector (tree type, tree vals) tree v = make_node (VECTOR_CST); int over = 0; tree link; + unsigned cnt = 0; TREE_VECTOR_CST_ELTS (v) = vals; TREE_TYPE (v) = type; @@ -1326,6 +1327,7 @@ build_vector (tree type, tree vals) for (link = vals; link; link = TREE_CHAIN (link)) { tree value = TREE_VALUE (link); + cnt++; /* Don't crash if we get an address constant. */ if (!CONSTANT_CLASS_P (value)) @@ -1334,6 +1336,8 @@ build_vector (tree type, tree vals) over |= TREE_OVERFLOW (value); } + gcc_assert (cnt == TYPE_VECTOR_SUBPARTS (type)); + TREE_OVERFLOW (v) = over; return v; } @@ -1350,6 +1354,9 @@ build_vector_from_ctor (tree type, VEC(constructor_elt,gc) *v) FOR_EACH_CONSTRUCTOR_VALUE (v, idx, value) list = tree_cons (NULL_TREE, value, list); + for (; idx < TYPE_VECTOR_SUBPARTS (type); ++idx) + list = tree_cons (NULL_TREE, + fold_convert (TREE_TYPE (type), integer_zero_node), list); return build_vector (type, nreverse (list)); }