diff options
author | Richard Biener <rguenther@suse.de> | 2019-06-13 08:41:13 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-06-13 08:41:13 +0000 |
commit | a8b98e2fc074dfb6c9419efbe70ce4021a04f356 (patch) | |
tree | c149e3e3dbe079abb988d8fc5d0b98b6966a7db6 /gcc | |
parent | c29c92c789d93848cc1c929838771bfc68cb272c (diff) | |
download | gcc-a8b98e2fc074dfb6c9419efbe70ce4021a04f356.zip gcc-a8b98e2fc074dfb6c9419efbe70ce4021a04f356.tar.gz gcc-a8b98e2fc074dfb6c9419efbe70ce4021a04f356.tar.bz2 |
re PR c++/90801 (A recurring hang)
2019-06-13 Richard Biener <rguenther@suse.de>
PR c++/90801
* typeck2.c (split_nonconstant_init_1): Properly count
num_split_elts, optimize single constructor elt removal.
From-SVN: r272235
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 23 |
2 files changed, 21 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 37d2b2a..da5dec3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2019-06-13 Richard Biener <rguenther@suse.de> + + PR c++/90801 + * typeck2.c (split_nonconstant_init_1): Properly count + num_split_elts, optimize single constructor elt removal. + 2019-06-12 Marek Polacek <polacek@redhat.com> PR c++/66999 - 'this' captured by reference. diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index dd7e2cb..0109d6e 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -603,7 +603,7 @@ cxx_incomplete_type_error (location_t loc, const_tree value, const_tree type) static bool split_nonconstant_init_1 (tree dest, tree init) { - unsigned HOST_WIDE_INT idx, tidx; + unsigned HOST_WIDE_INT idx, tidx = HOST_WIDE_INT_M1U; tree field_index, value; tree type = TREE_TYPE (dest); tree inner_type = NULL; @@ -657,9 +657,13 @@ split_nonconstant_init_1 (tree dest, tree init) if (!split_nonconstant_init_1 (sub, value)) complete_p = false; else - /* Mark element for removal. */ - CONSTRUCTOR_ELT (init, idx)->index = NULL_TREE; - num_split_elts++; + { + /* Mark element for removal. */ + CONSTRUCTOR_ELT (init, idx)->index = NULL_TREE; + if (idx < tidx) + tidx = idx; + num_split_elts++; + } } else if (!initializer_constant_valid_p (value, inner_type)) { @@ -668,6 +672,8 @@ split_nonconstant_init_1 (tree dest, tree init) /* Mark element for removal. */ CONSTRUCTOR_ELT (init, idx)->index = NULL_TREE; + if (idx < tidx) + tidx = idx; if (TREE_CODE (field_index) == RANGE_EXPR) { @@ -705,17 +711,18 @@ split_nonconstant_init_1 (tree dest, tree init) num_split_elts++; } } - if (num_split_elts != 0) + if (num_split_elts == 1) + CONSTRUCTOR_ELTS (init)->ordered_remove (tidx); + else if (num_split_elts > 1) { /* Perform the delayed ordered removal of non-constant elements we split out. */ - for (tidx = 0, idx = 0; idx < CONSTRUCTOR_NELTS (init); ++idx) + for (idx = tidx; idx < CONSTRUCTOR_NELTS (init); ++idx) if (CONSTRUCTOR_ELT (init, idx)->index == NULL_TREE) ; else { - if (tidx != idx) - *CONSTRUCTOR_ELT (init, tidx) = *CONSTRUCTOR_ELT (init, idx); + *CONSTRUCTOR_ELT (init, tidx) = *CONSTRUCTOR_ELT (init, idx); ++tidx; } vec_safe_truncate (CONSTRUCTOR_ELTS (init), tidx); |