From: jakub Date: Thu, 18 Dec 2008 07:52:07 +0000 (+0000) Subject: PR middle-end/38505 X-Git-Tag: upstream/4.9.2~38422 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0a44dcad87293ec8c296d0bbcd80e3723c81c419;p=platform%2Fupstream%2Flinaro-gcc.git PR middle-end/38505 * tree-ssa.c (useless_type_conversion_p_1): Return false if inner_type is incomplete and outer_type is complete. * gcc.c-torture/compile/pr38505.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@142806 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index df3ced5..4917689 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-12-18 Jakub Jelinek + + PR middle-end/38505 + * tree-ssa.c (useless_type_conversion_p_1): Return + false if inner_type is incomplete and outer_type is complete. + 2008-12-17 Sebastian Pop * doc/install.texi (Prerequisites): Document PPL and CLooG-PPL diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 11a6a70..0bf69e2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-12-18 Jakub Jelinek + + PR middle-end/38505 + * gcc.c-torture/compile/pr38505.c: New test. + 2008-12-17 Jason Merrill * g++.dg/cpp0x/auto6.C: Test more stuff. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr38505.c b/gcc/testsuite/gcc.c-torture/compile/pr38505.c new file mode 100644 index 0000000..b3b4a10 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr38505.c @@ -0,0 +1,23 @@ +/* PR middle-end/38505 */ +/* { dg-do compile } */ + +struct S +{ + unsigned short a[50]; + unsigned short b[20]; +}; +extern void bar (struct S *); +extern void baz (unsigned short *); +extern unsigned short d[]; + +void +foo (void) +{ + struct S s; + unsigned short g[50]; + + baz (g); + __builtin_memcpy (&s, g, sizeof (g)); + __builtin_memcpy (s.b, d, sizeof (s.b)); + bar (&s); +} diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 935cad6..ce0f1e4 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1188,6 +1188,11 @@ useless_type_conversion_p_1 (tree outer_type, tree inner_type) if (TREE_CODE (inner_type) != TREE_CODE (outer_type)) return false; + /* Conversion from an incomplete to a complete type is never + useless. */ + if (!COMPLETE_TYPE_P (inner_type) && COMPLETE_TYPE_P (outer_type)) + return false; + /* ??? This seems to be necessary even for aggregates that don't have TYPE_STRUCTURAL_EQUALITY_P set. */