diff options
author | Jason Merrill <jason@redhat.com> | 2006-09-08 01:11:40 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2006-09-08 01:11:40 -0400 |
commit | df20ea24f939e8d2b005d2ef985446b2fe0cf597 (patch) | |
tree | 961181e0ca6120d90ad5ec06b4bd72fd8f863d60 | |
parent | 158d56c4e2ce2ae5f3044bd7a277fef43466f2f6 (diff) | |
download | gcc-df20ea24f939e8d2b005d2ef985446b2fe0cf597.zip gcc-df20ea24f939e8d2b005d2ef985446b2fe0cf597.tar.gz gcc-df20ea24f939e8d2b005d2ef985446b2fe0cf597.tar.bz2 |
re PR middle-end/27724 (internal compiler error: no-op convert from 4 to 8 bytes in initializer)
PR middle-end/27724
* varasm.c (output_constant): Only strip actual no-op conversions.
From-SVN: r116777
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/long-long-cst1.c | 17 | ||||
-rw-r--r-- | gcc/varasm.c | 8 |
3 files changed, 24 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a430e20..baa8adc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2006-09-07 Jason Merrill <jason@redhat.com> + PR middle-end/27724 + * varasm.c (output_constant): Only strip actual no-op conversions. + PR target/13685 * config/i386/i386.c (override_options): Use 128-bit stack boundary if -msse. diff --git a/gcc/testsuite/gcc.dg/long-long-cst1.c b/gcc/testsuite/gcc.dg/long-long-cst1.c new file mode 100644 index 0000000..7c120dc --- /dev/null +++ b/gcc/testsuite/gcc.dg/long-long-cst1.c @@ -0,0 +1,17 @@ +/* PR middle-end/27724 */ +/* { dg-do run } */ +/* { dg-options "" } */ + +extern void abort(); + +struct st{ + int _mark; +}; +unsigned long long t = ((int)&(((struct st*)16)->_mark) - 32); + +int main() +{ + if (t != (unsigned long long)(int)-16) + abort (); +} + diff --git a/gcc/varasm.c b/gcc/varasm.c index 9837e0d..3091132 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -4039,10 +4039,10 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align) if (type_size > op_size && TREE_CODE (exp) != VIEW_CONVERT_EXPR && TREE_CODE (TREE_TYPE (exp)) != UNION_TYPE) - internal_error ("no-op convert from %wd to %wd bytes in initializer", - op_size, type_size); - - exp = TREE_OPERAND (exp, 0); + /* Keep the conversion. */ + break; + else + exp = TREE_OPERAND (exp, 0); } code = TREE_CODE (TREE_TYPE (exp)); |