diff options
author | Richard Guenther <rguenther@suse.de> | 2007-10-11 08:58:28 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2007-10-11 08:58:28 +0000 |
commit | 20dcff2aec49d4274cf4564186ca11b78c01f4de (patch) | |
tree | a22c969c6a1f62a117efed36cbc46f1aa283273e /gcc | |
parent | 31b52b5a21ea72420cc11a9077843ad6cbc059a2 (diff) | |
download | gcc-20dcff2aec49d4274cf4564186ca11b78c01f4de.zip gcc-20dcff2aec49d4274cf4564186ca11b78c01f4de.tar.gz gcc-20dcff2aec49d4274cf4564186ca11b78c01f4de.tar.bz2 |
re PR middle-end/33724 (Type checking error with address-of and ref-all pointer type)
2007-10-11 Richard Guenther <rguenther@suse.de>
PR middle-end/33724
* tree-cfg.c (one_pointer_to_useless_type_conversion_p): New function.
(verify_gimple_expr): Use it to verify pointer-to types for
ADDR_EXPRs.
* gcc.dg/pr33724.c: New testcase.
From-SVN: r129228
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr33724.c | 20 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 27 |
4 files changed, 53 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0d1c15a..e737cb7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2007-10-11 Richard Guenther <rguenther@suse.de> + PR middle-end/33724 + * tree-cfg.c (one_pointer_to_useless_type_conversion_p): New function. + (verify_gimple_expr): Use it to verify pointer-to types for + ADDR_EXPRs. + +2007-10-11 Richard Guenther <rguenther@suse.de> + PR c/33726 * c-typeck.c (build_array_ref): Do not strip qualifiers from the array element type. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 49f071b..efb4ca4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2007-10-11 Richard Guenther <rguenther@suse.de> + PR middle-end/33724 + * gcc.dg/pr33724.c: New testcase. + +2007-10-11 Richard Guenther <rguenther@suse.de> + PR c/33726 * gcc.dg/pr33726.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/pr33724.c b/gcc/testsuite/gcc.dg/pr33724.c new file mode 100644 index 0000000..7e8eb5d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr33724.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ + +/* We ICEd with type-checking enabled. */ + +struct xt_entry_target { + char name[1]; +}; +struct ipt_entry { + unsigned char elems[1]; +}; +void match_different(const unsigned char *); +int dump_entry(struct xt_entry_target *t) +{ + return __builtin_strcmp (t->name, ""); +} +void is_same(const struct ipt_entry *a) +{ + match_different(a->elems); +} + diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index dd817ad..05c69b8 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3538,6 +3538,24 @@ verify_gimple_reference (tree expr) return verify_gimple_min_lval (expr); } +/* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ) + list of pointer-to types that is trivially convertible to DEST. */ + +static bool +one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj) +{ + tree src; + + if (!TYPE_POINTER_TO (src_obj)) + return true; + + for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src)) + if (useless_type_conversion_p (dest, src)) + return true; + + return false; +} + /* Verify the GIMPLE expression EXPR. Returns true if there is an error, otherwise false. */ @@ -3773,14 +3791,11 @@ verify_gimple_expr (tree expr) error ("invalid operand in unary expression"); return true; } - if (TYPE_POINTER_TO (TREE_TYPE (op)) - && !useless_type_conversion_p (type, - TYPE_POINTER_TO (TREE_TYPE (op))) + if (!one_pointer_to_useless_type_conversion_p (type, TREE_TYPE (op)) /* FIXME: a longstanding wart, &a == &a[0]. */ && (TREE_CODE (TREE_TYPE (op)) != ARRAY_TYPE - || (TYPE_POINTER_TO (TREE_TYPE (TREE_TYPE (op))) - && !useless_type_conversion_p (type, - TYPE_POINTER_TO (TREE_TYPE (TREE_TYPE (op))))))) + || !one_pointer_to_useless_type_conversion_p (type, + TREE_TYPE (TREE_TYPE (op))))) { error ("type mismatch in address expression"); debug_generic_stmt (TREE_TYPE (expr)); |