This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Fix alignment handling in build_cplus_array_type/cp_build_qualified_type_real (PR c++/65715)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: Jan Hubicka <hubicka at ucw dot cz>, gcc-patches at gcc dot gnu dot org
- Date: Thu, 9 Apr 2015 20:12:47 +0200
- Subject: [C++ PATCH] Fix alignment handling in build_cplus_array_type/cp_build_qualified_type_real (PR c++/65715)
- Authentication-results: sourceware.org; auth=none
- References: <20150408100239 dot GO19273 at tucnak dot redhat dot com> <20150409093856 dot GD19273 at tucnak dot redhat dot com> <552691E0 dot 8010801 at redhat dot com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Thu, Apr 09, 2015 at 10:51:12AM -0400, Jason Merrill wrote:
> On 04/09/2015 05:38 AM, Jakub Jelinek wrote:
> >Or supposedly no change at all, as the attributes would be either in
> >TYPE_ATTRIBUTES, or on TYPE_DECL, but then it would be covered by
> >the TYPE_NAME comparison.
>
> Interesting point. So maybe all we need to do here is copy
> TYPE_ALIGN/TYPE_USER_ALIGN, not change any of the tests.
The following is actually enough to fix this.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2015-04-09 Jakub Jelinek <jakub@redhat.com>
PR c++/65715
* tree.c (cp_build_qualified_type_real): Also copy
TYPE_ALIGN and TYPE_USER_ALIGN.
* c-c++-common/attr-aligned-2.c: New test.
--- gcc/cp/tree.c.jj 2015-04-09 17:05:02.331837692 +0200
+++ gcc/cp/tree.c 2015-04-09 17:15:25.216896052 +0200
@@ -1079,6 +1079,8 @@ cp_build_qualified_type_real (tree type,
{
t = build_variant_type_copy (t);
TYPE_NAME (t) = TYPE_NAME (type);
+ TYPE_ALIGN (t) = TYPE_ALIGN (type);
+ TYPE_USER_ALIGN (t) = TYPE_USER_ALIGN (type);
}
}
--- gcc/testsuite/c-c++-common/attr-aligned-2.c.jj 2015-04-09 17:13:26.327792252 +0200
+++ gcc/testsuite/c-c++-common/attr-aligned-2.c 2015-04-09 17:13:57.054300285 +0200
@@ -0,0 +1,18 @@
+/* PR c++/65715 */
+/* { dg-do run } */
+
+typedef double T[4][4] __attribute__((aligned (2 * __alignof__ (double))));
+void foo (const T);
+struct S { T s; };
+
+int
+main ()
+{
+ if (__alignof__ (const T) != 2 * __alignof__ (double))
+ __builtin_abort ();
+ return 0;
+}
+
+#if defined(__cplusplus) && __cplusplus >= 201103L
+static_assert (alignof (const T) == 2 * alignof (double), "alignment of const T");
+#endif
Jakub