From: rguenth Date: Fri, 5 Jan 2007 21:04:23 +0000 (+0000) Subject: 2007-01-05 Richard Guenther X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b1088b3e03c59a74bd02dbe455b9d0b6743fc014;p=thirdparty%2Fgcc.git 2007-01-05 Richard Guenther 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 92925123a4a4..45de0c4bca48 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-01-05 Richard Guenther + + 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 * c-common.c (decl_with_nonnull_addr_p): New function. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8856b7e2ff62..817846a9fb82 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-01-05 Richard Guenther + + PR middle-end/27826 + * g++.dg/opt/pr27826.C: New testcase. + 2007-01-05 Ian Lance Taylor * 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 000000000000..5e40f1746f98 --- /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 5abd6f345f3c..71d221ee486c 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; }