diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-30 02:13:46 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-30 02:13:46 +0000 |
commit | ab397fa77ab5ffc9cc6c3aa6c599591c29ecd28a (patch) | |
tree | a84e86167986519b9fa3f1c7c5850749cdf43169 /gcc/expr.c | |
parent | af8e5e26c7e657e515e25a388d936e4523e02f78 (diff) | |
download | gcc-ab397fa77ab5ffc9cc6c3aa6c599591c29ecd28a.tar.gz |
PR middle-end/19687
* expr.c (categorize_ctor_elements_1): Check for CONSTRUCTOR of a
union being empty.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94421 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/gcc/expr.c b/gcc/expr.c index 1f82b1d9834..29acbba5c5b 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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; |