diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-06-23 16:27:04 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-06-23 16:27:04 +0200 |
commit | 8593e0b6b9f793572b91f36ad4e3f5bae4ea80d5 (patch) | |
tree | b734b0a2ff50252e4ef4580a7c5f5c9be79ac208 /gcc/tree-object-size.c | |
parent | 7309083f99e306bd9f8512be3c7f4093cbbb13d0 (diff) | |
download | gcc-8593e0b6b9f793572b91f36ad4e3f5bae4ea80d5.zip gcc-8593e0b6b9f793572b91f36ad4e3f5bae4ea80d5.tar.gz gcc-8593e0b6b9f793572b91f36ad4e3f5bae4ea80d5.tar.bz2 |
tree-object-size.c (addr_object_size): Instead of checking for non-NULL TREE_CHAIN of the FIELD_DECL check that there...
* tree-object-size.c (addr_object_size): Instead of checking
for non-NULL TREE_CHAIN of the FIELD_DECL check that there
are no FIELD_DECLs following it.
* g++.dg/ext/builtin-object-size1.C: New test.
* g++.dg/ext/builtin-object-size2.C: New test.
From-SVN: r148851
Diffstat (limited to 'gcc/tree-object-size.c')
-rw-r--r-- | gcc/tree-object-size.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/gcc/tree-object-size.c b/gcc/tree-object-size.c index ebef69c..5c64b98 100644 --- a/gcc/tree-object-size.c +++ b/gcc/tree-object-size.c @@ -257,27 +257,39 @@ addr_object_size (struct object_size_info *osi, const_tree ptr, v = NULL_TREE; break; case COMPONENT_REF: - if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) - == RECORD_TYPE - && TREE_CHAIN (TREE_OPERAND (v, 1))) - || TREE_CODE (TREE_TYPE (v)) != ARRAY_TYPE) - v = NULL_TREE; - else + if (TREE_CODE (TREE_TYPE (v)) != ARRAY_TYPE) + { + v = NULL_TREE; + break; + } + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) + == RECORD_TYPE) { - if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) - == RECORD_TYPE) - v = TREE_OPERAND (v, 0); - while (v && v != pt_var && TREE_CODE (v) == COMPONENT_REF) - if (TREE_CODE (TREE_TYPE (v)) != UNION_TYPE - && TREE_CODE (TREE_TYPE (v)) != QUAL_UNION_TYPE) + tree fld_chain = TREE_CHAIN (TREE_OPERAND (v, 1)); + for (; fld_chain; fld_chain = TREE_CHAIN (fld_chain)) + if (TREE_CODE (fld_chain) == FIELD_DECL) + break; + + if (fld_chain) + { + v = NULL_TREE; break; - else - v = TREE_OPERAND (v, 0); - if (v && v != pt_var) - v = NULL_TREE; - else - v = pt_var; + } } + + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) + == RECORD_TYPE) + v = TREE_OPERAND (v, 0); + while (v && v != pt_var && TREE_CODE (v) == COMPONENT_REF) + if (TREE_CODE (TREE_TYPE (v)) != UNION_TYPE + && TREE_CODE (TREE_TYPE (v)) != QUAL_UNION_TYPE) + break; + else + v = TREE_OPERAND (v, 0); + if (v && v != pt_var) + v = NULL_TREE; + else + v = pt_var; break; default: v = pt_var; |