Bug 52181 - [4.7 Regression] merge_decls doesn't handle DECL_USER_ALIGN properly
Summary: [4.7 Regression] merge_decls doesn't handle DECL_USER_ALIGN properly
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 4.7.0
: P3 normal
Target Milestone: 4.7.0
Assignee: Jakub Jelinek
URL:
Keywords: wrong-code
Depends on:
Blocks:
 
Reported: 2012-02-09 08:30 UTC by Jakub Jelinek
Modified: 2012-02-14 23:34 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work: 4.6.3
Known to fail: 4.7.0
Last reconfirmed: 2012-02-09 00:00:00


Attachments
gcc47-pr52181.patch (829 bytes, patch)
2012-02-09 09:07 UTC, Jakub Jelinek
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Jakub Jelinek 2012-02-09 08:30:48 UTC
extern const int v1[];
const int __attribute__((aligned(16))) v1[] = { 0 };
extern const int __attribute__((aligned(16))) v2[];
const int v2[] = { 0 };
extern const int __attribute__((aligned(16))) v3[];
const int __attribute__((aligned(16))) v3[] = { 0 };
const int __attribute__((aligned(16))) v4[] = { 0 };
int test[(__alignof__ (v4) != __alignof__ (v1)/* { dg-bogus "is negative" } */
 || __alignof__ (v4) != __alignof__ (v2)
 || __alignof__ (v4) != __alignof__ (v3)) ? -1 : 0];

fails with gcc 4.7, worked with 4.6, but it looks like the actual bug is of an earlier date, when DECL_USER_ALIGN bit has been moved from tree_decl_common etc.
down into tree_base.
Comment 1 Jakub Jelinek 2012-02-09 09:07:20 UTC
Created attachment 26621 [details]
gcc47-pr52181.patch

Untested fix.  The testcase shows that the C++ FE has a similar bug, but in the other direction, when olddecl has aligned attribute and newdecl doesn't.
Comment 2 Ulrich Weigand 2012-02-09 18:33:12 UTC
The regression is present on tip of 4.6 branch as well, exposed by recent backports from mainline.
Comment 3 Jakub Jelinek 2012-02-14 06:15:42 UTC
Author: jakub
Date: Tue Feb 14 06:15:35 2012
New Revision: 184193

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=184193
Log:
	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.

Added:
    trunk/gcc/testsuite/c-c++-common/pr52181.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/c-decl.c
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/decl.c
    trunk/gcc/testsuite/ChangeLog
Comment 4 Jakub Jelinek 2012-02-14 09:47:59 UTC
Fixed.
Comment 5 Ulrich Weigand 2012-02-14 17:22:23 UTC
Thanks for the quick fix!  Are you planning to backport to 4.6 as well?
Comment 6 Jakub Jelinek 2012-02-14 23:34:40 UTC
Author: jakub
Date: Tue Feb 14 23:34:34 2012
New Revision: 184242

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=184242
Log:
	Backported from mainline
	2012-02-14  Jakub Jelinek  <jakub@redhat.com>

	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.

Added:
    branches/gcc-4_6-branch/gcc/testsuite/c-c++-common/pr52181.c
Modified:
    branches/gcc-4_6-branch/gcc/ChangeLog
    branches/gcc-4_6-branch/gcc/c-decl.c
    branches/gcc-4_6-branch/gcc/cp/ChangeLog
    branches/gcc-4_6-branch/gcc/cp/decl.c
    branches/gcc-4_6-branch/gcc/testsuite/ChangeLog