re PR c/52181 (merge_decls doesn't handle DECL_USER_ALIGN properly)

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: r184193
This commit is contained in:
Jakub Jelinek 2012-02-14 07:15:35 +01:00 committed by Jakub Jelinek
parent 1380aca7e6
commit 45f41865ff
6 changed files with 39 additions and 3 deletions

View file

@ -1,3 +1,9 @@
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.
2012-02-13 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/52172

View file

@ -1,6 +1,6 @@
/* Process declarations and variables for C compiler.
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc.
This file is part of GCC.
@ -2449,6 +2449,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:

View file

@ -1,3 +1,9 @@
2012-02-14 Jakub Jelinek <jakub@redhat.com>
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-07 Jason Merrill <jason@redhat.com>
PR c++/51675

View file

@ -1,6 +1,6 @@
/* Process declarations and variables for C++ compiler.
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com)
@ -2214,7 +2214,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);

View file

@ -1,3 +1,8 @@
2012-02-14 Jakub Jelinek <jakub@redhat.com>
PR c/52181
* c-c++-common/pr52181.c: New test.
2012-02-13 Jakub Jelinek <jakub@redhat.com>
PR c++/52215

View file

@ -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];