From: Jakub Jelinek Date: Tue, 14 Feb 2012 23:34:34 +0000 (+0100) Subject: backport: re PR c/52181 (merge_decls doesn't handle DECL_USER_ALIGN properly) X-Git-Tag: releases/gcc-4.6.3~83 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=337d93e142a4f4702424aa930007e6f6dbf98477;p=thirdparty%2Fgcc.git backport: re PR c/52181 (merge_decls doesn't handle DECL_USER_ALIGN properly) Backported from mainline 2012-02-14 Jakub Jelinek PR c/52181 * c-decl.c (merge_decls): Copy DECL_USER_ALIGN bit from olddecl to newdecl. * decl.c (duplicate_decls): If olddecl has bigger DECL_ALIGN than newdecl, copy DECL_ALIGN to newdecl and or DECL_USER_ALIGN bits. * c-c++-common/pr52181.c: New test. From-SVN: r184242 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 48feadfadd0d..e458e08ac4eb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2012-02-14 Jakub Jelinek Backported from mainline + 2012-02-14 Jakub Jelinek + + PR c/52181 + * c-decl.c (merge_decls): Copy DECL_USER_ALIGN bit from olddecl to + newdecl. + 2012-02-13 Jakub Jelinek * cselib.c (dump_cselib_val): Don't assume l->setting_insn is diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b148f5e22f71..6d6331343290 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -2436,6 +2436,7 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) memcpy ((char *) olddecl + sizeof (struct tree_common), (char *) newdecl + sizeof (struct tree_common), sizeof (struct tree_decl_common) - sizeof (struct tree_common)); + DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl); switch (TREE_CODE (olddecl)) { case FUNCTION_DECL: diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 15e93a5ed804..4eb9ec48954e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2012-02-14 Jakub Jelinek + + Backported from mainline + 2012-02-14 Jakub Jelinek + + PR c/52181 + * decl.c (duplicate_decls): If olddecl has bigger DECL_ALIGN than + newdecl, copy DECL_ALIGN to newdecl and or DECL_USER_ALIGN bits. + 2012-02-09 Jakub Jelinek Backported from mainline diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index a2e52613fce9..6b6f158491eb 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2154,7 +2154,12 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) SET_DECL_INIT_PRIORITY (olddecl, DECL_INIT_PRIORITY (newdecl)); DECL_HAS_INIT_PRIORITY_P (olddecl) = 1; } - /* Likewise for DECL_USER_ALIGN and DECL_PACKED. */ + /* Likewise for DECL_ALIGN, DECL_USER_ALIGN and DECL_PACKED. */ + if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl)) + { + DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl); + DECL_USER_ALIGN (newdecl) |= DECL_USER_ALIGN (olddecl); + } DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl); if (TREE_CODE (newdecl) == FIELD_DECL) DECL_PACKED (olddecl) = DECL_PACKED (newdecl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6e546a003aa4..2e19a3d73d51 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2012-02-14 Jakub Jelinek + + Backported from mainline + 2012-02-14 Jakub Jelinek + + PR c/52181 + * c-c++-common/pr52181.c: New test. + 2012-02-09 Jakub Jelinek Backported from mainline diff --git a/gcc/testsuite/c-c++-common/pr52181.c b/gcc/testsuite/c-c++-common/pr52181.c new file mode 100644 index 000000000000..e09bc92fc6f9 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr52181.c @@ -0,0 +1,13 @@ +/* PR c/52181 */ +/* { dg-do compile } */ + +extern const int v1[]; +const int __attribute__((aligned(16))) v1[] = { 1 }; +extern const int __attribute__((aligned(16))) v2[]; +const int v2[] = { 1 }; +extern const int __attribute__((aligned(16))) v3[]; +const int __attribute__((aligned(16))) v3[] = { 1 }; +const int __attribute__((aligned(16))) v4[] = { 1 }; +int test[(__alignof__ (v4) != __alignof__ (v1) /* { dg-bogus "is negative" } */ + || __alignof__ (v4) != __alignof__ (v2) + || __alignof__ (v4) != __alignof__ (v3)) ? -1 : 0];