aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2007-10-11 08:58:28 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2007-10-11 08:58:28 +0000
commit20dcff2aec49d4274cf4564186ca11b78c01f4de (patch)
treea22c969c6a1f62a117efed36cbc46f1aa283273e /gcc
parent31b52b5a21ea72420cc11a9077843ad6cbc059a2 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr33724.c20
-rw-r--r--gcc/tree-cfg.c27
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));