| Upstream-Status: Backport |
| Signed-off-by: Khem Raj |
| |
| 2013-08-01 Martin Jambor <mjambor@suse.cz> |
| |
| PR middle-end/57748 |
| * stor-layout.c (compute_record_mode): Treat zero-sized array fields |
| like incomplete types. |
| |
| testsuite/ |
| * gcc.dg/torture/pr57748.c: New test. |
| |
| |
| Index: gcc-4.8.1/gcc/stor-layout.c |
| =================================================================== |
| --- gcc-4.8.1.orig/gcc/stor-layout.c 2013-04-28 10:29:18.000000000 -0700 |
| +++ gcc-4.8.1/gcc/stor-layout.c 2013-08-01 15:02:08.018006125 -0700 |
| @@ -1618,7 +1618,9 @@ |
| && integer_zerop (TYPE_SIZE (TREE_TYPE (field))))) |
| || ! host_integerp (bit_position (field), 1) |
| || DECL_SIZE (field) == 0 |
| - || ! host_integerp (DECL_SIZE (field), 1)) |
| + || ! host_integerp (DECL_SIZE (field), 1) |
| + || (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE |
| + && tree_low_cst (DECL_SIZE (field), 1) == 0)) |
| return; |
| |
| /* If this field is the whole struct, remember its mode so |
| Index: gcc-4.8.1/gcc/testsuite/gcc.dg/torture/pr57748.c |
| =================================================================== |
| --- /dev/null 1970-01-01 00:00:00.000000000 +0000 |
| +++ gcc-4.8.1/gcc/testsuite/gcc.dg/torture/pr57748.c 2013-08-01 15:02:08.062006126 -0700 |
| @@ -0,0 +1,45 @@ |
| +/* PR middle-end/57748 */ |
| +/* { dg-do run } */ |
| + |
| +#include <stdlib.h> |
| + |
| +extern void abort (void); |
| + |
| +typedef long long V |
| + __attribute__ ((vector_size (2 * sizeof (long long)), may_alias)); |
| + |
| +typedef struct S { V a; V b[0]; } P __attribute__((aligned (1))); |
| + |
| +struct __attribute__((packed)) T { char c; P s; }; |
| + |
| +void __attribute__((noinline, noclone)) |
| +check (struct T *t) |
| +{ |
| + if (t->s.b[0][0] != 3 || t->s.b[0][1] != 4) |
| + abort (); |
| +} |
| + |
| +int __attribute__((noinline, noclone)) |
| +get_i (void) |
| +{ |
| + return 0; |
| +} |
| + |
| +void __attribute__((noinline, noclone)) |
| +foo (P *p) |
| +{ |
| + V a = { 3, 4 }; |
| + int i = get_i(); |
| + p->b[i] = a; |
| +} |
| + |
| +int |
| +main () |
| +{ |
| + struct T *t = (struct T *) malloc (128); |
| + |
| + foo (&t->s); |
| + check (t); |
| + |
| + return 0; |
| +} |