aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-object-size.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-06-23 16:27:04 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2009-06-23 16:27:04 +0200
commit8593e0b6b9f793572b91f36ad4e3f5bae4ea80d5 (patch)
treeb734b0a2ff50252e4ef4580a7c5f5c9be79ac208 /gcc/tree-object-size.c
parent7309083f99e306bd9f8512be3c7f4093cbbb13d0 (diff)
downloadgcc-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.c48
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;