c-common.c (check_cxx_fundamental_alignment_constraints): Don't limit FIELD_DECL...
authorJason Merrill <jason@redhat.com>
Wed, 14 Sep 2016 16:18:10 +0000 (12:18 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 14 Sep 2016 16:18:10 +0000 (12:18 -0400)
* c-common.c (check_cxx_fundamental_alignment_constraints): Don't
limit FIELD_DECL, either.

From-SVN: r240139

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/g++.dg/cpp0x/gen-attrs-52.C

index e1fa3b7..3258816 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-14  Jason Merrill  <jason@redhat.com>
+
+       * c-common.c (check_cxx_fundamental_alignment_constraints): Don't
+       limit FIELD_DECL, either.
+
 2016-09-14  Marek Polacek  <polacek@redhat.com>
 
        * c-common.c (c_common_truthvalue_conversion): Use false instead of 0.
index b561f9f..57b6671 100644 (file)
@@ -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,
index 0f87fd4..ad7cffc 100644 (file)
@@ -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");
 }