[cfe-commits] r169467 - in /cfe/trunk: lib/AST/ASTContext.cpp test/SemaCXX/empty-class-layout.cpp

Richard Smith richard-llvm at metafoo.co.uk
Wed Dec 5 19:04:50 PST 2012


Author: rsmith
Date: Wed Dec  5 21:04:50 2012
New Revision: 169467

URL: http://llvm.org/viewvc/llvm-project?rev=169467&view=rev
Log:
Don't use dyn_cast on a Type* which might not be canonical. Fixes an extremely obscure record layout bug.

Modified:
    cfe/trunk/lib/AST/ASTContext.cpp
    cfe/trunk/test/SemaCXX/empty-class-layout.cpp

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=169467&r1=169466&r2=169467&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Wed Dec  5 21:04:50 2012
@@ -3994,7 +3994,8 @@
   uint64_t ElementCount = 1;
   do {
     ElementCount *= CA->getSize().getZExtValue();
-    CA = dyn_cast<ConstantArrayType>(CA->getElementType());
+    CA = dyn_cast_or_null<ConstantArrayType>(
+      CA->getElementType()->getAsArrayTypeUnsafe());
   } while (CA);
   return ElementCount;
 }

Modified: cfe/trunk/test/SemaCXX/empty-class-layout.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/empty-class-layout.cpp?rev=169467&r1=169466&r2=169467&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/empty-class-layout.cpp (original)
+++ cfe/trunk/test/SemaCXX/empty-class-layout.cpp Wed Dec  5 21:04:50 2012
@@ -156,3 +156,18 @@
   };
   SA(0, sizeof(Test) == 2);
 }
+
+namespace Test8 {
+  // Test that type sugar doesn't make us incorrectly determine the size of an
+  // array of empty classes.
+  struct Empty1 {};
+  struct Empty2 {};
+  struct Empties : Empty1, Empty2 {};
+  typedef Empty1 Sugar[4];
+  struct A : Empty2, Empties {
+    // This must go at offset 2, because if it were at offset 0,
+    // V[0][1] would overlap Empties::Empty1.
+    Sugar V[1];
+  };
+  SA(0, sizeof(A) == 6);
+}





More information about the cfe-commits mailing list