diff options
author | Richard Henderson <rth@redhat.com> | 2005-01-29 18:13:46 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2005-01-29 18:13:46 -0800 |
commit | 486e432615e3a3e526044f3002db03a0ddbc04b5 (patch) | |
tree | a84e86167986519b9fa3f1c7c5850749cdf43169 /gcc/expr.c | |
parent | eb2ab5113844abdf4d1de1f3cbee4ce3a7690efb (diff) | |
download | gcc-486e432615e3a3e526044f3002db03a0ddbc04b5.zip gcc-486e432615e3a3e526044f3002db03a0ddbc04b5.tar.gz gcc-486e432615e3a3e526044f3002db03a0ddbc04b5.tar.bz2 |
re PR middle-end/19687 (ICE with union initializer)
PR middle-end/19687
* expr.c (categorize_ctor_elements_1): Check for CONSTRUCTOR of a
union being empty.
From-SVN: r94421
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 42 |
1 files changed, 23 insertions, 19 deletions
@@ -4364,29 +4364,33 @@ categorize_ctor_elements_1 (tree ctor, HOST_WIDE_INT *p_nz_elts, || TREE_CODE (TREE_TYPE (ctor)) == QUAL_UNION_TYPE)) { tree init_sub_type; + bool clear_this = true; - /* We don't expect more than one element of the union to be - initialized. Not sure what we should do otherwise... */ list = CONSTRUCTOR_ELTS (ctor); - gcc_assert (TREE_CHAIN (list) == NULL); - - init_sub_type = TREE_TYPE (TREE_VALUE (list)); - - /* ??? We could look at each element of the union, and find the - largest element. Which would avoid comparing the size of the - initialized element against any tail padding in the union. - Doesn't seem worth the effort... */ - if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (ctor)), - TYPE_SIZE (init_sub_type)) == 1) + if (list) { - /* And now we have to find out if the element itself is fully - constructed. E.g. for union { struct { int a, b; } s; } u - = { .s = { .a = 1 } }. */ - if (elt_count != count_type_elements (init_sub_type)) - *p_must_clear = true; + /* We don't expect more than one element of the union to be + initialized. Not sure what we should do otherwise... */ + gcc_assert (TREE_CHAIN (list) == NULL); + + init_sub_type = TREE_TYPE (TREE_VALUE (list)); + + /* ??? We could look at each element of the union, and find the + largest element. Which would avoid comparing the size of the + initialized element against any tail padding in the union. + Doesn't seem worth the effort... */ + if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (ctor)), + TYPE_SIZE (init_sub_type)) == 1) + { + /* And now we have to find out if the element itself is fully + constructed. E.g. for union { struct { int a, b; } s; } u + = { .s = { .a = 1 } }. */ + if (elt_count == count_type_elements (init_sub_type)) + clear_this = false; + } } - else - *p_must_clear = true; + + *p_must_clear = clear_this; } *p_nz_elts += nz_elts; |