]> gcc.gnu.org Git - gcc.git/commitdiff
re PR c++/10179 (alignment attributes are not inherited correctly with empty classes)
authorJason Merrill <jason@redhat.com>
Fri, 28 Sep 2007 18:07:57 +0000 (14:07 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 28 Sep 2007 18:07:57 +0000 (14:07 -0400)
        PR c++/10179
        * class.c (layout_empty_base): Take rli parameter, update
        rli->record_align if empty base has user-specified alignment.
        (build_base_field): Pass rli to it.

From-SVN: r128871

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/g++.dg/ext/align2.C [new file with mode: 0644]

index 7d70e13d2d53439feb519d48573f51302603a8a2..44a4d901aa79a0b6e297585e431ac73618674f39 100644 (file)
@@ -1,3 +1,10 @@
+2007-09-28  Jason Merrill  <jason@redhat.com>
+
+       PR c++/10179
+       * class.c (layout_empty_base): Take rli parameter, update
+       rli->record_align if empty base has user-specified alignment.
+       (build_base_field): Pass rli to it.
+
 2007-09-28  Paolo Carlini  <pcarlini@suse.de>
 
        PR c++/33213
@@ -26,6 +33,7 @@
 
 2007-09-27  Jason Merrill  <jason@redhat.com>
 
+       PR c++/33571
        * decl2.c (is_late_template_attribute): Don't crash on unknown
        attribute.
 
index 5c3e0548044fd3f863e4a3ab5b3ff68af7aab148..4419813b6b6847c170124f9a7b9455fa32851ffa 100644 (file)
@@ -179,7 +179,7 @@ static void initialize_vtable (tree, tree);
 static void layout_nonempty_base_or_field (record_layout_info,
                                           tree, tree, splay_tree);
 static tree end_of_class (tree, int);
-static bool layout_empty_base (tree, tree, splay_tree);
+static bool layout_empty_base (record_layout_info, tree, tree, splay_tree);
 static void accumulate_vtbl_inits (tree, tree, tree, tree, tree);
 static tree dfs_accumulate_vtbl_inits (tree, tree, tree, tree,
                                               tree);
@@ -3517,7 +3517,8 @@ empty_base_at_nonzero_offset_p (tree type,
    type.  Return nonzero iff we added it at the end.  */
 
 static bool
-layout_empty_base (tree binfo, tree eoc, splay_tree offsets)
+layout_empty_base (record_layout_info rli, tree binfo,
+                  tree eoc, splay_tree offsets)
 {
   tree alignment;
   tree basetype = BINFO_TYPE (binfo);
@@ -3563,6 +3564,15 @@ layout_empty_base (tree binfo, tree eoc, splay_tree offsets)
          propagate_binfo_offsets (binfo, alignment);
        }
     }
+
+  if (CLASSTYPE_USER_ALIGN (basetype))
+    {
+      rli->record_align = MAX (rli->record_align, CLASSTYPE_ALIGN (basetype));
+      if (warn_packed)
+       rli->unpacked_align = MAX (rli->unpacked_align, CLASSTYPE_ALIGN (basetype));
+      TYPE_USER_ALIGN (rli->t) = 1;
+    }
+
   return atend;
 }
 
@@ -3626,7 +3636,7 @@ build_base_field (record_layout_info rli, tree binfo,
         byte-aligned.  */
       eoc = round_up (rli_size_unit_so_far (rli),
                      CLASSTYPE_ALIGN_UNIT (basetype));
-      atend = layout_empty_base (binfo, eoc, offsets);
+      atend = layout_empty_base (rli, binfo, eoc, offsets);
       /* A nearly-empty class "has no proper base class that is empty,
         not morally virtual, and at an offset other than zero."  */
       if (!BINFO_VIRTUAL_P (binfo) && CLASSTYPE_NEARLY_EMPTY_P (t))
diff --git a/gcc/testsuite/g++.dg/ext/align2.C b/gcc/testsuite/g++.dg/ext/align2.C
new file mode 100644 (file)
index 0000000..da54bd9
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/10179
+
+struct __attribute((aligned(__alignof(double)))) A
+{ /* empty */ };
+
+struct T : public A
+{
+  char c;
+};
+
+template<bool> struct StaticAssert;
+template<> struct StaticAssert<true> {};
+
+StaticAssert<__alignof(T) == __alignof(double)> d;
This page took 0.094131 seconds and 5 git commands to generate.