From 39d67d5bd4adfe3af3e581dc4309f1a5319f8f21 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Tue, 23 Aug 2005 12:27:53 +0000 Subject: [PATCH] re PR middle-end/23467 (alignment of member doesn't always carry over to alignment of struct.) gcc: PR middle-end/23467 * stor-layout.c (finalize_type_size): Dont override existing alignment with a smaller alignment from the mode. testsuite: PR middle-end/23467 * gcc.c-torture/execute/pr23467.c: New test. From-SVN: r103394 --- gcc/ChangeLog | 6 ++++++ gcc/stor-layout.c | 11 +++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/execute/pr23467.c | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr23467.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a9275fa..407f6f5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-08-23 J"orn Rennecke + + PR middle-end/23467 + * stor-layout.c (finalize_type_size): Dont override + existing alignment with a smaller alignment from the mode. + 2005-08-23 Sebastian Pop * lambda-code.c (lambda_vector_lexico_pos): Moved... diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 321a4d2..0ec818d 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -1407,8 +1407,15 @@ finalize_type_size (tree type) && TREE_CODE (type) != QUAL_UNION_TYPE && TREE_CODE (type) != ARRAY_TYPE))) { - TYPE_ALIGN (type) = GET_MODE_ALIGNMENT (TYPE_MODE (type)); - TYPE_USER_ALIGN (type) = 0; + unsigned mode_align = GET_MODE_ALIGNMENT (TYPE_MODE (type)); + + /* Don't override a larger alignment requirement coming from a user + alignment of one of the fields. */ + if (mode_align >= TYPE_ALIGN (type)) + { + TYPE_ALIGN (type) = mode_align; + TYPE_USER_ALIGN (type) = 0; + } } /* Do machine-dependent extra alignment. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 42002e9..fe03c79 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-08-23 J"orn Rennecke + + PR middle-end/23467 + * gcc.c-torture/execute/pr23467.c: New test. + 2005-08-23 Jakub Jelinek PR tree-optimization/22043 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr23467.c b/gcc/testsuite/gcc.c-torture/execute/pr23467.c new file mode 100644 index 0000000..71ec3da --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr23467.c @@ -0,0 +1,18 @@ +struct s1 +{ + int __attribute__ ((aligned (8))) a; +}; + +struct +{ + char c; + struct s1 m; +} v; + +int +main (void) +{ + if ((int)&v.m & 7) + abort (); + exit (0); +} -- 2.7.4