diff options
author | Richard Guenther <rguenther@suse.de> | 2007-01-05 21:04:23 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2007-01-05 21:04:23 +0000 |
commit | afe1a916d7e6195a85569d33685fd3259f9a0e84 (patch) | |
tree | 319f79245605fcdcdd74c51918fbb1d8f483304d /gcc | |
parent | ee167bcb2d2382cf9f64d84ac9630176a8deac8f (diff) | |
download | gcc-afe1a916d7e6195a85569d33685fd3259f9a0e84.zip gcc-afe1a916d7e6195a85569d33685fd3259f9a0e84.tar.gz gcc-afe1a916d7e6195a85569d33685fd3259f9a0e84.tar.bz2 |
re PR c++/27826 (ICE in copy_to_mode_reg)
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.
From-SVN: r120498
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr27826.C | 14 | ||||
-rw-r--r-- | gcc/tree.c | 6 |
4 files changed, 28 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9292512..45de0c4 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 8856b7e..817846a 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 0000000..5e40f17 --- /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; +} + @@ -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; } |