summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-05 21:04:23 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-05 21:04:23 +0000
commitb1088b3e03c59a74bd02dbe455b9d0b6743fc014 (patch)
tree319f79245605fcdcdd74c51918fbb1d8f483304d
parent57767d22b71676485e30bc7a3289db80ed997046 (diff)
downloadgcc-b1088b3e03c59a74bd02dbe455b9d0b6743fc014.tar.gz
2007-01-05 Richard Guenther <rguenther@suse.de>
PR middle-end/27826 * tree.c (get_narrower): Do not construct COMPONENT_REFs with mismatched types. Instead explicitly build a conversion NOP_EXPR. * g++.dg/opt/pr27826.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120498 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr27826.C14
-rw-r--r--gcc/tree.c6
4 files changed, 28 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 92925123a4a..45de0c4bca4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-01-05 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/27826
+ * tree.c (get_narrower): Do not construct COMPONENT_REFs
+ with mismatched types. Instead explicitly build a
+ conversion NOP_EXPR.
+
2007-01-05 Ian Lance Taylor <iant@google.com>
* c-common.c (decl_with_nonnull_addr_p): New function.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8856b7e2ff6..817846a9fb8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-05 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/27826
+ * g++.dg/opt/pr27826.C: New testcase.
+
2007-01-05 Ian Lance Taylor <iant@google.com>
* gcc.dg/Walways-true-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/opt/pr27826.C b/gcc/testsuite/g++.dg/opt/pr27826.C
new file mode 100644
index 00000000000..5e40f1746f9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr27826.C
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+struct Geometry
+{
+ int type:16;
+};
+struct Geometry get() {};
+int f()
+{
+ struct Geometry test;
+ return get().type == test.type;
+}
+
diff --git a/gcc/tree.c b/gcc/tree.c
index 5abd6f345f3..71d221ee486 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -5989,12 +5989,10 @@ get_narrower (tree op, int *unsignedp_ptr)
{
if (first)
uns = DECL_UNSIGNED (TREE_OPERAND (op, 1));
- win = build3 (COMPONENT_REF, type, TREE_OPERAND (op, 0),
- TREE_OPERAND (op, 1), NULL_TREE);
- TREE_SIDE_EFFECTS (win) = TREE_SIDE_EFFECTS (op);
- TREE_THIS_VOLATILE (win) = TREE_THIS_VOLATILE (op);
+ win = fold_convert (type, op);
}
}
+
*unsignedp_ptr = uns;
return win;
}