diff options
Diffstat (limited to 'gcc/cp/init.c')
-rw-r--r-- | gcc/cp/init.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 08c6c0e..530dad4 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -3384,6 +3384,18 @@ get_temp_regvar (tree type, tree init) return decl; } +/* Subroutine of build_vec_init. Returns true if assigning to an array of + INNER_ELT_TYPE from INIT is trivial. */ + +static bool +vec_copy_assign_is_trivial (tree inner_elt_type, tree init) +{ + tree fromtype = inner_elt_type; + if (real_lvalue_p (init)) + fromtype = cp_build_reference_type (fromtype, /*rval*/false); + return is_trivially_xible (MODIFY_EXPR, inner_elt_type, fromtype); +} + /* `build_vec_init' returns tree structure that performs initialization of a vector of aggregate types. @@ -3460,7 +3472,7 @@ build_vec_init (tree base, tree maxindex, tree init, && TREE_CODE (atype) == ARRAY_TYPE && TREE_CONSTANT (maxindex) && (from_array == 2 - ? !type_has_nontrivial_assignment (inner_elt_type) + ? vec_copy_assign_is_trivial (inner_elt_type, init) : !TYPE_NEEDS_CONSTRUCTING (type)) && ((TREE_CODE (init) == CONSTRUCTOR /* Don't do this if the CONSTRUCTOR might contain something |