From 387113816fdaa179abf1b9babfb11a421217dc10 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 14 Sep 2016 12:18:10 -0400 Subject: [PATCH] c-common.c (check_cxx_fundamental_alignment_constraints): Don't limit FIELD_DECL, either. * c-common.c (check_cxx_fundamental_alignment_constraints): Don't limit FIELD_DECL, either. From-SVN: r240139 --- gcc/c-family/ChangeLog | 5 ++++ gcc/c-family/c-common.c | 46 ++++++++----------------------- gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C | 9 ++++-- 3 files changed, 23 insertions(+), 37 deletions(-) diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index e1fa3b7..3258816 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2016-09-14 Jason Merrill + + * c-common.c (check_cxx_fundamental_alignment_constraints): Don't + limit FIELD_DECL, either. + 2016-09-14 Marek Polacek * c-common.c (c_common_truthvalue_conversion): Use false instead of 0. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index b561f9f..57b6671 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -7868,43 +7868,21 @@ check_cxx_fundamental_alignment_constraints (tree node, if (cxx_fundamental_alignment_p (requested_alignment)) return true; - if (DECL_P (node)) + if (VAR_P (node)) { if (TREE_STATIC (node)) - { - /* For file scope variables and static members, the target - supports alignments that are at most - MAX_OFILE_ALIGNMENT. */ - if (requested_alignment > (max_align = MAX_OFILE_ALIGNMENT)) - alignment_too_large_p = true; - } + /* For file scope variables and static members, the target supports + alignments that are at most MAX_OFILE_ALIGNMENT. */ + max_align = MAX_OFILE_ALIGNMENT; else - { -#ifdef BIGGEST_FIELD_ALIGNMENT -#define MAX_TARGET_FIELD_ALIGNMENT BIGGEST_FIELD_ALIGNMENT -#else -#define MAX_TARGET_FIELD_ALIGNMENT BIGGEST_ALIGNMENT -#endif - /* For non-static members, the target supports either - alignments that at most either BIGGEST_FIELD_ALIGNMENT - if it is defined or BIGGEST_ALIGNMENT. */ - max_align = MAX_TARGET_FIELD_ALIGNMENT; - if (TREE_CODE (node) == FIELD_DECL - && requested_alignment > (max_align = MAX_TARGET_FIELD_ALIGNMENT)) - alignment_too_large_p = true; -#undef MAX_TARGET_FIELD_ALIGNMENT - /* For stack variables, the target supports at most - MAX_STACK_ALIGNMENT. */ - else if (decl_function_context (node) != NULL - && requested_alignment > (max_align = MAX_STACK_ALIGNMENT)) - alignment_too_large_p = true; - } - } - else if (TYPE_P (node)) - { - /* Let's be liberal for types; don't limit their alignment any more than - check_user_alignment already did. */ - } + /* For stack variables, the target supports at most + MAX_STACK_ALIGNMENT. */ + max_align = MAX_STACK_ALIGNMENT; + if (requested_alignment > max_align) + alignment_too_large_p = true; + } + /* Let's be liberal for types and fields; don't limit their alignment any + more than check_user_alignment already did. */ if (alignment_too_large_p) pedwarn (input_location, OPT_Wattributes, diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C index 0f87fd4..ad7cffc 100644 --- a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C @@ -3,19 +3,22 @@ struct A {int i;} a [[gnu::aligned(16)]]; struct B {int i;} __attribute__((aligned(16))) b; +constexpr unsigned si = sizeof(int); +constexpr unsigned ai = alignof(int); + int main () { A aa; B bb; - static_assert (sizeof (a) == 4, "sizeof (a) should be 4"); + static_assert (sizeof (a) == si, "sizeof (a) should be 4"); static_assert (sizeof (b) == 16, "sizeof (b) should be 16"); - static_assert (sizeof (aa) == 4, "sizeof (aa) should be 4"); + static_assert (sizeof (aa) == si, "sizeof (aa) should be 4"); static_assert (sizeof (bb) == 16, "sizeof (bb) should be 16"); static_assert (__alignof__ (a) == 16, "alignof (a) should be 16"); static_assert (__alignof__ (b) == 16, "alignof (b) should be 16"); - static_assert (__alignof__ (aa) == 4, "alignof (aa) should be 4"); + static_assert (__alignof__ (aa) == ai, "alignof (aa) should be 4"); static_assert (__alignof__ (bb) == 16, "alignof (bb) should be 16"); } -- 2.7.4