It looks like this fixes PR14564. Does it also fix the case in PR14564 comment#1?<br><br><div class="gmail_quote">On Mon, Jul 15, 2013 at 5:21 PM, Eli Friedman <span dir="ltr"><<a href="mailto:eli.friedman@gmail.com" target="_blank">eli.friedman@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: efriedma<br>
Date: Mon Jul 15 19:21:28 2013<br>
New Revision: 186370<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=186370&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=186370&view=rev</a><br>
Log:<br>
Fix alignment of class derived from empty class.<br>
<br>
The record layout code didn't properly take into account that<br>
an empty class at offset 0 can have an alignment greater than 1.<br>
<br>
Patch by Andrea Di Biagio.<br>
<br>
Added:<br>
    cfe/trunk/test/SemaCXX/alignment-of-derived-class.cpp<br>
Modified:<br>
    cfe/trunk/lib/AST/RecordLayoutBuilder.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=186370&r1=186369&r2=186370&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=186370&r1=186369&r2=186370&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)<br>
+++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Mon Jul 15 19:21:28 2013<br>
@@ -1532,18 +1532,19 @@ CharUnits RecordLayoutBuilder::LayoutBas<br>
     }<br>
   }<br>
<br>
+  CharUnits UnpackedBaseAlign = Layout.getNonVirtualAlign();<br>
+  CharUnits BaseAlign = (Packed) ? CharUnits::One() : UnpackedBaseAlign;<br>
+<br>
   // If we have an empty base class, try to place it at offset 0.<br>
   if (Base->Class->isEmpty() &&<br>
       (!HasExternalLayout || Offset == CharUnits::Zero()) &&<br>
       EmptySubobjects->CanPlaceBaseAtOffset(Base, CharUnits::Zero())) {<br>
     setSize(std::max(getSize(), Layout.getSize()));<br>
+    UpdateAlignment(BaseAlign, UnpackedBaseAlign);<br>
<br>
     return CharUnits::Zero();<br>
   }<br>
<br>
-  CharUnits UnpackedBaseAlign = Layout.getNonVirtualAlign();<br>
-  CharUnits BaseAlign = (Packed) ? CharUnits::One() : UnpackedBaseAlign;<br>
-<br>
   // The maximum field alignment overrides base align.<br>
   if (!MaxFieldAlignment.isZero()) {<br>
     BaseAlign = std::min(BaseAlign, MaxFieldAlignment);<br>
<br>
Added: cfe/trunk/test/SemaCXX/alignment-of-derived-class.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/alignment-of-derived-class.cpp?rev=186370&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/alignment-of-derived-class.cpp?rev=186370&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/SemaCXX/alignment-of-derived-class.cpp (added)<br>
+++ cfe/trunk/test/SemaCXX/alignment-of-derived-class.cpp Mon Jul 15 19:21:28 2013<br>
@@ -0,0 +1,41 @@<br>
+// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11<br>
+// expected-no-diagnostics<br>
+<br>
+// Test that the alignment of a empty direct base class is correctly<br>
+// inherited by the derived class.<br>
+<br>
+struct A {<br>
+} __attribute__ ((aligned(16)));<br>
+<br>
+static_assert(__alignof(A) == 16, "A should be aligned to 16 bytes");<br>
+<br>
+struct B1 : public A {<br>
+};<br>
+<br>
+static_assert(__alignof(B1) == 16, "B1 should be aligned to 16 bytes");<br>
+<br>
+struct B2 : public A {<br>
+} __attribute__ ((aligned(2)));<br>
+<br>
+static_assert(__alignof(B2) == 16, "B2 should be aligned to 16 bytes");<br>
+<br>
+struct B3 : public A {<br>
+} __attribute__ ((aligned(4)));<br>
+<br>
+static_assert(__alignof(B3) == 16, "B3 should be aligned to 16 bytes");<br>
+<br>
+struct B4 : public A {<br>
+} __attribute__ ((aligned(8)));<br>
+<br>
+static_assert(__alignof(B4) == 16, "B4 should be aligned to 16 bytes");<br>
+<br>
+struct B5 : public A {<br>
+} __attribute__ ((aligned(16)));<br>
+<br>
+static_assert(__alignof(B5) == 16, "B5 should be aligned to 16 bytes");<br>
+<br>
+struct B6 : public A {<br>
+} __attribute__ ((aligned(32)));<br>
+<br>
+static_assert(__alignof(B6) == 32, "B6 should be aligned to 32 bytes");<br>
+<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br>